From 05ec91b151307b3ee032845622a8b5585e9f7f10 Mon Sep 17 00:00:00 2001 From: Hu Jin Date: Thu, 21 Sep 2023 08:37:28 +1000 Subject: [PATCH] release version 1.3.0 --- .github/ISSUE_TEMPLATE/bug_report.md | 12 +- .gitignore | 5 + CHANGELOG.md | 15 + README.md | 2 +- THIRDPARTY_LICENSES.txt | 2336 ++-- .../images/solution_architecture_diagram.png | Bin 170483 -> 191655 bytes source/package.json | 35 +- source/packages/@ada/api/package.json | 4 +- source/packages/@ada/api/spec.yaml | 197 +- source/packages/@ada/cdk-core/package.json | 4 +- .../cdk-core/src/input-parameters/index.ts | 15 +- source/packages/@ada/common/package.json | 2 +- source/packages/@ada/infra/package.json | 10 +- .../src/common/aspects/app-registry/index.ts | 2 + .../constructs/api/federated-api/decorator.ts | 52 +- .../constructs/deployment-metrics/handler.ts | 4 +- .../src/common/constructs/iam/policies.ts | 6 + .../secret-manager/secret-manager-store.ts | 12 +- .../testing/default-entities/data-product.ts | 7 + .../environment/build-cdk-environment.ts | 12 +- .../@ada/infra/src/common/utils/metrics.ts | 8 +- .../connectors/common/amazon/base-stack.ts | 16 +- .../base-esc-runner-state-machine/index.ts | 11 +- .../common/common/docker-image/Dockerfile | 4 +- .../connectors/common/google/base-stack.ts | 7 +- .../src/connectors/common/jdbc/base-stack.ts | 7 +- .../infra/src/connectors/sources/__init__.py | 4 + .../sources/amazon_cloudtrail/constants.ts | 2 +- .../amazon_cloudtrail/docker-image/import.py | 2 +- .../sources/amazon_cloudtrail/index.ts | 2 +- .../dynamic/__snapshots__/stack.test.ts.snap | 88 +- .../sources/amazon_cloudwatch/constants.ts | 4 +- .../dynamic/__snapshots__/stack.test.ts.snap | 88 +- .../dynamic/__snapshots__/stack.test.ts.snap | 87 +- .../dynamic/__snapshots__/stack.test.ts.snap | 88 +- .../amazon_kinesis/infra/dynamic/stack.ts | 7 +- .../sources/amazon_redshift/__init__.py | 4 + .../sources/amazon_redshift/constants.ts | 14 + .../amazon_redshift/docker-image/Dockerfile | 7 + .../amazon_redshift/docker-image/__init__.py | 4 + .../docker-image/redshift_data_import.py | 244 + .../docker-image/requirements.txt | 2 + .../amazon_redshift/docker-image/script.sh | 9 + .../docker-image/test_redshift_data_import.py | 368 + .../sources/amazon_redshift/index.ts | 330 + .../dynamic/__snapshots__/stack.test.ts.snap | 762 ++ .../infra/dynamic/stack.test.ts | 114 + .../amazon_redshift/infra/dynamic/stack.ts | 59 + .../sources/amazon_redshift/infra/register.ts | 33 + .../static/import-data-state-machine/index.ts | 80 + .../amazon_redshift/infra/static/index.ts | 112 + .../amazon_redshift/preview/__init__.py | 10 + .../preview/__test__/__init__.py | 4 + .../preview/__test__/test_pull_samples.py | 93 + .../amazon_redshift/preview/pull_samples.py | 114 + .../dynamic/__snapshots__/stack.test.ts.snap | 8 +- .../sources/amazon_s3/infra/dynamic/stack.ts | 33 +- .../file_upload/infra/dynamic/stack.ts | 8 +- .../dynamic/__snapshots__/stack.test.ts.snap | 87 +- .../google_bigquery/docker-image/script.sh | 4 + .../dynamic/__snapshots__/stack.test.ts.snap | 87 +- .../dynamic/__snapshots__/stack.test.ts.snap | 87 +- .../infra/src/connectors/sources/index.ts | 4 + .../connectors/sources/jdbc_mysql5/index.ts | 2 +- .../dynamic/__snapshots__/stack.test.ts.snap | 8 +- .../sources/jdbc_oracle/__init__.py | 4 + .../sources/jdbc_oracle/constants.ts | 16 + .../connectors/sources/jdbc_oracle/index.ts | 275 + .../dynamic/__snapshots__/stack.test.ts.snap | 820 ++ .../jdbc_oracle/infra/dynamic/stack.test.ts | 91 + .../jdbc_oracle/infra/dynamic/stack.ts | 22 + .../sources/jdbc_oracle/infra/register.ts | 20 + .../sources/jdbc_oracle/infra/static/index.ts | 15 + .../sources/jdbc_oracle/preview/__init__.py | 10 + .../jdbc_oracle/preview/pull_samples.py | 53 + .../sources/jdbc_postgresql/index.ts | 2 +- .../dynamic/__snapshots__/stack.test.ts.snap | 8 +- .../sources/jdbc_sqlserver/index.ts | 2 +- .../dynamic/__snapshots__/stack.test.ts.snap | 8 +- .../connectors/sources/mongodb/constants.ts | 2 +- .../src/connectors/sources/mongodb/index.ts | 4 +- .../dynamic/__snapshots__/stack.test.ts.snap | 87 +- .../sources/mongodb/preview/pull_samples.py | 33 +- .../src/connectors/sources/register-infra.ts | 2 + .../cognito-auth-stack.test.ts.snap | 2 +- .../__snapshots__/common-stack.test.ts.snap | 34 +- .../__snapshots__/kms-stack.test.ts.snap | 2 +- .../static-website-stack.test.ts.snap | 15 +- .../start-tear-down-destroy-data.test.ts | 12 +- .../start-tear-down-retain-data.test.ts | 12 +- .../administration/api/handlers/tear-down.ts | 6 +- .../administration/jest-dynamodb-config.ts | 20 +- .../stack/__snapshots__/index.test.ts.snap | 106 +- .../handlers/api-access-policy/put-policy.ts | 27 +- .../stack/__snapshots__/index.test.ts.snap | 1020 +- .../infra/src/services/api/stack/index.ts | 20 +- .../__tests__/build-data-product.test.ts | 2 +- .../__tests__/post-data-product.test.ts | 19 +- .../__tests__/put-data-protuct.test.ts | 12 +- .../api/handlers/build-data-product.ts | 6 +- .../data-product/api/handlers/put-script.ts | 9 +- .../crawler-poller-state-machine/index.ts | 14 +- .../creation-state-machine/index.ts | 5 +- ...tart-data-product-infra-deployment.test.ts | 11 +- .../package.json | 25 +- .../yarn.lock | 607 +- .../schema-preview/docker-image/Dockerfile | 6 +- .../docker-image/handlers/sampling/common.py | 5 +- .../schema-preview/docker-image/poetry.lock | 228 +- .../docker-image/pyproject.toml | 11 +- .../components/schema-preview/index.ts | 26 +- .../dynamic-infrastructure/cdk.ts | 144 +- .../glue/transform-jobs-and-crawlers.ts | 11 + .../arbitrary-transform-loop.ts | 2 + .../dynamic-infrastructure-stack-base.ts | 15 +- .../__snapshots__/api-stack.test.ts.snap | 11400 ++++------------ ...uilt-in-transformation-statck.test.ts.snap | 4 +- .../stack/__snapshots__/index.test.ts.snap | 12 +- .../schema-preview-stack.test.ts.snap | 309 +- .../static-infrastructure-stack.test.ts.snap | 2465 ++-- .../components/ddb/attribute-policy-store.ts | 27 +- .../ddb/attribute-value-policy-store.ts | 37 +- ...elete-attribute-value-policy-batch.test.ts | 116 + ...t-attribute-policies-for-attribute.test.ts | 60 + ...ibute-value-policies-for-attribute.test.ts | 90 + .../delete-attribute-value-policy-batch.ts | 38 + .../get-attribute-policies-for-attribute.ts | 32 + ...-attribute-value-policies-for-attribute.ts | 32 + .../src/services/governance/api/index.ts | 78 +- .../stack/__snapshots__/index.test.ts.snap | 8179 +++++------ .../identity/api/handlers/put-group.ts | 7 +- .../stack/__snapshots__/index.test.ts.snap | 7071 ++-------- .../stack/__snapshots__/index.test.ts.snap | 548 +- .../handlers/__tests__/put-ontology.test.ts | 7 +- .../ontology/api/handlers/put-ontology.ts | 8 +- .../stack/__snapshots__/index.test.ts.snap | 999 +- .../stack/__snapshots__/index.test.ts.snap | 113 +- .../index.ts | 22 +- .../start-athena-query-execution.test.ts | 6 +- .../stack/__snapshots__/index.test.ts.snap | 4337 +----- .../__snapshots__/ada-stack.test.ts.snap | 57 +- .../@ada/infra/src/stacks/ada-stack.ts | 5 +- source/packages/@ada/solution/package.json | 6 +- .../dictionary/en/views/view/governance.ts | 2 + .../@ada/transforms/src/transforms/index.ts | 12 +- source/packages/@ada/website/package.json | 4 +- .../puppeteer/__tests__/sanity.test.ts | 1 + .../common/components/CodeEditor/index.tsx | 12 +- .../components/GovernanceEditCard.tsx | 56 + .../components/SearchCustomGroups.tsx | 60 + .../GovernanceEdit/index.tsx | 82 + .../form-renderer/custom-components/index.ts | 5 + .../common/entity/access-request/index.tsx | 11 +- .../src/connectors/icons/icon_redshift.svg | 1 + .../website/src/connectors/icons/index.tsx | 4 + .../core/provider/AmplifyProvider.test.tsx | 1 + .../src/core/provider/AmplifyProvider.tsx | 4 +- .../northstar-plus/components/Modal/index.tsx | 15 +- .../layouts/AppLayout/components/help.tsx | 8 +- .../NotificationProvider/provider.tsx | 9 +- .../@ada/website/src/runtime-config.ts | 2 + .../@ada/website/src/testing/user-event.tsx | 32 + .../schema/SchemaRenderer/context.tsx | 25 +- .../context/DataProductContext.tsx | 18 +- .../__tests__/source-type/cloudwatch.test.tsx | 2 +- .../__tests__/source-type/dynamodb.test.tsx | 2 +- .../__tests__/source-type/oracle.stories.tsx | 122 + .../__tests__/source-type/oracle.test.tsx | 33 + .../source-type/redshift.stories.tsx | 127 + .../__tests__/source-type/redshift.test.tsx | 41 + .../components/TransformsPlanner/context.tsx | 13 +- .../views/governance/components/Summary.tsx | 73 +- .../views/governance/components/Wizard.tsx | 370 +- .../src/views/governance/hooks/index.tsx | 64 +- .../governance/utils/getSortedGroupArray.ts | 24 + .../governance/views/Create/index.stories.tsx | 22 +- .../governance/views/Update/index.stories.tsx | 43 +- .../governance/views/Update/index.test.tsx | 82 +- .../components/QueryWorkbench/context.tsx | 8 +- source/scripts/check-licenses.ts | 3 +- source/yarn.lock | 3408 +++-- 181 files changed, 19844 insertions(+), 30778 deletions(-) create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/__init__.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/constants.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/Dockerfile create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/__init__.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/redshift_data_import.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/requirements.txt create mode 100755 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/script.sh create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/test_redshift_data_import.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/index.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/__snapshots__/stack.test.ts.snap create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.test.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/register.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/import-data-state-machine/index.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/index.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__init__.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/__init__.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/test_pull_samples.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/pull_samples.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/__init__.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/constants.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/index.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/__snapshots__/stack.test.ts.snap create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.test.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/register.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/static/index.ts create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/__init__.py create mode 100644 source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/pull_samples.py create mode 100644 source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/delete-attribute-value-policy-batch.test.ts create mode 100644 source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-policies-for-attribute.test.ts create mode 100644 source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-value-policies-for-attribute.test.ts create mode 100644 source/packages/@ada/infra/src/services/governance/api/handlers/delete-attribute-value-policy-batch.ts create mode 100644 source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-policies-for-attribute.ts create mode 100644 source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-value-policies-for-attribute.ts create mode 100644 source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/components/GovernanceEditCard.tsx create mode 100644 source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/components/SearchCustomGroups.tsx create mode 100644 source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/index.tsx create mode 100644 source/packages/@ada/website/src/connectors/icons/icon_redshift.svg create mode 100644 source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.stories.tsx create mode 100644 source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.test.tsx create mode 100644 source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.stories.tsx create mode 100644 source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.test.tsx create mode 100644 source/packages/@ada/website/src/views/governance/utils/getSortedGroupArray.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7233e10..ac6886d 100755 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,10 +1,9 @@ --- name: Bug report about: Create a report to help us improve -title: '' +title: "" labels: bug -assignees: '' - +assignees: "" --- **Describe the bug** @@ -17,16 +16,17 @@ Steps to reproduce the behavior. A clear and concise description of what you expected to happen. **Please complete the following information about the solution:** -- [ ] Version: [e.g. v1.0.0] -To get the version of the solution, you can look at the description of the created CloudFormation stack. For example, "_(SO0021) - Video On Demand workflow with AWS Step Functions, MediaConvert, MediaPackage, S3, CloudFront and DynamoDB. Version **v5.0.0**_". If the description does not contain the version information, you can look at the mappings section of the template: +- [ ] Version: [e.g. v1.3.0] + +To get the version of the solution, you can look at the description of the created CloudFormation stack. For example, "_(SO0190) - Automated Data Analytics on AWS. Version v1.2.0_". If the description does not contain the version information, you can look at the mappings section of the template: ```yaml Mappings: SourceCode: General: S3Bucket: "solutions" - KeyPrefix: "video-on-demand-on-aws/v5.0.0" + KeyPrefix: "automated-data-analytics-on-aws/v1.3.0" ``` - [ ] Region: [e.g. us-east-1] diff --git a/.gitignore b/.gitignore index 2967315..0bd9f23 100755 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ node_modules .eslintcache .local .scannerwork +.venv +ada.log **/.jest.test-cdk-environment.js* @@ -95,3 +97,6 @@ source/packages/@ada/infra/src/services/data-product/components/schema-preview/d # temporary files source/packages/@ada/infra/src/common/constructs/api/lambda-layer/code/nodejs/api-client-lambda/jwt-signer/index.ts source/packages/@ada/infra/src/common/constructs/api/lambda-layer/code/nodejs/api-client-lambda/jwt-signer/version.json + +# pipenv +**/Pipfile diff --git a/CHANGELOG.md b/CHANGELOG.md index a7d58a3..11aa6ec 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.0] - 2023-09-15 + +### Added + +- New added Oracle DB Connector +- New added RedShift Connector +- New added Customer groups support in Governance Settings + +### Changed + +- Fix BigQuery and Goggle Analytics connector issue +- Fix security vulnerabilities found by yarn audit and Dependabot +- Misc bug fixes +- Misc documentation fixes + ## [1.2.0] - 2023-04-11 ### Added diff --git a/README.md b/README.md index de6b370..59792ec 100755 --- a/README.md +++ b/README.md @@ -203,7 +203,7 @@ To uninstall the solution from AWS CloudFormation console: ## Collection of operational metrics -This solution collects anonymous operational metrics to help AWS improve the quality of features of the solution. For more information, including how to disable this capability, refer to the [implementation guide](https://docs.aws.amazon.com/solutions/latest/automated-data-analytics-on-aws/collection-of-operational-metrics.html). +This solution collects anonymized operational metrics to help AWS improve the quality of features of the solution. For more information, including how to disable this capability, refer to the [implementation guide](https://docs.aws.amazon.com/solutions/latest/automated-data-analytics-on-aws/collection-of-operational-metrics.html). --- diff --git a/THIRDPARTY_LICENSES.txt b/THIRDPARTY_LICENSES.txt index 7797583..0d6edbd 100644 --- a/THIRDPARTY_LICENSES.txt +++ b/THIRDPARTY_LICENSES.txt @@ -2,7 +2,7 @@ THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY B ----- -The following software may be included in this product: @aws-amplify/analytics, @aws-amplify/api, @aws-amplify/api-graphql, @aws-amplify/api-rest, @aws-amplify/auth, @aws-amplify/cache, @aws-amplify/core, @aws-amplify/datastore, @aws-amplify/geo, @aws-amplify/interactions, @aws-amplify/predictions, @aws-amplify/pubsub, @aws-amplify/storage, @aws-amplify/ui, @aws-amplify/ui-react, @aws-amplify/xr. A copy of the source code may be downloaded from https://github.com/aws-amplify/amplify-js.git (@aws-amplify/analytics), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/api), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/api-graphql), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/api-rest), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/auth), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/cache), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/core), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/datastore), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/geo), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/interactions), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/predictions), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/pubsub), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/storage), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/ui-react), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/xr). This software contains the following license and notice below: +The following software may be included in this product: @aws-amplify/analytics, @aws-amplify/api, @aws-amplify/api-graphql, @aws-amplify/api-rest, @aws-amplify/auth, @aws-amplify/cache, @aws-amplify/core, @aws-amplify/datastore, @aws-amplify/geo, @aws-amplify/interactions, @aws-amplify/notifications, @aws-amplify/predictions, @aws-amplify/pubsub, @aws-amplify/rtn-push-notification, @aws-amplify/storage, @aws-amplify/ui-react. A copy of the source code may be downloaded from https://github.com/aws-amplify/amplify-js.git (@aws-amplify/analytics), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/api), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/api-graphql), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/api-rest), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/auth), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/cache), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/core), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/datastore), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/geo), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/interactions), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/notifications), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/predictions), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/pubsub), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/rtn-push-notification), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/storage), https://github.com/aws-amplify/amplify-js.git (@aws-amplify/ui-react). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -1455,7 +1455,7 @@ Apache License ----- -The following software may be included in this product: @aws-sdk/abort-controller, @aws-sdk/chunked-blob-reader, @aws-sdk/chunked-blob-reader-native, @aws-sdk/config-resolver, @aws-sdk/credential-provider-env, @aws-sdk/credential-provider-imds, @aws-sdk/credential-provider-ini, @aws-sdk/credential-provider-node, @aws-sdk/fetch-http-handler, @aws-sdk/hash-blob-browser, @aws-sdk/hash-node, @aws-sdk/hash-stream-node, @aws-sdk/is-array-buffer, @aws-sdk/md5-js, @aws-sdk/middleware-content-length, @aws-sdk/middleware-signing, @aws-sdk/middleware-stack, @aws-sdk/node-http-handler, @aws-sdk/property-provider, @aws-sdk/shared-ini-file-loader, @aws-sdk/signature-v4, @aws-sdk/types, @aws-sdk/util-arn-parser, @aws-sdk/util-base64-browser, @aws-sdk/util-base64-node, @aws-sdk/util-body-length-browser, @aws-sdk/util-body-length-node, @aws-sdk/util-buffer-from, @aws-sdk/util-format-url, @aws-sdk/util-hex-encoding, @aws-sdk/util-locate-window, @aws-sdk/util-uri-escape, @aws-sdk/util-utf8-browser, @aws-sdk/util-utf8-node, @aws-sdk/util-waiter, @aws-sdk/xml-builder. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/abort-controller), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/chunked-blob-reader), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/chunked-blob-reader-native), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/config-resolver), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-env), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-imds), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-ini), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/fetch-http-handler), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/hash-blob-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/hash-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/hash-stream-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/is-array-buffer), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/md5-js), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-content-length), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-signing), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-stack), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/node-http-handler), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/property-provider), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/shared-ini-file-loader), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/signature-v4), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/types), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-arn-parser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-base64-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-base64-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-body-length-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-body-length-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-buffer-from), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-format-url), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-hex-encoding), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-locate-window), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-uri-escape), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-utf8-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-utf8-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-waiter), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/xml-builder). This software contains the following license and notice below: +The following software may be included in this product: @aws-sdk/abort-controller, @aws-sdk/config-resolver, @aws-sdk/credential-provider-env, @aws-sdk/credential-provider-imds, @aws-sdk/credential-provider-ini, @aws-sdk/credential-provider-node, @aws-sdk/fetch-http-handler, @aws-sdk/hash-node, @aws-sdk/is-array-buffer, @aws-sdk/md5-js, @aws-sdk/middleware-content-length, @aws-sdk/middleware-signing, @aws-sdk/middleware-stack, @aws-sdk/node-http-handler, @aws-sdk/property-provider, @aws-sdk/shared-ini-file-loader, @aws-sdk/signature-v4, @aws-sdk/types, @aws-sdk/util-arn-parser, @aws-sdk/util-base64-browser, @aws-sdk/util-base64-node, @aws-sdk/util-body-length-browser, @aws-sdk/util-body-length-node, @aws-sdk/util-buffer-from, @aws-sdk/util-hex-encoding, @aws-sdk/util-locate-window, @aws-sdk/util-uri-escape, @aws-sdk/util-utf8-browser, @aws-sdk/util-utf8-node, @aws-sdk/util-waiter, @smithy/is-array-buffer, @smithy/signature-v4, @smithy/util-buffer-from, @smithy/util-hex-encoding, @smithy/util-uri-escape, @smithy/util-utf8. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/abort-controller), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/config-resolver), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-env), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-imds), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-ini), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/fetch-http-handler), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/hash-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/is-array-buffer), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/md5-js), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-content-length), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-signing), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-stack), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/node-http-handler), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/property-provider), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/shared-ini-file-loader), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/signature-v4), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/types), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-arn-parser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-base64-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-base64-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-body-length-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-body-length-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-buffer-from), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-hex-encoding), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-locate-window), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-uri-escape), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-utf8-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-utf8-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-waiter), https://github.com/awslabs/smithy-typescript.git (@smithy/is-array-buffer), https://github.com/awslabs/smithy-typescript.git (@smithy/signature-v4), https://github.com/awslabs/smithy-typescript.git (@smithy/util-buffer-from), https://github.com/awslabs/smithy-typescript.git (@smithy/util-hex-encoding), https://github.com/awslabs/smithy-typescript.git (@smithy/util-uri-escape), https://github.com/awslabs/smithy-typescript.git (@smithy/util-utf8). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -1661,7 +1661,7 @@ Apache License ----- -The following software may be included in this product: @aws-sdk/client-cloudwatch-logs, @aws-sdk/client-cognito-identity, @aws-sdk/client-comprehend, @aws-sdk/client-firehose, @aws-sdk/client-kinesis, @aws-sdk/client-lex-runtime-service, @aws-sdk/client-personalize-events, @aws-sdk/client-pinpoint, @aws-sdk/client-polly, @aws-sdk/client-rekognition, @aws-sdk/client-s3, @aws-sdk/client-sso, @aws-sdk/client-sts, @aws-sdk/client-textract, @aws-sdk/client-translate, @aws-sdk/credential-provider-cognito-identity, @aws-sdk/eventstream-marshaller, @aws-sdk/middleware-apply-body-checksum, @aws-sdk/middleware-bucket-endpoint, @aws-sdk/middleware-expect-continue, @aws-sdk/middleware-header-default, @aws-sdk/middleware-location-constraint, @aws-sdk/middleware-retry, @aws-sdk/middleware-sdk-sts, @aws-sdk/middleware-ssec, @aws-sdk/querystring-builder, @aws-sdk/querystring-parser, @aws-sdk/service-error-classification, @aws-sdk/url-parser, @aws-sdk/url-parser-native, @aws-sdk/util-user-agent-browser, @aws-sdk/util-user-agent-node. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-cloudwatch-logs), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-cognito-identity), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-comprehend), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-firehose), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-kinesis), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-lex-runtime-service), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-personalize-events), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-pinpoint), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-polly), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-rekognition), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-s3), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-sso), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-sts), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-textract), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-translate), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/credential-provider-cognito-identity), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-marshaller), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-apply-body-checksum), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-bucket-endpoint), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-expect-continue), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-header-default), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-location-constraint), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-retry), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-sdk-sts), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-ssec), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/querystring-builder), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/querystring-parser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/service-error-classification), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/url-parser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/url-parser-native), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-user-agent-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-user-agent-node). This software contains the following license and notice below: +The following software may be included in this product: @aws-sdk/client-cloudwatch-logs, @aws-sdk/client-comprehend, @aws-sdk/client-firehose, @aws-sdk/client-kinesis, @aws-sdk/client-lex-runtime-service, @aws-sdk/client-personalize-events, @aws-sdk/client-polly, @aws-sdk/client-rekognition, @aws-sdk/client-sso, @aws-sdk/client-sts, @aws-sdk/client-textract, @aws-sdk/client-translate, @aws-sdk/eventstream-codec, @aws-sdk/eventstream-marshaller, @aws-sdk/middleware-eventstream, @aws-sdk/middleware-retry, @aws-sdk/middleware-sdk-sts, @aws-sdk/querystring-builder, @aws-sdk/querystring-parser, @aws-sdk/service-error-classification, @aws-sdk/url-parser, @aws-sdk/url-parser-native, @aws-sdk/util-defaults-mode-browser, @aws-sdk/util-defaults-mode-node, @aws-sdk/util-user-agent-browser, @aws-sdk/util-user-agent-node, @smithy/eventstream-codec. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-cloudwatch-logs), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-comprehend), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-firehose), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-kinesis), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-lex-runtime-service), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-personalize-events), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-polly), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-rekognition), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-sso), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-sts), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-textract), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-translate), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-codec), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-marshaller), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-eventstream), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-retry), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-sdk-sts), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/querystring-builder), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/querystring-parser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/service-error-classification), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/url-parser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/url-parser-native), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-defaults-mode-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-defaults-mode-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-user-agent-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-user-agent-node), https://github.com/awslabs/smithy-typescript.git (@smithy/eventstream-codec). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -1867,7 +1867,7 @@ Apache License ----- -The following software may be included in this product: @aws-sdk/client-location. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git. This software contains the following license and notice below: +The following software may be included in this product: @aws-sdk/client-lex-runtime-v2, @aws-sdk/client-location. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-lex-runtime-v2), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/client-location). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -2279,7 +2279,7 @@ Apache License ----- -The following software may be included in this product: @aws-sdk/eventstream-serde-browser, @aws-sdk/eventstream-serde-config-resolver, @aws-sdk/eventstream-serde-node, @aws-sdk/eventstream-serde-universal, @aws-sdk/invalid-dependency, @aws-sdk/middleware-host-header, @aws-sdk/middleware-sdk-s3, @aws-sdk/middleware-serde, @aws-sdk/middleware-user-agent, @aws-sdk/protocol-http, @aws-sdk/s3-request-presigner, @aws-sdk/smithy-client, @aws-sdk/util-create-request. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-config-resolver), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-universal), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/invalid-dependency), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-host-header), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-sdk-s3), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-serde), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-user-agent), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/protocol-http), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/s3-request-presigner), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/smithy-client), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-create-request). This software contains the following license and notice below: +The following software may be included in this product: @aws-sdk/eventstream-handler-node, @aws-sdk/eventstream-serde-browser, @aws-sdk/eventstream-serde-config-resolver, @aws-sdk/eventstream-serde-node, @aws-sdk/eventstream-serde-universal, @aws-sdk/invalid-dependency, @aws-sdk/middleware-host-header, @aws-sdk/middleware-recursion-detection, @aws-sdk/middleware-serde, @aws-sdk/middleware-user-agent, @aws-sdk/protocol-http, @aws-sdk/smithy-client, @smithy/types. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-handler-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-browser), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-config-resolver), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-node), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/eventstream-serde-universal), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/invalid-dependency), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-host-header), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-recursion-detection), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-serde), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/middleware-user-agent), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/protocol-http), https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/smithy-client), https://github.com/awslabs/smithy-typescript.git (@smithy/types). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -2691,7 +2691,7 @@ Apache License ----- -The following software may be included in this product: @aws-sdk/util-credentials. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git. This software contains the following license and notice below: +The following software may be included in this product: @aws-sdk/util-middleware, @smithy/util-middleware. A copy of the source code may be downloaded from https://github.com/aws/aws-sdk-js-v3.git (@aws-sdk/util-middleware), https://github.com/awslabs/smithy-typescript.git (@smithy/util-middleware). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -3134,6 +3134,66 @@ DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: @cypress/request, aws-sign2, forever-agent, tunnel-agent. A copy of the source code may be downloaded from https://github.com/cypress-io/request.git (@cypress/request), https://github.com/mikeal/aws-sign (aws-sign2), https://github.com/mikeal/forever-agent (forever-agent), https://github.com/mikeal/tunnel-agent (tunnel-agent). This software contains the following license and notice below: + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +----- + The following software may be included in this product: @date-io/core, @date-io/date-fns. A copy of the source code may be downloaded from https://github.com/dmtrKovalenko/date-io (@date-io/core), https://github.com/dmtrKovalenko/date-io (@date-io/date-fns). This software contains the following license and notice below: MIT License @@ -3508,542 +3568,299 @@ Apache License ----- -The following software may be included in this product: @sinonjs/commons. A copy of the source code may be downloaded from git+https://github.com/sinonjs/commons.git. This software contains the following license and notice below: - -BSD 3-Clause License - -Copyright (c) 2018, Sinon.JS -All rights reserved. +The following software may be included in this product: @turf/boolean-clockwise, @turf/helpers, @turf/invariant. A copy of the source code may be downloaded from git://github.com/Turfjs/turf.git (@turf/boolean-clockwise), git://github.com/Turfjs/turf.git (@turf/helpers), git://github.com/Turfjs/turf.git (@turf/invariant). This software contains the following license and notice below: -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +The MIT License (MIT) -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Copyright (c) 2017 TurfJS -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: @sinonjs/formatio. A copy of the source code may be downloaded from https://github.com/sinonjs/formatio.git. This software contains the following license and notice below: +The following software may be included in this product: @types/aws-lambda, @types/body-parser, @types/cls-hooked, @types/connect, @types/d3-color, @types/d3-interpolate, @types/d3-path, @types/d3-scale, @types/d3-shape, @types/d3-time, @types/debug, @types/express, @types/express-serve-static-core, @types/hast, @types/json-schema, @types/mdast, @types/mime, @types/mysql, @types/node, @types/node-fetch, @types/parse5, @types/pg, @types/prop-types, @types/qs, @types/range-parser, @types/react, @types/react-redux, @types/react-table, @types/react-transition-group, @types/resize-observer-browser, @types/scheduler, @types/serve-static, @types/styled-jsx, @types/unist, @types/uuid. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/aws-lambda), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/body-parser), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/cls-hooked), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/connect), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-color), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-interpolate), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-path), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-scale), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-shape), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-time), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/debug), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/express), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/express-serve-static-core), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/hast), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/json-schema), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mdast), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mime), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mysql), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node-fetch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/parse5), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/pg), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/prop-types), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/qs), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/range-parser), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-redux), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-table), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-transition-group), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/resize-observer-browser), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/scheduler), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/serve-static), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/styled-jsx), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/unist), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/uuid). This software contains the following license and notice below: -(The BSD License) +MIT License -Copyright (c) 2010-2012, Christian Johansen (christian@cjohansen.no) and -August Lilleaas (august.lilleaas@gmail.com). All rights reserved. + Copyright (c) Microsoft Corporation. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Christian Johansen nor the names of his contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE ----- -The following software may be included in this product: @sinonjs/samsam. A copy of the source code may be downloaded from https://github.com/sinonjs/samsam.git. This software contains the following license and notice below: +The following software may be included in this product: @types/cookie, @types/hoist-non-react-statics, @types/mdurl, @types/ms. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/cookie), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/hoist-non-react-statics), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mdurl), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/ms). This software contains the following license and notice below: -(The BSD License) +MIT License -Copyright (c) 2010-2012, Christian Johansen, christian@cjohansen.no and -August Lilleaas, august.lilleaas@gmail.com. All rights reserved. + Copyright (c) Microsoft Corporation. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Christian Johansen nor the names of his contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE ----- -The following software may be included in this product: @sinonjs/text-encoding. A copy of the source code may be downloaded from https://github.com/inexorabletash/text-encoding.git. This software contains the following license and notice below: - -The encoding indexes, algorithms, and many comments in the code -derive from the Encoding Standard https://encoding.spec.whatwg.org/ - -Otherwise, the code of this repository is released under the Unlicense -license and is also dual-licensed under an Apache 2.0 license. Both -are included below. +The following software may be included in this product: accepts, mime-types. A copy of the source code may be downloaded from https://github.com/jshttp/accepts.git (accepts), https://github.com/jshttp/mime-types.git (mime-types). This software contains the following license and notice below: -# Unlicense +(The MIT License) -This is free and unencumbered software released into the public domain. +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -For more information, please refer to +----- -# Apache 2.0 License +The following software may be included in this product: ace-builds. A copy of the source code may be downloaded from https://github.com/ajaxorg/ace-builds.git. This software contains the following license and notice below: - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) 2010, Ajax.org B.V. +All rights reserved. - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ajax.org B.V. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. - 1. Definitions. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +----- - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +The following software may be included in this product: acorn, acorn-walk. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git (acorn), https://github.com/acornjs/acorn.git (acorn-walk). This software contains the following license and notice below: - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +MIT License - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +Copyright (C) 2012-2020 by various contributors (see AUTHORS) - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +----- - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +The following software may be included in this product: ajv. A copy of the source code may be downloaded from https://github.com/ajv-validator/ajv.git. This software contains the following license and notice below: - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +The MIT License (MIT) - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Copyright (c) 2015-2021 Evgeny Poberezkin - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +----- - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +The following software may be included in this product: ajv. A copy of the source code may be downloaded from https://github.com/ajv-validator/ajv.git. This software contains the following license and notice below: - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +The MIT License (MIT) - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +Copyright (c) 2015-2017 Evgeny Poberezkin - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +----- - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +The following software may be included in this product: amazon-cognito-identity-js. A copy of the source code may be downloaded from https://github.com/aws-amplify/amplify-js.git. This software contains the following license and notice below: - END OF TERMS AND CONDITIONS +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ - APPENDIX: How to apply the Apache License to your work. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +1. Definitions. - Copyright [yyyy] [name of copyright owner] +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - http://www.apache.org/licenses/LICENSE-2.0 +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. ------ +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. -The following software may be included in this product: @types/aws-lambda, @types/body-parser, @types/cls-hooked, @types/connect, @types/d3-color, @types/d3-interpolate, @types/d3-path, @types/d3-scale, @types/d3-shape, @types/d3-time, @types/debug, @types/express, @types/express-serve-static-core, @types/hast, @types/json-schema, @types/mdast, @types/mime, @types/mysql, @types/node, @types/parse5, @types/pg, @types/prop-types, @types/qs, @types/range-parser, @types/react, @types/react-redux, @types/react-table, @types/react-transition-group, @types/resize-observer-browser, @types/scheduler, @types/serve-static, @types/styled-jsx, @types/unist, @types/uuid. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/aws-lambda), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/body-parser), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/cls-hooked), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/connect), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-color), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-interpolate), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-path), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-scale), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-shape), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-time), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/debug), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/express), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/express-serve-static-core), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/hast), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/json-schema), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mdast), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mime), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mysql), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/parse5), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/pg), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/prop-types), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/qs), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/range-parser), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-redux), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-table), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-transition-group), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/resize-observer-browser), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/scheduler), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/serve-static), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/styled-jsx), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/unist), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/uuid). This software contains the following license and notice below: +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. -MIT License +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - Copyright (c) Microsoft Corporation. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. ------ +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -The following software may be included in this product: @types/cookie, @types/hoist-non-react-statics, @types/mdurl, @types/ms. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/cookie), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/hoist-non-react-statics), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mdurl), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/ms). This software contains the following license and notice below: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -MIT License + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - Copyright (c) Microsoft Corporation. All rights reserved. + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. ------ +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -The following software may be included in this product: accepts, mime-types. A copy of the source code may be downloaded from https://github.com/jshttp/accepts.git (accepts), https://github.com/jshttp/mime-types.git (mime-types). This software contains the following license and notice below: +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -(The MIT License) +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: ace-builds. A copy of the source code may be downloaded from https://github.com/ajaxorg/ace-builds.git. This software contains the following license and notice below: - -Copyright (c) 2010, Ajax.org B.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Ajax.org B.V. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - -The following software may be included in this product: acorn, acorn-walk. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git (acorn), https://github.com/acornjs/acorn.git (acorn-walk). This software contains the following license and notice below: - -MIT License - -Copyright (C) 2012-2020 by various contributors (see AUTHORS) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - -The following software may be included in this product: ajv. A copy of the source code may be downloaded from https://github.com/ajv-validator/ajv.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2015-2017 Evgeny Poberezkin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ------ +END OF TERMS AND CONDITIONS -The following software may be included in this product: amazon-cognito-identity-js. A copy of the source code may be downloaded from https://github.com/aws-amplify/amplify-js.git. This software contains the following license and notice below: +APPENDIX: How to apply the Apache License to your work. -Amazon Software License -This Amazon Software License (“License”) governs your use, reproduction, and distribution of the accompanying software as specified below. -1. Definitions -“Licensor” means any person or entity that distributes its Work. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. -“Software” means the original work of authorship made available under this License. +Copyright [yyyy] [name of copyright owner] -“Work” means the Software and any additions to or derivative works of the Software that are made available under this License. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -The terms “reproduce,” “reproduction,” “derivative works,” and “distribution” have the meaning as provided under U.S. copyright law; provided, however, that for the purposes of this License, derivative works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work. +http://www.apache.org/licenses/LICENSE-2.0 -Works, including the Software, are “made available” under this License by including in or with the Work either (a) a copyright notice referencing the applicability of this License to the Work, or (b) a copy of this License. -2. License Grants -2.1 Copyright Grant. Subject to the terms and conditions of this License, each Licensor grants to you a perpetual, worldwide, non-exclusive, royalty-free, copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense and distribute its Work and any resulting derivative works in any form. -2.2 Patent Grant. Subject to the terms and conditions of this License, each Licensor grants to you a perpetual, worldwide, non-exclusive, royalty-free patent license to make, have made, use, sell, offer for sale, import, and otherwise transfer its Work, in whole or in part. The foregoing license applies only to the patent claims licensable by Licensor that would be infringed by Licensor’s Work (or portion thereof) individually and excluding any combinations with any other materials or technology. -3. Limitations -3.1 Redistribution. You may reproduce or distribute the Work only if (a) you do so under this License, (b) you include a complete copy of this License with your distribution, and (c) you retain without modification any copyright, patent, trademark, or attribution notices that are present in the Work. -3.2 Derivative Works. You may specify that additional or different terms apply to the use, reproduction, and distribution of your derivative works of the Work (“Your Terms”) only if (a) Your Terms provide that the use limitation in Section 3.3 applies to your derivative works, and (b) you identify the specific derivative works that are subject to Your Terms. Notwithstanding Your Terms, this License (including the redistribution requirements in Section 3.1) will continue to apply to the Work itself. -3.3 Use Limitation. The Work and any derivative works thereof only may be used or intended for use with the web services, computing platforms or applications provided by Amazon.com, Inc. or its affiliates, including Amazon Web Services, Inc. -3.4 Patent Claims. If you bring or threaten to bring a patent claim against any Licensor (including any claim, cross-claim or counterclaim in a lawsuit) to enforce any patents that you allege are infringed by any Work, then your rights under this License from such Licensor (including the grants in Sections 2.1 and 2.2) will terminate immediately. -3.5 Trademarks. This License does not grant any rights to use any Licensor’s or its affiliates’ names, logos, or trademarks, except as necessary to reproduce the notices described in this License. -3.6 Termination. If you violate any term of this License, then your rights under this License (including the grants in Sections 2.1 and 2.2) will terminate immediately. -4. Disclaimer of Warranty. -THE WORK IS PROVIDED “AS IS” WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OR CONDITIONS OF M ERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT. YOU BEAR THE RISK OF UNDERTAKING ANY ACTIVITIES UNDER THIS LICENSE. SOME STATES’ CONSUMER LAWS DO NOT ALLOW EXCLUSION OF AN IMPLIED WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO YOU. -5. Limitation of Liability. -EXCEPT AS PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE SHALL ANY LICENSOR BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATED TO THIS LICENSE, THE USE OR INABILITY TO USE THE WORK (INCLUDING BUT NOT LIMITED TO LOSS OF GOODWILL, BUSINESS INTERRUPTION, LOST PROFITS OR DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY OTHER COMM ERCIAL DAMAGES OR LOSSES), EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -Effective Date – April 18, 2008 © 2008 Amazon.com, Inc. or its affiliates. All rights reserved. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. NOTICE Amazon Cognito Identity Provider SDK for JavaScript -Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. ========================================================================= == JavaScript BN library Notice == @@ -4052,6 +3869,35 @@ Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. This product includes software developed by Tom Wu at Stanford University. http://www-cs-students.stanford.edu/%7Etjw/jsbn/jsbn.js +Copyright (c) 2003-2005 Tom Wu +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF +THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +In addition, the following condition applies: + +All redistributions must retain an intact copy of this copyright notice +and disclaimer. + ========================================================================= == JKBigInteger library Notice == ========================================================================= @@ -4079,7 +3925,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: ansi-regex, ansi-styles, camelcase, camelcase-keys, find-up, has-flag, is-fullwidth-code-point, is-plain-obj, locate-path, normalize-url, p-limit, p-locate, p-try, path-exists, quick-lru, split-on-first, string-width, strip-ansi, supports-color, trim-newlines, wrap-ansi. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/sindresorhus/camelcase-keys.git (camelcase-keys), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/normalize-url.git (normalize-url), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/quick-lru.git (quick-lru), https://github.com/sindresorhus/split-on-first.git (split-on-first), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/trim-newlines.git (trim-newlines), https://github.com/chalk/wrap-ansi.git (wrap-ansi). This software contains the following license and notice below: +The following software may be included in this product: ansi-regex, ansi-styles, camelcase, camelcase-keys, find-up, is-fullwidth-code-point, is-plain-obj, locate-path, normalize-url, p-limit, p-locate, p-try, path-exists, quick-lru, split-on-first, string-width, strip-ansi, trim-newlines, wrap-ansi. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/sindresorhus/camelcase-keys.git (camelcase-keys), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/normalize-url.git (normalize-url), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/quick-lru.git (quick-lru), https://github.com/sindresorhus/split-on-first.git (split-on-first), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/trim-newlines.git (trim-newlines), https://github.com/chalk/wrap-ansi.git (wrap-ansi). This software contains the following license and notice below: MIT License @@ -4177,15 +4023,27 @@ THE SOFTWARE. ----- -The following software may be included in this product: array-from. A copy of the source code may be downloaded from git@github.com:studio-b12/array-from.git. This software contains the following license and notice below: +The following software may be included in this product: asn1. A copy of the source code may be downloaded from https://github.com/joyent/node-asn1.git. This software contains the following license and notice below: -Copyright © 2015-2016 Studio B12 GmbH +Copyright (c) 2011 Mark Cavage, All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE ----- @@ -4215,6 +4073,20 @@ SOFTWARE. ----- +The following software may be included in this product: astral-regex. A copy of the source code may be downloaded from https://github.com/kevva/astral-regex.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) Kevin Mårtensson (github.com/kevva) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: async-hook-jl. A copy of the source code may be downloaded from git://github.com/jeff-lewis/async-hook-jl.git. This software contains the following license and notice below: Copyright (c) 2015 Andreas Madsen @@ -4265,14 +4137,29 @@ SOFTWARE. ----- -The following software may be included in this product: at-least-node. A copy of the source code may be downloaded from git+https://github.com/RyanZim/at-least-node.git. This software contains the following license and notice below: +The following software may be included in this product: asynckit. A copy of the source code may be downloaded from git+https://github.com/alexindigo/asynckit.git. This software contains the following license and notice below: -The ISC License -Copyright (c) 2020 Ryan Zimmerman +The MIT License (MIT) -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +Copyright (c) 2016 Alex Indigo -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- @@ -4741,16 +4628,373 @@ Apache License APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +NOTICE + +AWS Cloud Development Kit (AWS CDK) +Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +------------------------------------------------------------------------------- + +The AWS CDK includes the following third-party software/licensing: + +** minimatch - https://www.npmjs.com/package/minimatch +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** fs-extra - https://www.npmjs.com/package/fs-extra +Copyright (c) 2011-2017 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** semver - https://www.npmjs.com/package/semver +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** yaml - https://www.npmjs.com/package/yaml +Copyright 2018 Eemeli Aro + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +---------------- + +** case - https://www.npmjs.com/package/case +Copyright (c) 2013 Nathan Bubna + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** jsonschema - https://www.npmjs.com/package/jsonschema +Copyright (C) 2012-2015 Tom de Grunt + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** punycode - https://www.npmjs.com/package/punycode +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** ignore - https://www.npmjs.com/package/ignore +Copyright (c) 2013 Kael Zhang , contributors +http://kael.me/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** @balena/dockerignore - https://www.npmjs.com/package/@balena/dockerignore +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +---------------- + +** graceful-fs - https://www.npmjs.com/package/graceful-fs +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** jsonfile - https://www.npmjs.com/package/jsonfile +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** universalify - https://www.npmjs.com/package/universalify +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** brace-expansion - https://www.npmjs.com/package/brace-expansion +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** balanced-match - https://www.npmjs.com/package/balanced-match +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** concat-map - https://www.npmjs.com/package/concat-map + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** lru-cache - https://www.npmjs.com/package/lru-cache + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- - Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +** kubectl - https://github.com/kubernetes/kubectl +Copyright 2017 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -4764,17 +5008,26 @@ Apache License See the License for the specific language governing permissions and limitations under the License. +---------------- -NOTICE +** helm - https://github.com/helm/helm +Copyright 2016 The Kubernetes Authors All Rights Reserved -AWS Cloud Development Kit (AWS CDK) -Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -------------------------------------------------------------------------------- + http://www.apache.org/licenses/LICENSE-2.0 -The AWS CDK includes the following third-party software/licensing: + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -** minimatch - https://www.npmjs.com/package/minimatch +---------------- + +** yallist - https://www.npmjs.com/package/yallist Copyright (c) Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any @@ -4791,108 +5044,77 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------- -** fs-extra - https://www.npmjs.com/package/fs-extra -Copyright (c) 2011-2017 JP Richardson +** ajv - https://www.npmjs.com/package/ajv/v/8.12.0 | MIT +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +Copyright (c) 2015-2021 Evgeny Poberezkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----------------- -** semver - https://www.npmjs.com/package/semver -Copyright (c) Isaac Z. Schlueter and Contributors -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +---------------- -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +** ansi-regex - https://www.npmjs.com/package/ansi-regex/v/5.0.1 | MIT +MIT License ----------------- +Copyright (c) Sindre Sorhus (sindresorhus.com) -** yaml - https://www.npmjs.com/package/yaml -Copyright 2018 Eemeli Aro +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. ---------------- -** case - https://www.npmjs.com/package/case -Copyright (c) 2013 Nathan Bubna +** ansi-styles - https://www.npmjs.com/package/ansi-styles/v/4.3.0 | MIT +MIT License -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Copyright (c) Sindre Sorhus (sindresorhus.com) -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. ---------------- -** jsonschema - https://www.npmjs.com/package/jsonschema -Copyright (C) 2012-2015 Tom de Grunt +** astral-regex - https://www.npmjs.com/package/astral-regex/v/2.0.0 | MIT +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Copyright (c) Kevin Mårtensson (github.com/kevva) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ---------------- -** punycode - https://www.npmjs.com/package/punycode -Copyright Mathias Bynens +** color-convert - https://www.npmjs.com/package/color-convert/v/2.0.1 | MIT +Copyright (c) 2011-2016 Heather Arthur Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -4913,11 +5135,24 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ---------------- -** ignore - https://www.npmjs.com/package/ignore -Copyright (c) 2013 Kael Zhang , contributors -http://kael.me/ +** color-name - https://www.npmjs.com/package/color-name/v/1.1.4 | MIT +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** emoji-regex - https://www.npmjs.com/package/emoji-regex/v/8.0.0 | MIT +Copyright Mathias Bynens Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -4938,107 +5173,13 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------- - -** @balena/dockerignore - https://www.npmjs.com/package/@balena/dockerignore -The MIT License (MIT) - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - ----------------- - -** at-least-node - https://www.npmjs.com/package/at-least-node -Copyright (c) 2020 Ryan Zimmerman - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----------------- - -** graceful-fs - https://www.npmjs.com/package/graceful-fs -Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors - - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----------------- - -** jsonfile - https://www.npmjs.com/package/jsonfile -Copyright (c) 2012-2015, JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ----------------- - -** universalify - https://www.npmjs.com/package/universalify -Copyright (c) 2017, Ryan Zimmerman - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the 'Software'), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------- -** brace-expansion - https://www.npmjs.com/package/brace-expansion -Copyright (c) 2013 Julian Gruber +** fast-deep-equal - https://www.npmjs.com/package/fast-deep-equal/v/3.1.3 | MIT +MIT License + +Copyright (c) 2017 Evgeny Poberezkin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5058,10 +5199,27 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ---------------- -** balanced-match - https://www.npmjs.com/package/balanced-match -Copyright (c) 2013 Julian Gruber +** is-fullwidth-code-point - https://www.npmjs.com/package/is-fullwidth-code-point/v/3.0.0 | MIT +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +---------------- + +** json-schema-traverse - https://www.npmjs.com/package/json-schema-traverse/v/1.0.0 | MIT +MIT License + +Copyright (c) 2017 Evgeny Poberezkin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5081,9 +5239,65 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ---------------- -** concat-map - https://www.npmjs.com/package/concat-map +** lodash.truncate - https://www.npmjs.com/package/lodash.truncate/v/4.4.2 | MIT +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + + +---------------- + +** require-from-string - https://www.npmjs.com/package/require-from-string/v/2.0.2 | MIT +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5092,85 +5306,105 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ---------------- -** lru-cache - https://www.npmjs.com/package/lru-cache +** slice-ansi - https://www.npmjs.com/package/slice-ansi/v/4.0.0 | MIT +MIT License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) DC +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------- -** kubectl - https://github.com/kubernetes/kubectl -Copyright 2017 The Kubernetes Authors. +** string-width - https://www.npmjs.com/package/string-width/v/4.2.3 | MIT +MIT License - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Copyright (c) Sindre Sorhus (sindresorhus.com) - http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---------------- -** helm - https://github.com/helm/helm -Copyright 2016 The Kubernetes Authors All Rights Reserved +** strip-ansi - https://www.npmjs.com/package/strip-ansi/v/6.0.1 | MIT +MIT License - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Copyright (c) Sindre Sorhus (sindresorhus.com) - http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---------------- -** yallist - https://www.npmjs.com/package/yallist -Copyright (c) Isaac Z. Schlueter and Contributors +** table - https://www.npmjs.com/package/table/v/6.8.1 | BSD-3-Clause +Copyright (c) 2018, Gajus Kuizinas (http://gajus.com/) +All rights reserved. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Gajus Kuizinas (http://gajus.com/) nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +---------------- + +** uri-js - https://www.npmjs.com/package/uri-js/v/4.4.1 | BSD-2-Clause +Copyright 2011 Gary Court. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------- @@ -6742,39 +6976,110 @@ so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: base64-js. A copy of the source code may be downloaded from git://github.com/beatgammit/base64-js.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jameson Little + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: bcrypt-pbkdf. A copy of the source code may be downloaded from git://github.com/joyent/node-bcrypt-pbkdf.git. This software contains the following license and notice below: + +The Blowfish portions are under the following license: + +Blowfish block cipher for OpenBSD +Copyright 1997 Niels Provos +All rights reserved. + +Implementation advice by David Mazieres . + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +The bcrypt_pbkdf portions are under the following license: + +Copyright (c) 2013 Ted Unangst ------ +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -The following software may be included in this product: base64-js. A copy of the source code may be downloaded from git://github.com/beatgammit/base64-js.git. This software contains the following license and notice below: +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -The MIT License (MIT) -Copyright (c) 2014 Jameson Little -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Performance improvements (Javascript-specific): -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Copyright 2016, Joyent Inc +Author: Alex Wilson -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----- @@ -6833,7 +7138,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: big-integer. A copy of the source code may be downloaded from git@github.com:peterolson/BigInteger.js.git. This software contains the following license and notice below: +The following software may be included in this product: big-integer, tweetnacl. A copy of the source code may be downloaded from git@github.com:peterolson/BigInteger.js.git (big-integer), https://github.com/dchest/tweetnacl-js.git (tweetnacl). This software contains the following license and notice below: This is free and unencumbered software released into the public domain. @@ -7657,7 +7962,40 @@ OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: chownr, fs-minipass, lru-cache, minimatch, once, rimraf, semver, tar, wrappy, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), git+https://github.com/npm/fs-minipass.git (fs-minipass), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git://github.com/isaacs/once (once), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver (semver), https://github.com/npm/node-tar.git (tar), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below: +The following software may be included in this product: caseless. A copy of the source code may be downloaded from https://github.com/mikeal/caseless. This software contains the following license and notice below: + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS + +----- + +The following software may be included in this product: chownr, fs-minipass, json-stringify-safe, lru-cache, minimatch, once, rimraf, semver, tar, wrappy, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), git+https://github.com/npm/fs-minipass.git (fs-minipass), git://github.com/isaacs/json-stringify-safe (json-stringify-safe), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git://github.com/isaacs/once (once), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver.git (semver), https://github.com/npm/node-tar.git (tar), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below: The ISC License @@ -7826,6 +8164,30 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ----- +The following software may be included in this product: combined-stream, delayed-stream. A copy of the source code may be downloaded from git://github.com/felixge/node-combined-stream.git (combined-stream), git://github.com/felixge/node-delayed-stream.git (delayed-stream). This software contains the following license and notice below: + +Copyright (c) 2011 Debuggable Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: comma-separated-tokens, hast-to-hyperscript, hast-util-from-parse5, hast-util-has-property, hast-util-is-element, hast-util-parse-selector, hast-util-raw, hast-util-to-parse5, hast-util-whitespace, hastscript, html-void-elements, is-alphabetical, is-alphanumerical, is-decimal, is-hexadecimal, lowlight, mdast-util-to-hast, rehype-raw, remark-rehype, space-separated-tokens, unist-util-generated, unist-util-stringify-position, unist-util-visit-parents, vfile-location, web-namespaces, zwitch. A copy of the source code may be downloaded from https://github.com/wooorm/comma-separated-tokens.git (comma-separated-tokens), https://github.com/syntax-tree/hast-to-hyperscript.git (hast-to-hyperscript), https://github.com/syntax-tree/hast-util-from-parse5.git (hast-util-from-parse5), https://github.com/syntax-tree/hast-util-has-property.git (hast-util-has-property), https://github.com/syntax-tree/hast-util-is-element.git (hast-util-is-element), https://github.com/syntax-tree/hast-util-parse-selector.git (hast-util-parse-selector), https://github.com/syntax-tree/hast-util-raw.git (hast-util-raw), https://github.com/syntax-tree/hast-util-to-parse5.git (hast-util-to-parse5), https://github.com/syntax-tree/hast-util-whitespace.git (hast-util-whitespace), https://github.com/syntax-tree/hastscript.git (hastscript), https://github.com/wooorm/html-void-elements.git (html-void-elements), https://github.com/wooorm/is-alphabetical.git (is-alphabetical), https://github.com/wooorm/is-alphanumerical.git (is-alphanumerical), https://github.com/wooorm/is-decimal.git (is-decimal), https://github.com/wooorm/is-hexadecimal.git (is-hexadecimal), https://github.com/wooorm/lowlight.git (lowlight), https://github.com/syntax-tree/mdast-util-to-hast.git (mdast-util-to-hast), https://github.com/rehypejs/rehype-raw.git (rehype-raw), https://github.com/remarkjs/remark-rehype.git (remark-rehype), https://github.com/wooorm/space-separated-tokens.git (space-separated-tokens), https://github.com/syntax-tree/unist-util-generated.git (unist-util-generated), https://github.com/syntax-tree/unist-util-stringify-position.git (unist-util-stringify-position), https://github.com/syntax-tree/unist-util-visit-parents.git (unist-util-visit-parents), https://github.com/vfile/vfile-location.git (vfile-location), https://github.com/wooorm/web-namespaces.git (web-namespaces), https://github.com/wooorm/zwitch.git (zwitch). This software contains the following license and notice below: (The MIT License) @@ -7921,7 +8283,7 @@ SOFTWARE. ----- -The following software may be included in this product: concat-map, minimist. A copy of the source code may be downloaded from git://github.com/substack/node-concat-map.git (concat-map), git://github.com/minimistjs/minimist.git (minimist). This software contains the following license and notice below: +The following software may be included in this product: concat-map, is-typedarray, minimist. A copy of the source code may be downloaded from git://github.com/substack/node-concat-map.git (concat-map), git://github.com/hughsk/is-typedarray.git (is-typedarray), git://github.com/minimistjs/minimist.git (minimist). This software contains the following license and notice below: This software is released under the MIT license: @@ -8297,35 +8659,6 @@ IN THE SOFTWARE. ----- -The following software may be included in this product: crypto-js. A copy of the source code may be downloaded from http://github.com/brix/crypto-js.git. This software contains the following license and notice below: - -# License - -[The MIT License (MIT)](http://opensource.org/licenses/MIT) - -Copyright (c) 2009-2013 Jeff Mott -Copyright (c) 2013-2016 Evan Vosberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: css-box-model. A copy of the source code may be downloaded from https://github.com/alexreardon/css-box-model.git. This software contains the following license and notice below: MIT License @@ -8616,6 +8949,34 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----- +The following software may be included in this product: dashdash. A copy of the source code may be downloaded from git://github.com/trentm/node-dashdash.git. This software contains the following license and notice below: + +# This is the MIT license + +Copyright (c) 2013 Trent Mick. All rights reserved. +Copyright (c) 2013 Joyent Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: date-fns. A copy of the source code may be downloaded from https://github.com/date-fns/date-fns. This software contains the following license and notice below: MIT License @@ -9183,6 +9544,32 @@ OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: ecc-jsbn. A copy of the source code may be downloaded from https://github.com/quartzjer/ecc-jsbn.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jeremie Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: ecdsa-sig-formatter, jwk-to-pem. A copy of the source code may be downloaded from git+ssh://git@github.com/Brightspace/node-ecdsa-sig-formatter.git (ecdsa-sig-formatter), git+ssh://git@github.com/Brightspace/node-jwk-to-pem.git (jwk-to-pem). This software contains the following license and notice below: Apache License @@ -9699,7 +10086,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: extsprintf. A copy of the source code may be downloaded from https://github.com/davepacheco/node-extsprintf.git. This software contains the following license and notice below: +The following software may be included in this product: extsprintf, jsprim. A copy of the source code may be downloaded from https://github.com/davepacheco/node-extsprintf.git (extsprintf), https://github.com/joyent/node-jsprim.git (jsprim). This software contains the following license and notice below: Copyright (c) 2012, Joyent, Inc. All rights reserved. @@ -9855,6 +10242,32 @@ SOFTWARE. ----- +The following software may be included in this product: fflate. A copy of the source code may be downloaded from https://github.com/101arrowz/fflate. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2020 Arjun Barrett + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: file-saver. A copy of the source code may be downloaded from https://github.com/eligrey/FileSaver.js. This software contains the following license and notice below: The MIT License @@ -10079,6 +10492,30 @@ SOFTWARE. ----- +The following software may be included in this product: form-data. A copy of the source code may be downloaded from git://github.com/form-data/form-data.git. This software contains the following license and notice below: + +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +----- + The following software may be included in this product: fresh. A copy of the source code may be downloaded from https://github.com/jshttp/fresh.git. This software contains the following license and notice below: (The MIT License) @@ -10520,6 +10957,29 @@ SOFTWARE. ----- +The following software may be included in this product: getpass, http-signature, sshpk. A copy of the source code may be downloaded from https://github.com/arekinath/node-getpass.git (getpass), git://github.com/joyent/node-http-signature.git (http-signature), git+https://github.com/joyent/node-sshpk.git (sshpk). This software contains the following license and notice below: + +Copyright Joyent, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +----- + The following software may be included in this product: glob. A copy of the source code may be downloaded from git://github.com/isaacs/node-glob.git. This software contains the following license and notice below: The ISC License @@ -11216,13 +11676,29 @@ furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: isstream. A copy of the source code may be downloaded from https://github.com/rvagg/isstream.git. This software contains the following license and notice below: + +The MIT License (MIT) +===================== + +Copyright (c) 2015 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- @@ -11321,6 +11797,51 @@ THE SOFTWARE. ----- +The following software may be included in this product: jsbn. A copy of the source code may be downloaded from https://github.com/andyperlitch/jsbn.git. This software contains the following license and notice below: + +Licensing +--------- + +This software is covered under the following copyright: + +/* + * Copyright (c) 2003-2005 Tom Wu + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +Address all questions regarding this license to: + + Tom Wu + tjw@cs.Stanford.EDU + +----- + The following software may be included in this product: json-schema. A copy of the source code may be downloaded from http://github.com/kriszyp/json-schema. This software contains the following license and notice below: Dojo is available under *either* the terms of the BSD 3-Clause "New" License *or* the @@ -11686,32 +12207,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ----- -The following software may be included in this product: just-extend. A copy of the source code may be downloaded from https://github.com/angus-c/just. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2016 angus croll - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - The following software may be included in this product: jwa, jws. A copy of the source code may be downloaded from git://github.com/brianloveswords/node-jwa.git (jwa), git://github.com/brianloveswords/node-jws.git (jws). This software contains the following license and notice below: Copyright (c) 2013 Brian J. Brennan @@ -11812,7 +12307,7 @@ terms above. ----- -The following software may be included in this product: lodash.debounce, lodash.get, lodash.throttle. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git (lodash.debounce), https://github.com/lodash/lodash.git (lodash.get), https://github.com/lodash/lodash.git (lodash.throttle). This software contains the following license and notice below: +The following software may be included in this product: lodash.debounce, lodash.get, lodash.throttle, lodash.truncate. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git (lodash.debounce), https://github.com/lodash/lodash.git (lodash.get), https://github.com/lodash/lodash.git (lodash.throttle), https://github.com/lodash/lodash.git (lodash.truncate). This software contains the following license and notice below: Copyright jQuery Foundation and other contributors @@ -11916,22 +12411,6 @@ terms above. ----- -The following software may be included in this product: lolex. A copy of the source code may be downloaded from http://github.com/sinonjs/lolex.git. This software contains the following license and notice below: - -Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - The following software may be included in this product: longest-streak, parse-entities, property-information. A copy of the source code may be downloaded from https://github.com/wooorm/longest-streak.git (longest-streak), https://github.com/wooorm/parse-entities.git (parse-entities), https://github.com/wooorm/property-information (property-information). This software contains the following license and notice below: (The MIT License) @@ -12616,38 +13095,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: nise, sinon. A copy of the source code may be downloaded from http://github.com/sinonjs/nise.git (nise), http://github.com/sinonjs/sinon.git (sinon). This software contains the following license and notice below: - -(The BSD License) - -Copyright (c) 2010-2017, Christian Johansen, christian@cjohansen.no -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Christian Johansen nor the names of his contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - The following software may be included in this product: node-fetch. A copy of the source code may be downloaded from https://github.com/bitinn/node-fetch.git. This software contains the following license and notice below: The MIT License (MIT) @@ -12858,6 +13305,32 @@ THE SOFTWARE. ----- +The following software may be included in this product: pako. A copy of the source code may be downloaded from https://github.com/nodeca/pako.git. This software contains the following license and notice below: + +(The MIT License) + +Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: parse-path, parse-url, protocols. A copy of the source code may be downloaded from git+https://github.com/IonicaBizau/parse-path.git (parse-path), git+https://github.com/IonicaBizau/parse-url.git (parse-url), git@github.com:IonicaBizau/protocols.git (protocols). This software contains the following license and notice below: The MIT License (MIT) @@ -13168,6 +13641,20 @@ SOFTWARE. ----- +The following software may be included in this product: psl. A copy of the source code may be downloaded from git@github.com:lupomontero/psl.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2017 Lupo Montero lupomontero@gmail.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: qrcode. A copy of the source code may be downloaded from git://github.com/soldair/node-qrcode.git. This software contains the following license and notice below: The MIT License (MIT) @@ -13253,6 +13740,32 @@ IN THE SOFTWARE. ----- +The following software may be included in this product: querystringify, requires-port, url-parse. A copy of the source code may be downloaded from https://github.com/unshiftio/querystringify (querystringify), https://github.com/unshiftio/requires-port (requires-port), https://github.com/unshiftio/url-parse.git (url-parse). This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: queue. A copy of the source code may be downloaded from https://github.com/jessetane/queue.git. This software contains the following license and notice below: The MIT License (MIT) @@ -13559,6 +14072,32 @@ SOFTWARE. ----- +The following software may be included in this product: react-native-url-polyfill. A copy of the source code may be downloaded from https://github.com/charpeni/react-native-url-polyfill.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2019 Nicolas Charpentier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: react-query. A copy of the source code may be downloaded from https://github.com/tannerlinsley/react-query.git. This software contains the following license and notice below: MIT License @@ -14193,6 +14732,32 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: require-from-string. A copy of the source code may be downloaded from https://github.com/floatdrop/require-from-string.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: require-main-filename, set-blocking, yargs-parser. A copy of the source code may be downloaded from git+ssh://git@github.com/yargs/require-main-filename.git (require-main-filename), git+https://github.com/yargs/set-blocking.git (set-blocking), https://github.com/yargs/yargs-parser.git (yargs-parser). This software contains the following license and notice below: Copyright (c) 2016, Contributors @@ -14546,6 +15111,21 @@ SOFTWARE. ----- +The following software may be included in this product: slice-ansi. A copy of the source code may be downloaded from https://github.com/chalk/slice-ansi.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) DC +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: source-map. A copy of the source code may be downloaded from http://github.com/mozilla/source-map.git. This software contains the following license and notice below: Copyright (c) 2009-2011, Mozilla Foundation and contributors @@ -14812,6 +15392,35 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: table. A copy of the source code may be downloaded from https://github.com/gajus/table. This software contains the following license and notice below: + +Copyright (c) 2018, Gajus Kuizinas (http://gajus.com/) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Gajus Kuizinas (http://gajus.com/) nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + The following software may be included in this product: tinycolor2. A copy of the source code may be downloaded from https://github.com/bgrins/TinyColor.git. This software contains the following license and notice below: Copyright (c), Brian Grinstead, http://briangrinstead.com @@ -14863,6 +15472,23 @@ SOFTWARE. ----- +The following software may be included in this product: tough-cookie. A copy of the source code may be downloaded from git://github.com/salesforce/tough-cookie.git. This software contains the following license and notice below: + +Copyright (c) 2015, Salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + The following software may be included in this product: trough. A copy of the source code may be downloaded from https://github.com/wooorm/trough.git. This software contains the following license and notice below: (The MIT License) @@ -14906,30 +15532,6 @@ PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: type-detect. A copy of the source code may be downloaded from git+ssh://git@github.com/chaijs/type-detect.git. This software contains the following license and notice below: - -Copyright (c) 2013 Jake Luer (http://alogicalparadox.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: typesafe-i18n. A copy of the source code may be downloaded from https://github.com/ivanhofer/typesafe-i18n. This software contains the following license and notice below: MIT License @@ -15701,7 +16303,7 @@ SOFTWARE. ----- -The following software may be included in this product: uuid. A copy of the source code may be downloaded from https://github.com/kelektiv/node-uuid.git. This software contains the following license and notice below: +The following software may be included in this product: uuid. A copy of the source code may be downloaded from https://github.com/uuidjs/uuid.git. This software contains the following license and notice below: The MIT License (MIT) @@ -16065,7 +16667,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: whatwg-url. A copy of the source code may be downloaded from https://github.com/jsdom/whatwg-url.git. This software contains the following license and notice below: +The following software may be included in this product: whatwg-url, whatwg-url-without-unicode. A copy of the source code may be downloaded from https://github.com/jsdom/whatwg-url.git (whatwg-url), https://github.com/charpeni/whatwg-url.git (whatwg-url-without-unicode). This software contains the following license and notice below: The MIT License (MIT) diff --git a/source/images/solution_architecture_diagram.png b/source/images/solution_architecture_diagram.png index 8e7c343786c963e4c939dc8622f2ab8fc368b0e9..02c46d8d9ed391e4e6e943b8f55f9764f37383cb 100644 GIT binary patch literal 191655 zcmaHT1yqz>*ETbRq|!)tmx6$FNJw`LH4-A-U4se|0@B^mHN?;{1|ltuv~(lg@Xz4$ zexJ{~*7vV<*1dq4``r8NbM3vaz0bZ0*HBZy!=}JSK|#S&d@ienf`Sf4K|y_piGlcw zoSvF83JM*HqO7!zx9N7~J#S)NvQTvyjtw*!oadU&bXqI=Xax8L&o$YxF(dHMaV9_H zvAxFR2z!l(qbf(N*$hT}9BV3r1&|>e=KOG*WyqqE^m8`#XJ-HIYRh1)dfcqvVB2Y1 zywqHV_>#gaIusyctb|Cp`21u$!9xD>_mGf+58gY0aAN|WJ~zfdexebGNgSyc=oy*$ z8U+*b_kbi5{yvOPpl;1f&dNTnarq$O`e70S`5nYl0A&Ee=6`)1ajTRe5d^}$MdZA5 zg%7P<3BQwOp&N}3EPn0|6~spY{A)BmM*)sE@StNF%!{aRW1vZ)pluUCAf3m6f60uH z(o_oZO`Q9RU4-;t54emza+=?+KzyiaAjCl8-(pLhBc$6hTEj(N!e@~(Lc|eYZInRF z|E~eZ!IXmgexlznU_dLsZ?KMye5|P&;!(X1@O$t5TUa()#4-Z5GUyQ(v1&@B1W*MO zAnC-te?J}t(;EQ5G~j*8M6LW5G6ujgkw!cg-iw8J)H%Q$AsjFot1sp8o2~;7`*6>wO8Y8*Ew0g4I$`EMwTSHT=9t@0 zV|`N}W|ux@<)k0*U{n**iE=3=((#EQ-i|97p&92lPhfHJu6@rQi0f=pENm@idd=nT z&bA~sx1amD>`cL!r&A;Xn!5tb(mEfyAlB2vidf>jh}XY%?vWgvMzya($J~b=%#|F||Ow=pucY9=?81JNeHyV&6bNQrRETgLyL(4q|Ao%8ye`i7^Y%I@%-? ziUZ~ivn#|}iUOQO+^)^JkQ-uvK;m(Q9S{Mq0iqTFaxWXOCdbmXHa5ty+}EG;gy=-) z)nUiVN=qjxfax?f2{d2i9%1%$=U^L>kCsb6RP|})IbNrVj0Ym`O(ud4lrC|JSfkOR zm9K;?_i4fG^$jZxtvN+RjQP>ZTS+C{V7N*OcEg9wsX)C!5wYB=1Flq2A*++>t7fev z5RPsEyn(ddwmcCy(Whdqz7Q#ZkTSsx0nB!f6XYdp5)UbO3J>^pI$1SFO;}d+bVb9~ zTOdy;iTl;)++v0Q zrO0W+z{i!6#JKOKg%w&4T}TTLb}p&jq+itsZ8cuOJmhn0Vlu8vW$CSbK^-KypXcd0 zj!%RiizHq)B)#Uh9!M}Z#0e7caiE^?eV@NIGVVLpE?!=RwVOXv;UbYY41S%WsR{%ZsUT8_R&E zDnX|Q^+QNv+ELu)zJcLqj_i25v8mDqj$TP4V7!TkM9;WjyUw%) z_C&wMadcqBbjS3(+@UjRNjPr)z_8bvb5ET;v4XiyjMZ#JyGSkZMvDHlA)2-7*^Q}Q z79j8}7%6ns9a@S0Yt3lebzad!%1$)7trQ+%d9qCaYa@A<5EklO{cmFh)r@w+lz2-> zYZL}-sfZQGj-^vYY7a4 z7sBUuD^rOwKZ+qRX33RfkTu!i&*DV74-oLX>6O!Pv2jh(a;ia7 zj52{Tgpbi`)}-m8c?6c~roEp6oAT)M(~9pNm_ez`xNZD;f>=W9TNJeNWU7R3Rx)r~ zv=B#xm!w-jMZ?8081Sb)nxyF|V_&xWh_hUV%g-PGnviJyP+0W?))p$+!+I2;m7O?U!s@_j^_S`zlF^*bIE0^LEy#NIvcnyymSRG!PsPbX(8EL!irDq*R!Bq`& z>!_`Nj~gdHS>o#vO+14w6~bR)wHVis`BNwmuW9a6CV2j;b%D7O*Xq^O?^fIN`nbzgw4H<$wA8>q`Nyi_w}x zfH-?qNzK*yo2I)+fQvBsmm1tHDfm#UE*kzf$o+4@dPoR0K7^@ORV2`w4GN@Ijkm0- zOcK4b>FpUW#@gED1Re%M9uPoT>3q_A(h}s+%iEgcm0lF|ZH{n)9oho2Pmv1@XFvDe z!7|ugVoM*MQ*HEa6;L;Fs@3n|6CfyE;XbrYE^n&=&Y112s`spITQL|7TJxfgi{MO) zi0VWacs?g!Km?Zf3>o+HQE;V}$j9!mE$0#=iY^}%8w3@>B9*ob&jL&zBr;gitSP6$#tnD)r zBIWT9L7=fJc z(ILgv%l1H>R6)t7AVIMvOe@}FT;PchkDmbe*b?r_B}}QQYW%aziK9xHJ6E$RS zv8ns8bYBnqS!xALOgp}!#~^xhgiq9N$cDFe%oL;CIA2F~W~vvmB4A*>&r$W*NX9S; zS_7>og`RA#a12ggw1AxO48(!su~ZFn@i0r+00`z4&uugjJT3xjKOVV{41jFvcLb*H zF9PFS0&$qL;N0n}kkwHXbFZH-dZ&Gf0a%_8GMWBf_r#VwRz9f8wxUAP7wM(oazI<5 zUaim7Nzx~C3{}KF<4z6@?Vpm40pGP0?b`HVfhS5>lRYe!E@ZT{W(-ah6U>nU3P1Be zOhpxuYNqM=!sY1YR55EwTS2A$FYFwmZM#8clpsDZ!j;ce#BXN>w z>z%m&FW%S82aaJ`)sC+;Vr$TJo7IWbmrZ^@#0BmQTbLDnHUG`iUCuvjSNJh9^7s>K zU^6MisikrkCzNrG6{=-|4(i>EK5LQBgD~06+~nb)UP01yuA;L-Ia?3=^U<-dypmO( zBV1c&RN8@MtptEF!FRATi!46g6)Gjo?k$bER+S|8NHSiQN}N)?HSO-7Nnv#Z7h??I zt+6tFjxxi!{8m#t0w^Vt$TQC)Td>cof-7C+;wTxkX9D>HhFA-cT``n#Gw zc;Ed;Yr0k*+g?`$<&}(Gg!pr3OP*HS;j{7H?d-?DcQzFgaJeMwyE?1WQ|TGLZH6bfu|@u6vta*2?e zd4>is0oK1r=C13IQO$!sdX_H41a@;R4t&8tJu@@#BjX|3KN*6RoYXm~kI@QMkF7%r z*`J48B3b=>>QAG`Xys0ste&XI@19_;6G9*N2NfPoMTG%T@iYaPz>yJb2kWLilRj^9 zg&$+y-TX%dcUS*lgcIP+SS%1n`m}%C*#aM6OW%)CvrI2EoPrQ)Uhg=jWwRrCj5in= zj8xX&V_^rWxN9`!D%!tTXfoF1B&nn}i2KwUE>AnHY<(+-!Np_sM;ZUQ1|KLRQ=#!SPk)cbRD`(c!RcbuXyx4y0vhCU#KItz6j1Tdog4uL#&C1< znTC*B>kf$Pl4^;zxbw&#Gn*rF2wmnVDI?TUU zsO1UcoT=~3`O5gj&fUt_GUa=#+#MqRBRXPFgI$%7(%=7EdOtLGtVzc3^U>v1N%kri zoCZz2xwbbaj`j*3i_c~RSy}FA_Ft0#)EN=Luwh-C@udT2F1;JN!=fr;8iTn>n0UkR zNx712;@2dN9mE3tmXmv_c|m8&1VV z_7_n65R)0)KkIMifAV`s9Kk2vu?>e13i8Lxs8i)KI|&p@%$6=3Ax-_?0}YweHRB?) z+Xny%;Y* zEc1WzZyR6|svFC;Nxqk+bRxyT*jo|-vu6WLL&Hs~vF8zXr2j2S`5lj72K+Te2{7r6 zo9bj&AywXvpDUYq4TWZb(o{)Nf#&2-?a@NRhyAHKv;tWqX>yc**i2+{-vT3 z^m4IJo2n&8NAJ-@Qa(IeW6Udl#1+BD_Wb}8mx+UefrBf7Mp~F$mYjSP8u(C^)+`wj z1Nfvf`2q0QJg;tPKd?98XSQYAJa30bDkV>P99xOq}a zb+PhHP0VeiVmNeICD2&^SP2fP`f0^qUFgRnk;o`GkkL80G zb{)L&J^?;j$dugVue_WN?1J|%G(!MD;aR_j4@2lx=iU|H25|57W}?4Me~f^lOU_992^*a3456Cfh4WgJ%EpplkciMAZ=d zcK2gc)8BWtMo4*17`58AWz|joKDHCH5tgVX#Wcu%`YlfNFYgMDK|$lHeDJURgG$rk z0LOpB2mk=Pl+21?d?=3ss1QI8?j@FFxwG~LLI}iz(@_QEFZa8kidN&eyQ|uJTnv-9 zH!xz^GQ4%8;5Ks$t>5V@{J0EMQsquSkP6{2bBi}67F(E`KMVLg+H$p0%Lh{x>A{(~ zYd#kAVDUW_C<9WQN0EsAFtjB26Jq|@4SWmB(sN_=*pICYPu9_Rt-hqzZD8cSoBQ6uK+T0DHN(lgkT|M<(&M$?c7n^^hl>G91zS$ycg zkHgk#d}x*ziva<0lT+jnpyjFw!})tr$7p1%(*mE z@T)*+_|?+nCBz9HNh~oH%Ib)m)k-JzBpAZ2eZ`Ya1sq>_PJoZJG_fSaV!CMXNdMND z#yA?E<0fca`S;X$exQNV#ne5?`gB42{sMjifiMoeCxT{SEiB#M!ZNFu;Ge_fr{!0_!Ks17Hura|)$%i8suG89322i1vLF&cr0>4AS`a zjRDk>`p;9z2DHsJgO6PFU(j5~W?PNNEjJckYL2izO2=PBreBDHCL&0bk&}odkpM`c zk*i`xdLtI5|GnG zxt-&7yZxvYvaU*r8{_c=x-~1hzV;S{BdlzrxU6#GO}x6s<<#1%!#L9BZ%t)xhS&!C zk@?E?KJ@&N5uSTRt;gvFT}@x(Ll-X;|`V^N;tt3RyoIPvq|g85FG0HAm4{q;K%5EX66hthVIGo z(OwjniCa<-Crw!xb9otMw8B<5&5({8`>F}s#m{HR?R9v-J}TR$&sVJTc6YFTa9Y& zdP)I3kEtEC9_8sNpMLv&eqPhdqROmMisZpg;oh8`Qf6i3W701lHFpW$aP$gY`7!p6 z_X&}uu$Wd%P`K>TVUsd1ALzZ#vGG&_@_;rMxqq0bMSL?nn>)2swF8S9TKNj96pJzL#G z9h4(;X2N=!$Mag;l(0?6k`+6+JM>O9`0q6;<2K8{n~hpa!;!jr;!cI!JG*u7M|Tvn zH4b5X`ZPx8pgMl?rwW9J8!b`nN9UWwA}*y6tr2W?@wN|n`ES@Nl^%_ilBxu>bPhY1 zaA;?qeKQ6Eq%o5DR)~oV(I5;ix)xSOEDP{fd zH8b|Db24{s$&(^l_hYZo^XX&uCr3ZuB$$@P=2tRTNqQPRYV$FB)jbgjMD`@A z%G;ZlJJW~xc+<9Kd#sK^nbj*?I+1zfqOE!%#v$QgLAx-4;zw{~qniDSm-S{P!4?t( zzG_4Pcg2ksto4g`qb&^)V}6_fMuBxbC#8ZSYo;H$j7`K^!V$w9vV`d9hBU#!vT|~= zAtA$zY^-lMEUh$ZF4`rcPnqm``rAWRKyA`;~cfPm-H7PSj!2@4Su$}uKprM zoT1`ioBB-wmw}mGtK=MOvhMS(A)|>C^B~U(NZV9V_$KY z0RpeIQe=6@NudXg|bA-u;paM%sp*`+6iPUD%m!TDaXX8jZiWEI@}G9Dz|-Ndde;YkAyN&(Hf zL+u(zXaHU&XS!c#s#(X~R-AidFmb$X2P2X7pPPmAH@Twu4tOhxphma-A5R*b@(;N|6fzpE3~4u$LD7|dpn1Guj_pacAphA2kWj<- zX+*R~togF;65$Uf>RhzhoUUK?hrOPz`N_u!!Qn%zE}SMGojN;O68kpyHW6&% z$&Y|e?kwI!7U;xGCpmC@DEybloqMH5xYu^Kq!nM*kvU;`-Zr1N2eza15w4$tKJfFg zKiR-+c6efm|Cp2O_ZT==@EKhvBY2z;6y$cz>((h8LVz>ByFky;IlixR< zxF(HJu5Ok!NrmZ+7R-OUW$8x!f{_GR-_i}#v;5>rJ-#ipmi9S>nO8^=9tee6M*n_{ z4X}F`GL=_))r`fFnh_qkw7hq9FKUCgO%2q09}U);R?2f57SS2-@ak+1m!raY53u;ICd7C;18Cbd z{mtVSFmv0JHB;1ImT34#WoGfgRjS}+GtzzvmtB_F z<|>z;fGu1D*uxohc5sD-vp)=xvaXyAcYc$GJD|mh&b)G~gvOo{DjPUjH_yHVVc0Lf zwGQva&ye(q(7K$r^4c>l%#k^^9ezVO;j!Wp4VrP1R5CGWU-kd3sd)PPag0`H3l}ry zcC|(%ZS`{IHYTUth7l3GU2BDX5u;KpV!(w?^TuG?ZeIdKds zDyB;1h@Gv(>CHM-T^#CK&2Dn8%o-AW1r^C;)6(5**j9qa9Ss??st_(<>sVp^k`k)_rt|wqx*x;9#WL;V?DnzYF^%lS&kRcT?wOU<#t#G=1Il{8Nx?Ti zhYj4ZA@+Tf^#Ak%04WeDt}Wy(kCie!31ZU5o`@k?9W%W3WHa?U0B>v z0ef^g3h>h7vA8zdOhAkK%4!@4s-!f&pJ?VLX$kl35(v?~xQ|F_dkwQ(>A+uju?>>a zU&3u&oDyjKSXr~ai}of4}Y9#he?GvT4yn7&~VIOO+ytd-%$5k zlOHDQAQ{T6TKSMckSjpM;C*_3s-Zgb`w7mF7^}!@ND85iqBM!i>pPs6$guOsWp{q4&26W z&VK%qKsXx8a^}J>iX_zLpevOPfv+?&Ge<$ySN;)C10j63wb_Q{)(-|wJdz*k7+QDl zMXeFWue%S@H`ka6XQe^7XBc}Pik&fKDvOm+stRaI(0w%7H~`3_aj6?$7bOc0u5 z(-1^E!Zt8vw(jg!CCxdh(KpQMu{e8aH2!!w-CsB&m#WLdwrSQ^+bDsKEnWFu?Q5wf zdgq!NQ8q`Rr= zU%2kT#D3lu>(tySG(S9Dj?QJ>o<%5NY51AKCIgG|)?y>AMjqY%)r6Xk&rM&P)g8r) zjqiGR7ow1rm^mNE727de@~1-guigcUkjN1eS)_#cGlphqyREl4$VD$@h%1}ez8nsf zYa~y$Fj)Uj?@hZjUCGX|pb(+UE#~6A25l3^YIey?W&-hjpVG+@Ez}eDY(T+h-Ro85 zl2)nR(y@e_#a_>%hyd&R=nb~)iL6iE8VWosW^C=x=uM3i-TdUDp{7FNQM*tH(iM?Z`V>xz{ zRyaFV8rsAT*!*9Y4_#ikE4-6ZQfZTd?e>n6GP1tgBx4!=)W1`AtiX%Z8)E!62eL_n zg5S+&7U{3C`;7l5YK*SA|;I5vwuqeBNW2-)2ZOi&V$J2;NU-S1&+QPlZ zI?1~Q7vqx$Wk)bMc%a5Xn%Fl299Z~DO68T{y7!vr#knP#rd52wDJ=c7I%i58H!XfrS zDx~FPxM_)%XUoXub3C!nUQXOvCIPeu1Vv_>WyhP+l6MOUL}DN)RH6e_06;lnJc?2_ z`+UZbLF4qs>bwV4z`DbAEsr5WtT~y_(^rl9(QJAb%0D{z@f=0yR}DmD=vzA^ipr`R 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

#6fMT4w967*sPefU7hFQ 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%0ApfVvxPC>L|Z%Zy?r4 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 diff --git a/source/package.json b/source/package.json index bcea8ae..a967857 100644 --- a/source/package.json +++ b/source/package.json @@ -2,10 +2,10 @@ "name": "ada", "title": "Automated Data Analytics on AWS", "description": "Automated Data Analytics on AWS simplifies the management and analysis of data, providing an end-to-end platform used for ingesting, transforming, governing, and querying datasets through a standalone user interface", - "version": "1.2.0", + "version": "1.3.0", "author": "Amazon Web Services", "awsSolutionId": "SO0190", - "awsSolutionVersion": "v1.2.0", + "awsSolutionVersion": "v1.3.0", "private": true, "license": "Apache-2.0", "engines": { @@ -50,15 +50,15 @@ "*.{ts,tsx}": "eslint --cache --fix --quiet" }, "dependencies": { - "aws-cdk-lib": "2.70.0", + "@aws-cdk/aws-apigatewayv2-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-apigatewayv2-authorizers-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-apigatewayv2-integrations-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-glue-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-kinesisfirehose-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-kinesisfirehose-destinations-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-lambda-python-alpha": "2.88.0-alpha.0", + "aws-cdk-lib": "2.88.0", "constructs": "^10.1.101", - "@aws-cdk/aws-apigatewayv2-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-apigatewayv2-authorizers-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-apigatewayv2-integrations-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-glue-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-kinesisfirehose-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-kinesisfirehose-destinations-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-lambda-python-alpha": "2.70.0-alpha.0", "find-up": "^6.0.0", "json5": "^2.2.2", "lodash": "^4.17.21", @@ -67,7 +67,9 @@ "short-uuid": "^4.2.0" }, "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.27.0", + "@aws-cdk/cloudformation-diff": "^2.33.0", + "@aws-sdk/client-dynamodb": "^3.370.0", + "@aws-sdk/util-credentials": "^3.56.0", "@mock/require": "^0.2.2", "@pact-foundation/pact": "^9.16.0", "@shelf/jest-dynamodb": "^2.1.0", @@ -85,8 +87,7 @@ "@types/node-fetch": "^2.5.8", "@typescript-eslint/eslint-plugin": "^4.31.0", "@typescript-eslint/parser": "^4.31.0", - "@aws-cdk/cloudformation-diff": "^2.33.0", - "aws-cdk": "2.70.0", + "aws-cdk": "2.88.0", "aws-sdk": "^2.1358.0", "babel-eslint": "^10.0.3", "copyfiles": "^2.4.1", @@ -125,7 +126,7 @@ "nyc": "^15.1.0", "pkginfo": "^0.4.1", "prettier": "^2.7.1", - "proxy-agent": "^5.0.0", + "proxy-agent": "^6.3.0", "require-json5": "^1.3.0", "source-map-support": "^0.5.21", "ts-jest": "^26.5.6", @@ -145,6 +146,7 @@ "lerna/**/tar": "^6.1.9", "lerna/**/json-schema": "^0.4.0", "lerna/**/parse-url": "^8.1.0", + "lerna/**/semver": "^7.5.2", "**/ansi-regex": "^5.0.1", "@pact-foundation/**/tar": "^6.1.9", "**/dynamodb-local/**/tar": "^4.4.18", @@ -160,7 +162,10 @@ "express": "^4.17.3", "http-cache-semantics": "^4.1.1", "json5": "~2.2.2", - "xml2js": "^0.5.0" + "xml2js": "^0.5.0", + "tough-cookie": "^4.1.3", + "url-parse": "^1.5.9", + "@cypress/request": "^3.0.0" }, "workspaces": { "packages": [ diff --git a/source/packages/@ada/api/package.json b/source/packages/@ada/api/package.json index af74742..13f9f9c 100644 --- a/source/packages/@ada/api/package.json +++ b/source/packages/@ada/api/package.json @@ -28,8 +28,8 @@ "@types/node": "*", "@types/node-fetch": "^2.5.7", "@types/pluralize": "^0.0.29", - "aws-cdk": "2.70.0", - "aws-cdk-lib": "2.70.0", + "aws-cdk": "2.88.0", + "aws-cdk-lib": "2.88.0", "constructs": "^10.1.181", "btoa": "^1.2.1", "es6-promise": "^4.2.4", diff --git a/source/packages/@ada/api/spec.yaml b/source/packages/@ada/api/spec.yaml index ffa32d4..9a1f7c5 100644 --- a/source/packages/@ada/api/spec.yaml +++ b/source/packages/@ada/api/spec.yaml @@ -4,7 +4,7 @@ info: of data, providing an end-to-end platform used for ingesting, transforming, governing, and querying datasets through a standalone user interface title: Automated Data Analytics on AWS API - version: 1.2.0 + version: 1.3.0 servers: - url: https://{apigId}.execute-api.{region}.amazonaws.com/{stage} variables: @@ -1234,6 +1234,35 @@ paths: $ref: '#/components/schemas/ApiError' description: 404 response /governance/policy/attribute-values: + delete: + description: Delete governance policy attribute values + operationId: DeleteGovernancePolicyAttributeValues + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteGovernancePolicyAttributeValuesRequest' + required: true + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteGovernancePolicyAttributeValuesResponse' + description: 200 response + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 400 response + "403": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 403 response get: description: Get governance policy attribute values operationId: GetGovernancePolicyAttributeValues @@ -1308,6 +1337,50 @@ paths: schema: $ref: '#/components/schemas/ApiError' description: 403 response + /governance/policy/attribute-values/{ontologyNamespace}/{attributeId}/attribute: + get: + description: Get governance policy attribute values attribute + operationId: GetGovernancePolicyAttributeValuesAttribute + parameters: + - explode: false + in: path + name: ontologyNamespace + required: true + schema: + type: string + style: simple + - explode: false + in: path + name: attributeId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/GetGovernancePolicyAttributeValuesAttributeResponse' + description: 200 response + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 400 response + "403": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 403 response + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 404 response /governance/policy/attribute-values/{ontologyNamespace}/{attributeId}/group/{group}: delete: description: Delete governance policy attribute values group @@ -1557,6 +1630,50 @@ paths: schema: $ref: '#/components/schemas/ApiError' description: 403 response + /governance/policy/attributes/{ontologyNamespace}/{attributeId}/attribute: + get: + description: Get governance policy attributes attribute + operationId: GetGovernancePolicyAttributesAttribute + parameters: + - explode: false + in: path + name: ontologyNamespace + required: true + schema: + type: string + style: simple + - explode: false + in: path + name: attributeId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/GetGovernancePolicyAttributesAttributeResponse' + description: 200 response + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 400 response + "403": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 403 response + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + description: 404 response /governance/policy/attributes/{ontologyNamespace}/{attributeId}/group/{group}: delete: description: Delete governance policy attributes group @@ -6029,6 +6146,44 @@ components: - policies title: DeleteGovernancePolicyAttributesResponse type: object + DeleteGovernancePolicyAttributeValuesRequest: + description: List of attribute value policies to delete + example: + policies: + - namespaceAndAttributeId: namespaceAndAttributeId + group: group + - namespaceAndAttributeId: namespaceAndAttributeId + group: group + properties: + policies: + items: + $ref: '#/components/schemas/AttributePolicyIdentifier' + type: array + required: + - policies + title: DeleteGovernancePolicyAttributeValuesRequest + type: object + DeleteGovernancePolicyAttributeValuesResponse: + description: The deleted attribute value policies + example: + policies: + - sqlClause: sqlClause + namespaceAndAttributeId: namespaceAndAttributeId + description: description + group: group + - sqlClause: sqlClause + namespaceAndAttributeId: namespaceAndAttributeId + description: description + group: group + properties: + policies: + items: + $ref: '#/components/schemas/AttributeValuePolicy' + type: array + required: + - policies + title: DeleteGovernancePolicyAttributeValuesResponse + type: object Domain: properties: description: @@ -6316,6 +6471,23 @@ components: - resultsByTime title: GetCostOutput type: object + GetGovernancePolicyAttributesAttributeResponse: + description: A list of attributes for the given attributes + example: + policies: + - namespaceAndAttributeId: namespaceAndAttributeId + group: group + - namespaceAndAttributeId: namespaceAndAttributeId + group: group + properties: + policies: + items: + $ref: '#/components/schemas/AttributePolicy' + type: array + required: + - policies + title: GetGovernancePolicyAttributesAttributeResponse + type: object GetGovernancePolicyAttributesResponse: description: A map of attribute id to the lens id that applies for the given group and attributes @@ -6330,6 +6502,27 @@ components: - attributeIdToLensId title: GetGovernancePolicyAttributesResponse type: object + GetGovernancePolicyAttributeValuesAttributeResponse: + description: A list of attribute values for the given attribute + example: + policies: + - sqlClause: sqlClause + namespaceAndAttributeId: namespaceAndAttributeId + description: description + group: group + - sqlClause: sqlClause + namespaceAndAttributeId: namespaceAndAttributeId + description: description + group: group + properties: + policies: + items: + $ref: '#/components/schemas/AttributeValuePolicy' + type: array + required: + - policies + title: GetGovernancePolicyAttributeValuesAttributeResponse + type: object GetGovernancePolicyAttributeValuesResponse: description: The attribute value policies discovered from the given attributesId and group @@ -9503,9 +9696,11 @@ components: - GOOGLE_STORAGE - DYNAMODB - CLOUDWATCH + - REDSHIFT - MYSQL5 - POSTGRESQL - SQLSERVER + - ORACLE - CLOUDTRAIL - MONGODB type: string diff --git a/source/packages/@ada/cdk-core/package.json b/source/packages/@ada/cdk-core/package.json index 90fb284..3da169d 100644 --- a/source/packages/@ada/cdk-core/package.json +++ b/source/packages/@ada/cdk-core/package.json @@ -14,13 +14,13 @@ }, "dependencies": { "@ada/common": "*", - "aws-cdk-lib": "2.70.0", + "aws-cdk-lib": "2.88.0", "constructs": "^10.1.181", "truncate-middle": "^1.0.6" }, "devDependencies": { "@types/truncate-middle": "^1.0.1", - "aws-cdk": "2.70.0", + "aws-cdk": "2.88.0", "aws-sdk": "^2.1358.0", "cross-env": "^7.0.2", "module-alias": "^2.2.2", diff --git a/source/packages/@ada/cdk-core/src/input-parameters/index.ts b/source/packages/@ada/cdk-core/src/input-parameters/index.ts index e0c8e70..7f651cb 100644 --- a/source/packages/@ada/cdk-core/src/input-parameters/index.ts +++ b/source/packages/@ada/cdk-core/src/input-parameters/index.ts @@ -19,7 +19,7 @@ export type UserPoolAddOnsAdvancedSecurityMode = keyof typeof UserPoolAddOnsAdva */ export class InputParameters { public readonly adminEmail: string; - + public readonly adminPhoneNumber: string; public readonly autoAssociateAdmin: string; @@ -38,7 +38,7 @@ export class InputParameters { // try to get the default value from the context, so that it will not break the CI/CD default: scope.node.tryGetContext('adminEmail'), allowedPattern: '^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$', - constraintDescription: " must be a valid email address." + constraintDescription: ' must be a valid email address.', }); this.adminEmail = adminEmail.valueAsString; @@ -50,7 +50,7 @@ export class InputParameters { 'The phone number of the administrator. Must be a valid phone number in E.164 format (e.g. +15555550123) that can receive OTP messages if MFA is enabled. Change the default value to your phone number if you want to enable this functionality', default: defaultAdminPhoneNumber, allowedPattern: '^\\+[1-9]\\d{1,14}$', - constraintDescription: " must be a valid phone number in E.164 format, e.g. +15555550123" + constraintDescription: ' must be a valid phone number in E.164 format, e.g. +15555550123', }); this.adminPhoneNumber = adminPhoneNumber.valueAsString; @@ -67,9 +67,10 @@ export class InputParameters { assertions: [ { assert: Fn.conditionNot(Fn.conditionEquals(adminPhoneNumber, defaultAdminPhoneNumber)), - assertDescription: 'When Multi-Factor Authentication (MFA) is enabled, a valid phone number of the administrator must be provided' - } - ] + assertDescription: + 'When Multi-Factor Authentication (MFA) is enabled, a valid phone number of the administrator must be provided', + }, + ], }); const advancedSecurityMode = new CfnParameter(scope, 'advancedSecurityMode', { @@ -92,7 +93,7 @@ export class InputParameters { const sendAnonymousData = new CfnParameter(scope, 'sendAnonymousData', { type: 'String', description: - 'Send anonymous operational metrics to AWS. We use this data to better understand how customers use this solution and related services and products. Choose No to opt out of this feature.', + 'Send anonymized operational metrics to AWS. We use this data to better understand how customers use this solution and related services and products. Choose No to opt out of this feature.', default: 'Yes', allowedValues: ['Yes', 'No'], }); diff --git a/source/packages/@ada/common/package.json b/source/packages/@ada/common/package.json index 3405192..c9c9412 100644 --- a/source/packages/@ada/common/package.json +++ b/source/packages/@ada/common/package.json @@ -16,7 +16,7 @@ "clean": "rm -rf node_modules" }, "dependencies": { - "@aws-sdk/signature-v4": "^3.30.0", + "@aws-sdk/signature-v4": "^3.370.0", "mime-types": "^2.1.35" }, "devDependencies": { diff --git a/source/packages/@ada/infra/package.json b/source/packages/@ada/infra/package.json index 9d31330..09d2da7 100644 --- a/source/packages/@ada/infra/package.json +++ b/source/packages/@ada/infra/package.json @@ -67,10 +67,10 @@ "@ada/query-parse-render-lambdas": "*", "@ada/strings": "*", "@ada/transforms": "*", - "@aws-cdk/aws-servicecatalogappregistry-alpha": "2.70.0-alpha.0", - "@aws-sdk/util-arn-parser": "^3.208.0", + "@aws-cdk/aws-servicecatalogappregistry-alpha": "2.88.0-alpha.0", + "@aws-sdk/util-arn-parser": "^3.310.0", "await-spawn": "^4.0.2", - "aws-cdk-lib": "2.70.0", + "aws-cdk-lib": "2.88.0", "aws-lambda-router": "0.11.0", "aws-xray-sdk": "^3.3.6", "aws4": "1.11.0", @@ -106,9 +106,9 @@ "@types/string-hash": "^1.1.1", "@types/uglify-js": "^3.13.1", "@types/verror": "^1.10.5", - "aws-cdk": "2.70.0", + "aws-cdk": "2.88.0", "aws-sdk": "^2.1358.0", - "cdk-assets": "2.70.0", + "cdk-assets": "2.88.0", "cross-env": "^7.0.2", "execa": "^5.1.1", "find-port-free-sync": "^1.0.7", diff --git a/source/packages/@ada/infra/src/common/aspects/app-registry/index.ts b/source/packages/@ada/infra/src/common/aspects/app-registry/index.ts index 5b6b175..bfbf276 100644 --- a/source/packages/@ada/infra/src/common/aspects/app-registry/index.ts +++ b/source/packages/@ada/infra/src/common/aspects/app-registry/index.ts @@ -5,6 +5,7 @@ import * as appRegistry from '@aws-cdk/aws-servicecatalogappregistry-alpha'; import * as cdk from 'aws-cdk-lib'; import * as cr from 'aws-cdk-lib/custom-resources'; import * as iam from 'aws-cdk-lib/aws-iam'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; import { CfnResourceAssociation } from 'aws-cdk-lib/aws-servicecatalogappregistry'; import { Construct, IConstruct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; @@ -108,6 +109,7 @@ export class AppRegistry extends Construct implements cdk.IAspect { handler: 'handler', description: 'Lambda for checking the state of AppRegistry Application Resource Group state', initialPolicy: [lambdaPolicyStatement], + runtime: lambda.Runtime.NODEJS_16_X, }); const provider = new cr.Provider(this, 'Provider', { diff --git a/source/packages/@ada/infra/src/common/constructs/api/federated-api/decorator.ts b/source/packages/@ada/infra/src/common/constructs/api/federated-api/decorator.ts index 8ca8ccc..2e41ce5 100644 --- a/source/packages/@ada/infra/src/common/constructs/api/federated-api/decorator.ts +++ b/source/packages/@ada/infra/src/common/constructs/api/federated-api/decorator.ts @@ -23,6 +23,7 @@ import { Integration, JsonSchema, JsonSchemaVersion, + LambdaIntegration, Resource, ResourceOptions, } from 'aws-cdk-lib/aws-apigateway'; @@ -107,13 +108,7 @@ export function DecoratedResource(api: IDecoratedRestApi, resource: Resource): I return true as IDecoratedResource['decorated']; } case 'parentResource': { - return ( - resource.parentResource && - (DecoratedResource( - api, - resource.parentResource as unknown as Resource, - ) ) - ); + return resource.parentResource && DecoratedResource(api, resource.parentResource as unknown as Resource); } case 'addResource': { // wrap decendant resources with proxy @@ -135,11 +130,12 @@ export function DecoratedResource(api: IDecoratedRestApi, resource: Resource): I case 'addMethod': { // apply schema/validation/mapping/etc to the method const fn: IDecoratedResource['addMethod'] = (httpMethod, integration, options) => { + const createResponseModel = !(integration instanceof LambdaIntegration); const method = new ExposedMethod(resource, httpMethod, { resource, httpMethod, integration, - options: options && buildRequestResponse(api, resource, httpMethod, options), + options: options && buildRequestResponse(api, resource, httpMethod, createResponseModel, options), }); // update openapi definition @@ -223,7 +219,11 @@ function buildRequest( * @param responseStatusCode the status code of the response (defaults to 200) * @param responseHeaders headers included in the response */ -function buildResponse(context: RequestResponseContext, responses: ResponseProps[]): ExposedMethodResponse[] { +function buildResponse( + context: RequestResponseContext, + responses: ResponseProps[], + createResponseModel: boolean, +): ExposedMethodResponse[] { const { api, resource, operationName } = context; return responses.reduce( @@ -239,20 +239,28 @@ function buildResponse(context: RequestResponseContext, responses: ResponseProps schema = asPaginatedResponse(schema); } + const modelParams = { + // do not add explicit `modelName` so model can be replaced + restApi: resource.api, + contentType: 'application/json', + description, + schema: { + schema: JsonSchemaVersion.DRAFT4, + title: modelName, + ...schema, + }, + }; + + // only create cdk instance of model if the response model is requried, + // otherwise create a data structure instead of the CDK construct + const responseModel = createResponseModel + ? new ExposedModel(resource, modelName, modelParams) + : (({ props: modelParams }) as ExposedModel); + methodResponses.push({ statusCode: String(responseStatusCode), responseModels: { - 'application/json': new ExposedModel(resource, modelName, { - // do not add explicit `modelName` so model can be replaced - restApi: resource.api, - contentType: 'application/json', - description, - schema: { - schema: JsonSchemaVersion.DRAFT4, - title: modelName, - ...schema, - }, - }), + 'application/json': responseModel, }, responseParameters: responseHeaders && @@ -321,6 +329,7 @@ function buildRequestResponse( api: IDecoratedRestApi, resource: Resource, httpMethod: HTTP_METHOD, + createResponseModel: boolean, { request, response, requestParameters, operationName, description, paginated = false }: RequestResponseProps, ): ExposedMethodOptions { if (operationName == null) { @@ -346,7 +355,8 @@ function buildRequestResponse( requestParameters, requestValidator: api.requestValidator, requestModels: request && buildRequest(context, request), - methodResponses: response && buildResponse(context, Array.isArray(response) ? response : [response]), + methodResponses: + response && buildResponse(context, Array.isArray(response) ? response : [response], createResponseModel), operationName: context.operationName, description: context.description, }; diff --git a/source/packages/@ada/infra/src/common/constructs/deployment-metrics/handler.ts b/source/packages/@ada/infra/src/common/constructs/deployment-metrics/handler.ts index 1115cb4..da43c63 100644 --- a/source/packages/@ada/infra/src/common/constructs/deployment-metrics/handler.ts +++ b/source/packages/@ada/infra/src/common/constructs/deployment-metrics/handler.ts @@ -20,7 +20,7 @@ export async function handler( switch (event.RequestType) { case 'Create': - // only create anonymous uuid for create event + // only create anonymized uuid for create event anonymousDataUUID = uuidv4(); break; @@ -30,7 +30,7 @@ export async function handler( break; } - // send anonymous metrics data + // send anonymized metrics data const result = await sendAnonymousMetric({ awsSolutionId, awsSolutionVersion, diff --git a/source/packages/@ada/infra/src/common/constructs/iam/policies.ts b/source/packages/@ada/infra/src/common/constructs/iam/policies.ts index 1c7d9bf..3a7bf45 100644 --- a/source/packages/@ada/infra/src/common/constructs/iam/policies.ts +++ b/source/packages/@ada/infra/src/common/constructs/iam/policies.ts @@ -118,6 +118,12 @@ export const ExternalSourceDataCloudWatchAccessPolicyStatement = new PolicyState resources: ['*'], }); +export const ExternalSourceRedshiftAccessPolicyStatement = new PolicyStatement({ + effect: Effect.ALLOW, + actions: ['redshift:GetClusterCredentials', 'redshift-serverless:GetCredentials'], + resources: ['*'], +}); + /** * Grant access to Query and Receive results of DynamoDB Table records DynamoDB Tables. */ diff --git a/source/packages/@ada/infra/src/common/constructs/secret-manager/secret-manager-store.ts b/source/packages/@ada/infra/src/common/constructs/secret-manager/secret-manager-store.ts index 022f92f..da8ebda 100644 --- a/source/packages/@ada/infra/src/common/constructs/secret-manager/secret-manager-store.ts +++ b/source/packages/@ada/infra/src/common/constructs/secret-manager/secret-manager-store.ts @@ -2,7 +2,7 @@ SPDX-License-Identifier: Apache-2.0 */ import { Construct } from 'constructs'; import { CustomResource, Duration } from 'aws-cdk-lib'; -import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { Effect, PolicyStatement, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { Key } from 'aws-cdk-lib/aws-kms'; import { Provider } from 'aws-cdk-lib/custom-resources'; import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; @@ -47,12 +47,22 @@ export class CustomResourceSecretsManagerStore extends Construct { ], resources: [secret.secretFullArn!], }), + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ['secretsmanager:GetRandomPassword'], + resources: ['*'], + }), ], }); + rotationHandler.addPermission('rotationHandlerPermission', { + principal: new ServicePrincipal('secretsmanager.amazonaws.com'), + }); + secret.addRotationSchedule('AutoRotateSecret', { automaticallyAfter: Duration.days(90), rotationLambda: rotationHandler, + rotateImmediatelyOnUpdate: false, }); const handler = new TypescriptFunction(this, 'WriteLambda', { diff --git a/source/packages/@ada/infra/src/common/services/testing/default-entities/data-product.ts b/source/packages/@ada/infra/src/common/services/testing/default-entities/data-product.ts index 334891e..bd06dbd 100644 --- a/source/packages/@ada/infra/src/common/services/testing/default-entities/data-product.ts +++ b/source/packages/@ada/infra/src/common/services/testing/default-entities/data-product.ts @@ -222,6 +222,13 @@ export const TEST_STATIC_INFRASTRUCTURE: StaticInfra.IStaticParams = { ecsTaskRole: 'arn:aws:iam::11111111111:role/test-role', }, }, + redshiftConnector: { + importDataStateMachineArn: 'arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachineImport', + lastUpdatedDetailTableName: 'DynamoDBTableName', + otherArns: { + ecsTaskRole: 'arn:aws:iam::11111111111:role/test-role', + }, + }, mongoDBConnector: { importDataStateMachineArn: 'arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachineImport', lastUpdatedDetailTableName: 'DynamoDBTableName', diff --git a/source/packages/@ada/infra/src/common/services/testing/environment/build-cdk-environment.ts b/source/packages/@ada/infra/src/common/services/testing/environment/build-cdk-environment.ts index 452618e..6f319de 100644 --- a/source/packages/@ada/infra/src/common/services/testing/environment/build-cdk-environment.ts +++ b/source/packages/@ada/infra/src/common/services/testing/environment/build-cdk-environment.ts @@ -150,6 +150,9 @@ export interface CdkEnvironmentForTests { readonly environmentVariables: { [key: string]: string }; readonly port: number; readonly serviceNestedStack: NestedStack; + readonly installerConfig: { + downloadUrl: string; + }, } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -215,6 +218,11 @@ export const buildCdkEnvironmentForTests = { - fs.writeJsonSync(path, { tables, port, environmentVariables }, { spaces: 2 }); + fs.writeJsonSync(path, { tables, port, environmentVariables, installerConfig }, { spaces: 2 }); }; diff --git a/source/packages/@ada/infra/src/common/utils/metrics.ts b/source/packages/@ada/infra/src/common/utils/metrics.ts index db6d8d7..28e0909 100644 --- a/source/packages/@ada/infra/src/common/utils/metrics.ts +++ b/source/packages/@ada/infra/src/common/utils/metrics.ts @@ -36,17 +36,17 @@ export async function sendAnonymousMetric(payload: MetricsPayload): Promise[^/]+)(?:\/(?.+))?$/; -export const PATTERN_CLOUDTRAIL_ARN = /^arn:aws:cloudtrail:[\w-]+:[\d]+:trail\/[\w.-]+$/; +export const PATTERN_CLOUDTRAIL_ARN = /^arn:aws:cloudtrail:[\w-]+:\d+:trail\/[\w.-]+$/; export const PATTERN_ROLE_ARN = /^arn:aws:iam::\d{12}:role\/([A-Za-z0-9-]+)$/; diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/docker-image/import.py b/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/docker-image/import.py index 3056d2e..a28b1cc 100644 --- a/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/docker-image/import.py +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/docker-image/import.py @@ -248,7 +248,7 @@ def execute(self): self._import_data(last_updated_date, date_to, self._cloudtrail_event_types) - except (TypeError, parser.ParserError) as error: + except (TypeError, parser.ParserError): raise DateRangeException("Last Updated Timestamp error") def _import_data(self, date_from, date_to, event_types) -> None: diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/index.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/index.ts index 4c1daf5..8d667ac 100644 --- a/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/index.ts +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_cloudtrail/index.ts @@ -215,7 +215,7 @@ export const CONNECTOR: Connectors.IConnector None: + + if endpoint is None or endpoint == '': + raise MissingParameterException("Endpoint is missing") + if port is None or port == '': + raise MissingParameterException("Port is missing") + if database is None or database == '': + raise MissingParameterException("Database name is missing") + if table is None or table == '': + raise MissingParameterException("Database name is missing") + if database_type != 'Cluster' and (workgroup is None or workgroup == ''): + raise MissingParameterException("Workgroup is required for Redshift Serverless") + if database_type == 'Cluster' and (username is None or username == ''): + raise MissingParameterException("Database username is required for Redshift Cluster") + if database_type == 'Cluster' and (cluster_identifier is None or cluster_identifier == ''): + raise MissingParameterException("Cluster identifier is required for Redshift Cluster") + if s3_output_uri is None or s3_output_uri == '': + raise MissingParameterException("S3 Bucket URI is missing") + if last_updated_table_name is None or last_updated_table_name == '': + raise MissingParameterException("Last Updated Detail Table Name is missing") + if data_product_id is None or data_product_id == '': + raise MissingParameterException("Data Product ID is missing") + if domain_id is None or domain_id == '': + raise MissingParameterException("Domain Id is missing") + if trigger_type is None or trigger_type == '': + raise MissingParameterException("Trigger Type is missing") + + self._endpoint = endpoint + self._port = int(port) + self._database = database + self._table = table.replace('`', '') + + self._database_type = database_type + + self._workgroup = workgroup + + self._username = username + self._cluster_identifier = cluster_identifier + + self._s3_output_uri = s3_output_uri + self._ddb_client = boto3.client("dynamodb") + self._last_updated_table_name = last_updated_table_name + self._data_product_id = data_product_id + self._domain_id = domain_id + self._trigger_type = trigger_type + + self._sts_client = boto3.client("sts") + + session_name = str(datetime.now()).replace(' ', '-').replace(':', '-').replace('.', '-') + self._range_filename = session_name + self._redshift_client = self._get_redshift_client(database_type, session_name, self._endpoint, cross_account_access_role) + + def execute(self): + result_count = self._import_data() + self._update_last_updated_timestamp(result_count) + + def _import_data(self): + print(f"Getting temporary credential") + + creds = self._get_creds() + + print(f"Connecting to {self._endpoint}") + + with redshift_connector.connect( + host=self._endpoint, + port=self._port, + user=creds['username'], + password=creds['password'], + database=self._database + ) as conn: + + with conn.cursor() as cursor: + query = f'SELECT * FROM {self._table}' + print(f"Executing query: {query}") + + cursor.execute(query) + + result = cursor.fetch_dataframe() + + num_records = len(result.index) + + print(f"Writing {num_records} records") + + self._write_data(result) + return num_records + + def _write_data(self, data: pd.DataFrame) -> None: + file_name = f'{self._s3_output_uri}{self._range_filename}.parquet' + print('Filename: ', file_name) + wr.s3.to_parquet( + df=data, + path=file_name, + ) + + def _update_last_updated_timestamp(self, result_count) -> None: + print(f"Updating last update timestamp with: {self._range_filename}") + self._ddb_client.put_item( + TableName=self._last_updated_table_name, + Item={ + 'dataProductId': {'S': self._data_product_id}, + 'domainId': {'S': self._domain_id}, + 'timestamp': {'S': str(self._range_filename)}, + 'num_rows': {'S': str(result_count)}, + } + ) + + def _get_redshift_client(self, database_type: str, session_name: str, endpoint: str, cross_account_access_role: str): + boto3_session = self._get_boto3_session(session_name, cross_account_access_role) + + client_config = self._get_client_config(endpoint) + + if database_type == 'Cluster': + return boto3_session.client('redshift', config=client_config) + + return boto3_session.client('redshift-serverless', config=client_config) + + def _get_boto3_session(self, session_name: str, cross_account_access_role: str): + + if not cross_account_access_role: + return boto3 + + print(f"Assuming Cross account access role {cross_account_access_role}") + + assumed_role = self._sts_client.assume_role( + RoleArn=cross_account_access_role, + RoleSessionName=session_name, + Tags=[ + {'Key': 'ada:service', 'Value': 'data-product'} + ] + ) + credentials = assumed_role['Credentials'] + return boto3.session.Session( + aws_access_key_id=credentials['AccessKeyId'], + aws_secret_access_key=credentials['SecretAccessKey'], + aws_session_token=credentials['SessionToken'], + ) + + def _get_client_config(self, endpoint: str): + region = endpoint.split('.')[-4] + + print(f"Client config region {region}") + + return Config( + region_name=region, + signature_version='v4' + ) + + def _get_creds(self): + if self._database_type == 'Cluster': + creds = self._redshift_client.get_cluster_credentials(DbUser=self._username, + DbName=self._database, + ClusterIdentifier=self._cluster_identifier, + AutoCreate=False, + DurationSeconds=3600 + ) + + return { + 'username': creds['DbUser'], + 'password': creds['DbPassword'], + } + + creds = self._redshift_client.get_credentials(dbName=self._database, + durationSeconds=3600, + workgroupName=self._workgroup + ) + + return { + 'username': creds['dbUser'], + 'password': creds['dbPassword'], + } + +if __name__ == "__main__": + redshift_import = RedshiftImport(ENDPOINT, + PORT, + DATABASE_NAME, + DATABASE_TABLE, + DATABASE_TYPE, + WORKGROUP, + DATABASE_USERNAME, + CLUSTER_IDENTIFIER, + CROSS_ACCOUNT_ACCESS_ROLE, + S3_OUTPUT_BUCKET_URI, + TABLE_NAME, + DATA_PRODUCT_ID, + DOMAIN_ID, + TRIGGER_TYPE) + + print("Executing RedshiftImport") + redshift_import.execute() + \ No newline at end of file diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/requirements.txt b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/requirements.txt new file mode 100644 index 0000000..058cf46 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/requirements.txt @@ -0,0 +1,2 @@ +awswrangler==2.17.0 +redshift_connector==2.0.905 diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/script.sh b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/script.sh new file mode 100755 index 0000000..2ac1055 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/script.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +# This script is meant to run in ECS + +echo "starting import ..." + +python3 redshift_data_import.py + +echo "done import" diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/test_redshift_data_import.py b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/test_redshift_data_import.py new file mode 100644 index 0000000..5cbb486 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/docker-image/test_redshift_data_import.py @@ -0,0 +1,368 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### +from datetime import datetime +import boto3 +from botocore.stub import Stubber +import os + +from moto import mock_dynamodb, mock_s3, mock_sts +from unittest.mock import MagicMock +import pytest +import pandas as pd +from assertpy import assert_that +from dateutil import parser +from redshift_data_import import RedshiftImport, MissingParameterException + +_TABLE_NAME = "lastupdatedtable" + +_DATA_PRODUCT_ID = "dataproduct3" +_DOMAIN_ID = "domain3" +_DATABASE_NAME = 'dev' +_USERNAME='awsuser' +_CLUSETR_IDENTIFIER='test-redshift-cluster' +_WORKGROUP = 'default' +_TEST_DATETIME = datetime(2000, 1, 1) + +_TEST_DATA = pd.DataFrame({ + 'Column1': ['11', '21'], + 'Column2': ['12', '22'] +}) + +@pytest.fixture +def boto3_redshift_serverless_client(): + client = boto3.client('redshift-serverless') + stubber = Stubber(client) + expected_params = { + "dbName": _DATABASE_NAME, + "durationSeconds": 3600, + "workgroupName": _WORKGROUP + } + stubber.add_response('get_credentials', { + "dbUser": "username", + "dbPassword": "password" + }, expected_params) + stubber.activate() + return client + +@pytest.fixture +def boto3_redshift_cluster_client(): + client = boto3.client('redshift') + stubber = Stubber(client) + expected_params = { + "DbUser": _USERNAME, + "DbName": _DATABASE_NAME, + "ClusterIdentifier": _CLUSETR_IDENTIFIER, + "AutoCreate": False, + "DurationSeconds": 3600 + } + stubber.add_response('get_cluster_credentials', { + "DbUser": "username", + "DbPassword": "password" + }, expected_params) + stubber.activate() + return client + +@pytest.fixture +def boto3_ddb_client(): + client = boto3.client('dynamodb') + stubber = Stubber(client) + expected_params = { + "TableName": _TABLE_NAME, + "Item": { + "dataProductId": {"S": _DATA_PRODUCT_ID}, + "domainId": {"S": _DOMAIN_ID}, + "timestamp": {"S": '2000-01-01-00-00-00'}, + "num_rows": {"S": '2'}, + } + } + stubber.add_response('put_item', {}, expected_params) + stubber.activate() + return client + +@pytest.fixture +def boto3_sts_client(): + client = boto3.client('sts') + stubber = Stubber(client) + stubber.activate() + return client + +@pytest.fixture +def redshift_connection(): + mock_conn = MagicMock() + mock_cursor = mock_conn.__enter__.return_value.cursor.return_value + mock_cursor.__enter__.return_value.execute.return_value = None + mock_cursor.__enter__.return_value.fetch_dataframe.return_value = _TEST_DATA + return mock_conn + +def test_ondemand_data_import_with_redshift_serverless( + mocker, boto3_redshift_serverless_client, boto3_ddb_client, boto3_sts_client, redshift_connection +): + mocker.patch("redshift_data_import.boto3.client", side_effect=[boto3_ddb_client, boto3_sts_client, boto3_redshift_serverless_client]) + mocker.patch("redshift_data_import.redshift_connector.connect").return_value = redshift_connection + mocker.patch("redshift_data_import.wr.s3.to_parquet") + mocker.patch("redshift_data_import.datetime").now.return_value = _TEST_DATETIME + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "", + "s3://ada-testing-bucket", + _TABLE_NAME, + _DATA_PRODUCT_ID, + _DOMAIN_ID, + "SCHEDULE" + ) + redshift.execute() + +def test_ondemand_data_import_with_redshift_cluster( + mocker, boto3_redshift_cluster_client, boto3_ddb_client, boto3_sts_client, redshift_connection +): + mocker.patch("redshift_data_import.boto3.client", side_effect=[boto3_ddb_client, boto3_sts_client, boto3_redshift_cluster_client]) + mocker.patch("redshift_data_import.redshift_connector.connect").return_value = redshift_connection + mocker.patch("redshift_data_import.wr.s3.to_parquet") + mocker.patch("redshift_data_import.datetime").now.return_value = _TEST_DATETIME + + redshift = RedshiftImport( + "test-redshift-cluster.c9reiliclukz.us-east-1.redshift.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Cluster", + "", + _USERNAME, + _CLUSETR_IDENTIFIER, + "", + "s3://ada-testing-bucket", + _TABLE_NAME, + _DATA_PRODUCT_ID, + _DOMAIN_ID, + "SCHEDULE" + ) + redshift.execute() + +def test_missing_database_endpoint_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_database_port_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_database_name_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + "", + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_database_table_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_database_type_serverless_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "", + "", + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_database_type_cluster_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "test-redshift-cluster.c9reiliclukz.us-east-1.redshift.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Cluster", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_s3_output_uri_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "", + _TABLE_NAME, + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_table_name_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + "", + "dataproduct1", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_domain_id_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_data_product_id_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + _DATABASE_NAME, + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "", + "domain1", + "SCHEDULE" + ) + redshift.execute() + +def test_missing_trigger_type_raises_exception(): + with pytest.raises(MissingParameterException): + redshift = RedshiftImport( + "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "5439", + "", + "sample_data_dev", + "Serverless", + _WORKGROUP, + "", + "", + "arn:aws:iam::111111111111:role/xacctrole", + "s3://ada-testing-bucket", + _TABLE_NAME, + "dataproduct1", + "domain1", + "", + ) + redshift.execute() diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/index.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/index.ts new file mode 100644 index 0000000..39ac2ca --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/index.ts @@ -0,0 +1,330 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { Connectors } from '@ada/connectors/interface'; +import { PATTERN_DB_PORT, PATTERN_NOT_EMPTY, PATTERN_REDSHIFT_HOST, PATTERN_ROLE_ARN, TEXT_FIELD } from './constants'; + +/** + * Unique identitifier for this connector + * @required + */ +export const ID = 'REDSHIFT' as const; + +const DATABASE_TYPE_FIELD_NAME = 'sourceDetails.isRedshiftServerless'; + +/** + * Interface for the "sourceDetails" of data products of this connector + * @required + */ +export interface ISourceDetails__REDSHIFT { + databaseEndpoint: string; + databasePort: string; + databaseTable: string; + databaseName: string; + databaseType: string; + databaseUsername: string; + clusterIdentifier: string; + workgroup: string; + crossAccountRoleArn: string; +} + +/** + * Interface for the "sourceDetails" wizard form data of data products of this connector + * @required + */ +export type IFormData__REDSHIFT = Connectors.IFormData<{ + databaseEndpoint: string; + databasePort: string; + databaseName: string; + databaseTable: string; + isRedshiftServerless: boolean; + databaseUsername: string; + clusterIdentifier: string; + workgroup: string; + crossAccountRoleArn: string; +}>; + +/** + * Connector definition + * @required + */ +export const CONNECTOR: Connectors.IConnector = { + ID, + FOLDER: 'amazon_redshift', + DOCKER_IMAGE: ['amazon-redshift-connector', 'sources/amazon_redshift/docker-image'] as const, + + // Interface references - used for typecasting only + ISourceDetails: {} as ISourceDetails__REDSHIFT, + ISourceDetailsFormData: {} as IFormData__REDSHIFT, + + METADATA: { + label: 'Amazon Redshift', + description: 'Data product from Amazon Redshift cluster or Amazon Redshift Serverless', + icon: ID, // NB: icons are stored in @ada/website referenced by ID + }, + + CONFIG: { + stability: Connectors.Stability.STABLE, + + supports: { + preview: true, + automaticTransforms: false, + customTransforms: true, + updateTriggers: { + AUTOMATIC: false, + ON_DEMAND: true, + SCHEDULE: true, + }, + updateTriggerScheduleRate: { + HOURLY: true, + DAILY: true, + WEEKLY: true, + MONTHLY: true, + CUSTOM: true, + }, + updateTriggerUpdatePolicy: { + APPEND: false, + REPLACE: true, + }, + source: { + query: true, + }, + }, + }, + + SCHEMA: { + id: `Connector_${ID}`, + type: 'object', + properties: { + databaseEndpoint: { + type: 'string', + ...PATTERN_REDSHIFT_HOST, + }, + databasePort: { + type: 'string', + ...PATTERN_DB_PORT, + }, + databaseName: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + databaseTable: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + databaseType: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + databaseUsername: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + clusterIdentifier: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + workgroup: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + crossAccountRoleArn: { + type: 'string', + ...PATTERN_ROLE_ARN, + }, + }, + required: ['databaseEndpoint', 'databasePort', 'databaseName', 'databaseTable'], + }, + VIEW: { + Wizard: { + fields: [ + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseEndpoint', + label: 'Redshift Endpoint', + description: + 'Enter the endpoint for Amazon Redshift Cluster or Amazon Redshift Serverless. Ensure the network connectivity has been correctly set up.', + placeholder: '', + helperText: 'E.g., default.123456789012.us-east-1.redshift-serverless.amazonaws.com', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_REDSHIFT_HOST, + message: 'Must be a valid Redshift endpiont', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databasePort', + label: 'Database Port', + description: 'Enter the database port for Amazon Redshift cluster or Amazon Redshift Serverless', + placeholder: '5439', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_DB_PORT, + message: 'Must be 0 to 65535', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseName', + label: 'Database Name', + description: 'Enter the name of the database to be imported', + placeholder: 'dev', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseTable', + label: 'Database Table', + description: 'Enter the name of the table to be imported from the database', + placeholder: '', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + ], + }, + { + component: 'switch', + name: DATABASE_TYPE_FIELD_NAME, + label: 'Is the database Amazon Redshift Serverless?', + initialValue: true, + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.workgroup', + label: 'Redshift Serverless Workgroup', + description: + 'Enter workgroup name for Amazon Redshift Serverless', + placeholder: 'default', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + ], + condition: { when: DATABASE_TYPE_FIELD_NAME, is: true, then: { visible: true}, else: { visible: false } } + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseUsername', + label: 'Redshift Cluster Username', + description: + 'Enter username for Amazon Redshift Cluster', + placeholder: 'awsuser', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + ], + condition: { when: DATABASE_TYPE_FIELD_NAME, is: false, then: { visible: true}, else: { visible: false } } + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.clusterIdentifier', + label: 'Redshift Cluster Identifier', + description: + 'Enter Cluster Identifier for Amazon Redshift Cluster', + placeholder: '', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + ], + condition: { when: DATABASE_TYPE_FIELD_NAME, is: false, then: { visible: true}, else: { visible: false } } + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.crossAccountRoleArn', + label: 'Redshift Cross Account Access IAM Role ARN', + description: + 'Enter the arn of the IAM Role that is granted for accessing the Redshift in the source account. The IAM role must have permission to access Redshift database that will be imported', + placeholder: 'arn:aws:iam:::role/', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'pattern', + pattern: PATTERN_ROLE_ARN, + message: 'Must be a valid Role ARN', + }, + ], + }, + ], + sourceDetailsFormDataToInputData: ({ + sourceDetails: { databaseEndpoint, databasePort, + databaseName, + databaseTable, + workgroup, + isRedshiftServerless, + databaseUsername, + clusterIdentifier, + crossAccountRoleArn}, + }) => { + return { + databaseEndpoint, + databasePort, + databaseName, + databaseTable, + databaseType: isRedshiftServerless ? 'Serverless' : 'Cluster', + databaseUsername: databaseUsername || '', + clusterIdentifier: clusterIdentifier || '', + workgroup: workgroup || '', + crossAccountRoleArn: crossAccountRoleArn || '', + }; + }, + }, + Summary: { + properties: [ + { key: 'databaseEndpoint', label: 'Database Endpoint' }, + { key: 'databasePort', label: 'Database Port' }, + { key: 'databaseName', label: 'Database Name' }, + { key: 'databaseTable', label: 'Database Table' }, + { key: 'databaseType', label: 'Redshift Database Type'}, + { key: 'workgroup', label: 'Redshift Serverless Workgroup' }, + { key: 'databaseUsername', label: 'Redshift Cluster Username' }, + { key: 'clusterIdentifier', label: 'Redshift Cluster Identifier' }, + { key: 'crossAccountRoleArn', label: 'IAM Role Arn for Cross account access' }, + ], + }, + }, +}; + +//////////////////////////////////////////////////////////////// +// REGISTER CONNECTOR - DO NOT EDIT BELOW THIS LINE +//////////////////////////////////////////////////////////////// +Connectors.register(CONNECTOR); + +export type ISourceDetails = typeof CONNECTOR['ISourceDetails']; +export type ISourceDetailsFormData = typeof CONNECTOR['ISourceDetailsFormData']; + +declare module '@ada/connectors/interface' { + interface CONNECTOR_REGISTRY { + [ID]: typeof CONNECTOR; + } +} diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/__snapshots__/stack.test.ts.snap b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/__snapshots__/stack.test.ts.snap new file mode 100644 index 0000000..1921c84 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/__snapshots__/stack.test.ts.snap @@ -0,0 +1,762 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`stack/synthesizer/redshift snapshot 1`] = ` +Object { + "Outputs": Object { + "StateMachineArn": Object { + "Export": Object { + "Name": "DataImportStateMachineArn-test-d4688test-d45928737", + }, + "Value": Object { + "Ref": "StateMachine2E01A3A5", + }, + }, + }, + "Parameters": Object {}, + "Resources": Object { + "ArbitraryTransformsTransformJobsAndCrawlersTransformJobglobaladajsonrelationalise0JobAB08D24E": Object { + "Properties": Object { + "Command": Object { + "Name": "glueetl", + "PythonVersion": "3", + "ScriptLocation": "s3://script-bucket/transform_wrapper/transform_wrapper.py", + }, + "DefaultArguments": Object { + "--INPUT_ARGS": "{}", + "--additional-python-modules": "awswrangler", + "--extra-py-files": "s3://script-bucket/scripts/global/ada_json_relationalise/transform_script.py", + }, + "ExecutionProperty": Object { + "MaxConcurrentRuns": 1000, + }, + "GlueVersion": "3.0", + "Name": "test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SecurityConfiguration": "glueSecurityConfiguration", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + }, + "Type": "AWS::Glue::Job", + }, + "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler0Crawler1DA2C7B0": Object { + "Properties": Object { + "Classifiers": Array [], + "CrawlerSecurityConfiguration": "glueSecurityConfiguration", + "DatabaseName": "rawDB", + "Name": "test-d4688test-d45928737-transform-0--crawler", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SchemaChangePolicy": Object { + "DeleteBehavior": "DEPRECATE_IN_DATABASE", + "UpdateBehavior": "UPDATE_IN_DATABASE", + }, + "TablePrefix": "test-d4688test-d45928737-transform-0-", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + "Targets": Object { + "S3Targets": Array [ + Object { + "Path": "data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/", + }, + ], + }, + }, + "Type": "AWS::Glue::Crawler", + }, + "SourceAccessRoleC447CA39": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "glue.amazonaws.com", + }, + }, + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "states.ap-southeast-1.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Policies": Array [ + Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "logs:CreateLogGroup", + "logs:PutLogEvents", + "logs:CreateLogStream", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "glue:CreateTable", + "glue:CreateSchema", + "glue:CreatePartition*", + "glue:UpdateTable", + "glue:UpdateSchema", + "glue:UpdatePartition", + "glue:Get*", + "glue:BatchGet*", + "glue:BatchCreatePartition", + "glue:BatchUpdatePartition", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "ec2:CreateTags", + "ec2:DeleteTags", + ], + "Condition": Object { + "ForAllValues:StringEquals": Object { + "aws:TagKeys": Array [ + "aws-glue-service-resource", + ], + }, + }, + "Effect": "Allow", + "Resource": Array [ + "arn:aws:ec2:*:*:network-interface/*", + "arn:aws:ec2:*:*:security-group/*", + "arn:aws:ec2:*:*:instance/*", + ], + }, + Object { + "Action": Array [ + "glue:*", + "s3:GetBucketLocation", + "s3:ListBucket", + "s3:ListAllMyBuckets", + "s3:GetBucketAcl", + "ec2:DescribeVpcEndpoints", + "ec2:DescribeRouteTables", + "ec2:CreateNetworkInterface", + "ec2:DeleteNetworkInterface", + "ec2:DescribeNetworkInterfaces", + "ec2:DescribeSecurityGroups", + "ec2:DescribeSubnets", + "ec2:DescribeVpcAttribute", + "iam:ListRolePolicies", + "iam:GetRole", + "iam:GetRolePolicy", + "cloudwatch:PutMetricData", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "glueTransformsPolicy", + }, + ], + "Tags": Array [ + Object { + "Key": "ada:groups", + "Value": ":admin:analyst:", + }, + Object { + "Key": "ada:service", + "Value": "data-product", + }, + Object { + "Key": "ada:user", + "Value": "test-user", + }, + Object { + "Key": "Application", + "Value": "Ada", + }, + Object { + "Key": "DataProductId", + "Value": "test-data-product", + }, + Object { + "Key": "DomainId", + "Value": "test-domain", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "SourceAccessRoleDefaultPolicyADA23135": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::data-bucket", + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::data-bucket/test-domain/test-data-product/test-stack/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "kms:GenerateDataKey", + "kms:Decrypt", + "kms:Encrypt", + ], + "Effect": "Allow", + "Resource": "arn:aws:kms:us-east-1:123456789012:key/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::script-bucket", + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::script-bucket/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt*", + "kms:Encrypt*", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + "kms:Describe*", + "kms:List*", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "logs:CreateLogDelivery", + "logs:GetLogDelivery", + "logs:UpdateLogDelivery", + "logs:DeleteLogDelivery", + "logs:ListLogDeliveries", + "logs:PutResourcePolicy", + "logs:DescribeResourcePolicies", + "logs:DescribeLogGroups", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + "xray:GetSamplingRules", + "xray:GetSamplingTargets", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": Array [ + "arn:aws:lambda:ap-southeast-1:1111111111:test", + "arn:aws:lambda:ap-southeast-1:1111111111:test:*", + ], + }, + Object { + "Action": "states:StartExecution", + "Effect": "Allow", + "Resource": "arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachineImport", + }, + Object { + "Action": Array [ + "states:DescribeExecution", + "states:StopExecution", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:execution:TestStateMachineImport*", + ], + ], + }, + }, + Object { + "Action": Array [ + "events:PutTargets", + "events:PutRule", + "events:DescribeRule", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule", + ], + ], + }, + }, + Object { + "Action": "dynamodb:GetItem", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":dynamodb:ap-southeast-1:1111111111:table/DynamoDBTableName", + ], + ], + }, + }, + Object { + "Action": "states:StartExecution", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:stateMachine:glueCrawlerStateMachine", + ], + ], + }, + }, + Object { + "Action": Array [ + "states:DescribeExecution", + "states:StopExecution", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:execution:glueCrawlerStateMachine*", + ], + ], + }, + }, + Object { + "Action": "events:PutEvents", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus", + ], + ], + }, + }, + Object { + "Action": "states:StartExecution", + "Effect": "Allow", + "Resource": "arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachine", + }, + Object { + "Action": Array [ + "states:DescribeExecution", + "states:StopExecution", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:execution:TestStateMachine*", + ], + ], + }, + }, + Object { + "Action": Array [ + "glue:StartJobRun", + "glue:GetJobRun", + "glue:GetJobRuns", + "glue:BatchStopJobRun", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":glue:ap-southeast-1:1111111111:job/$.glueJobName", + ], + ], + }, + }, + Object { + "Action": Array [ + "glue:StartJobRun", + "glue:GetJobRun", + "glue:GetJobRuns", + "glue:BatchStopJobRun", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":glue:ap-southeast-1:1111111111:job/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0", + ], + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "SourceAccessRoleDefaultPolicyADA23135", + "Roles": Array [ + Object { + "Ref": "SourceAccessRoleC447CA39", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "StartCrawler29B459CE": Object { + "Properties": Object { + "Classifiers": Array [], + "CrawlerSecurityConfiguration": "glueSecurityConfiguration", + "DatabaseName": "rawDB", + "Name": "test-d4688test-d45928737-aws-redshift--crawler", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SchemaChangePolicy": Object { + "DeleteBehavior": "DEPRECATE_IN_DATABASE", + "UpdateBehavior": "UPDATE_IN_DATABASE", + }, + "TablePrefix": "test-d4688test-d45928737-aws-redshift-", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + "Targets": Object { + "S3Targets": Array [ + Object { + "Path": "data-bucket/test-domain/test-data-product/test-stack/aws-redshift-import", + }, + ], + }, + }, + "Type": "AWS::Glue::Crawler", + }, + "StateMachine2E01A3A5": Object { + "DeletionPolicy": "Delete", + "DependsOn": Array [ + "SourceAccessRoleDefaultPolicyADA23135", + "SourceAccessRoleC447CA39", + ], + "Properties": Object { + "DefinitionString": Object { + "Fn::Join": Array [ + "", + Array [ + "{\\"StartAt\\":\\"PrepareImportExternal\\",\\"States\\":{\\"PrepareImportExternal\\":{\\"Next\\":\\"ImportRedshiftData\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"crawlerName\\":\\"test-d4688test-d45928737-aws-redshift--crawler\\",\\"tablePrefix\\":\\"test-d4688test-d45928737-aws-redshift-\\",\\"outputS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/aws-redshift-import\\",\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"REDSHIFT\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\"}}}}}},\\"ImportRedshiftData\\":{\\"Next\\":\\"VerifyImportStatus\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.ImportOutput\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"dataProductId\\":\\"test-data-product\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\",\\"domainId\\":\\"test-domain\\",\\"triggerType\\":\\"ON_DEMAND\\",\\"scheduleRate\\":\\"\\",\\"tableName\\":\\"DynamoDBTableName\\",\\"s3OutputPath.$\\":\\"$.Payload.outputS3Path\\"},\\"StateMachineArn\\":\\"arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachineImport\\"}},\\"VerifyImportStatus\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Not\\":{\\"Variable\\":\\"$.ImportOutput.Output.status\\",\\"StringEquals\\":\\"SUCCEEDED\\"},\\"Next\\":\\"DeconstructErrorFromStateMachineExecution\\"}],\\"Default\\":\\"GetNumLastUpdatedData\\"},\\"GetNumLastUpdatedData\\":{\\"Next\\":\\"IsUpdateNeeded\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.taskresult\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::dynamodb:getItem\\",\\"Parameters\\":{\\"Key\\":{\\"dataProductId\\":{\\"S\\":\\"test-data-product\\"},\\"domainId\\":{\\"S\\":\\"test-domain\\"}},\\"TableName\\":\\"DynamoDBTableName\\",\\"ConsistentRead\\":false}},\\"IsUpdateNeeded\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.taskresult.Item.num_rows.S\\",\\"StringEquals\\":\\"0\\",\\"Next\\":\\"NotifyForSuccessNoUpdate\\"}],\\"Default\\":\\"ExecuteCrawlertest-d4688test-d45928737-aws-redshift--crawler\\"},\\"ExecuteCrawlertest-d4688test-d45928737-aws-redshift--crawler\\":{\\"Next\\":\\"VerifyCrawlerStepFunctionOutput\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.CrawlerOutput\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input\\":{\\"crawlerName\\":\\"test-d4688test-d45928737-aws-redshift--crawler\\"},\\"StateMachineArn\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:stateMachine:glueCrawlerStateMachine\\"}},\\"VerifyCrawlerStepFunctionOutput\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.CrawlerOutput.Output.Payload.status\\",\\"StringEquals\\":\\"FAILED\\",\\"Next\\":\\"DeconstructErrorFromCrawlerOutput\\"}],\\"Default\\":\\"GetCrawledTableDetailsForTableDetails\\"},\\"GetCrawledTableDetailsForTableDetails\\":{\\"Next\\":\\"PrepareTransformChain\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\"}}}},\\"PrepareTransformChain\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"REDSHIFT\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload.$\\":\\"$\\"}},\\"GetCrawledTransformOutputTableDetails\\":{\\"Next\\":\\"PrepareNextTransform\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tablePrefix.$\\":\\"$.Payload.currentTransformJob.outputCrawlerTablePrefix\\",\\"transformJobs.$\\":\\"$.Payload.transformJobs\\",\\"transformJobIndex.$\\":\\"$.Payload.transformJobIndex\\",\\"transformJobCount.$\\":\\"$.Payload.transformJobCount\\",\\"currentTransformJob.$\\":\\"$.Payload.currentTransformJob\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"REDSHIFT\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\"}}}}}},\\"CrawlTransformOutput\\":{\\"Next\\":\\"GetCrawledTransformOutputTableDetails\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.currentTransformCrawlOutput\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input\\":{\\"crawlerName.$\\":\\"$.Payload.currentTransformJob.outputCrawlerName\\"},\\"StateMachineArn\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:stateMachine:glueCrawlerStateMachine\\"}},\\"RunTransformJobs\\":{\\"Type\\":\\"Map\\",\\"ResultPath\\":\\"$.Payload.currentTransformJobOutputs\\",\\"Next\\":\\"CrawlTransformOutput\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Iterator\\":{\\"StartAt\\":\\"RunTransformJob\\",\\"States\\":{\\"RunTransformJob\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.currentTransformJobOutput\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::glue:startJobRun.sync\\",\\"Parameters\\":{\\"JobName.$\\":\\"$.glueJobName\\",\\"Arguments\\":{\\"--INPUT_TABLE_NAME.$\\":\\"$.inputTableName\\",\\"--OUTPUT_S3_PATH.$\\":\\"$.outputS3TargetPath\\",\\"--DATABASE_NAME\\":\\"rawDB\\",\\"--DOMAIN_ID\\":\\"test-domain\\",\\"--DATA_PRODUCT_ID\\":\\"test-data-product\\",\\"--TEMP_S3_PATH.$\\":\\"$.tempS3Path\\"}}}}},\\"ItemsPath\\":\\"$.Payload.currentResolvedTransformJobs\\"},\\"IsTransformRemaining?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.Payload.transformJobIndex\\",\\"NumericLessThanPath\\":\\"$.Payload.transformJobCount\\",\\"Next\\":\\"RunTransformJobs\\"}],\\"Default\\":\\"IsAutomaticPiiEnabled?\\"},\\"IsAutomaticPiiEnabled?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.Payload.dataProduct.enableAutomaticPii\\",\\"BooleanEquals\\":true,\\"Next\\":\\"GeneratePiiQuery\\"}],\\"Default\\":\\"NotifyForSuccess\\"},\\"NotifyForSuccess\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"REDSHIFT\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"dataProductCompositeIdentifier\\":\\"test-domain.test-data-product\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\"},\\"DetailType\\":\\"DataProductImportSuccess\\",\\"EventBusName\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus\\",\\"Source\\":\\"ada.data-products\\"}]}},\\"GetPiiResultsFromAthena\\":{\\"Next\\":\\"NotifyForSuccess\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.tableDetails\\",\\"Resource\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Parameters\\":{\\"Payload\\":{\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"executePiiDetectionOutput.$\\":\\"$.Payload.executePiiDetectionOutput\\"}}},\\"ExecutePiiQueryForAllTables\\":{\\"Type\\":\\"Map\\",\\"ResultPath\\":\\"$.Payload.executePiiDetectionOutput\\",\\"Next\\":\\"GetPiiResultsFromAthena\\",\\"InputPath\\":\\"$.Payload.generatePiiQueryOutput.piiQuery\\",\\"Parameters\\":{\\"contextIndex.$\\":\\"$$.Map.Item.Index\\",\\"query.$\\":\\"$$.Map.Item.Value\\",\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"outputS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/_pii-detection-output\\"},\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Iterator\\":{\\"StartAt\\":\\"IsQueryNotEmpty?\\",\\"States\\":{\\"IsQueryNotEmpty?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Not\\":{\\"Variable\\":\\"$.query\\",\\"StringEquals\\":\\"\\"},\\"Next\\":\\"ExecuteQueryForPIIDetection\\"}],\\"Default\\":\\"SkipPiiDetection\\"},\\"SkipPiiDetection\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"piiDetectionSkipped\\":true},\\"End\\":true},\\"ExecuteQueryForPIIDetection\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input.$\\":\\"$\\",\\"StateMachineArn\\":\\"arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachine\\"}}}}},\\"GeneratePiiQuery\\":{\\"Next\\":\\"ExecutePiiQueryForAllTables\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.generatePiiQueryOutput\\",\\"Resource\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Parameters\\":{\\"Payload\\":{\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"athenaUtilitiesLambdaName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"databaseName\\":\\"rawDB\\"}}},\\"NotifyForError\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"REDSHIFT\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"executionId.$\\":\\"$$.Execution.Id\\",\\"errorDetails.$\\":\\"$.ErrorDetails\\",\\"currentPayload.$\\":\\"$\\"},\\"DetailType\\":\\"DataProductImportError\\",\\"EventBusName\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus\\",\\"Source\\":\\"ada.data-products\\"}]}},\\"DeconstructErrorFromStateMachineExecution\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"ErrorDetails\\":{\\"Error.$\\":\\"$.ImportOutput.Output.error\\",\\"Cause.$\\":\\"$.ImportOutput.Output.details.Cause\\"}},\\"Next\\":\\"NotifyForError\\"},\\"DeconstructErrorFromCrawlerOutput\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"ErrorDetails\\":{\\"Error.$\\":\\"$.CrawlerOutput.Output.Payload.error\\"}},\\"Next\\":\\"NotifyForError\\"},\\"NotifyForSuccessNoUpdate\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"REDSHIFT\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"default.123456789012.us-east-1.redshift-serverless.amazonaws.com\\",\\"databasePort\\":\\"5439\\",\\"databaseName\\":\\"dev\\",\\"databaseTable\\":\\"test_data\\",\\"databaseType\\":\\"Serverless\\",\\"workgroup\\":\\"default\\",\\"databaseUsername\\":\\"\\",\\"clusterIdentifier\\":\\"\\",\\"crossAccountRoleArn\\":\\"arn:aws:iam::11111111111:role/Redshift-Access-Role\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"dataProductCompositeIdentifier\\":\\"test-domain.test-data-product\\"},\\"DetailType\\":\\"DataProductImportSuccessNoUpdate\\",\\"EventBusName\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus\\",\\"Source\\":\\"ada.data-products\\"}]}}}}", + ], + ], + }, + "LoggingConfiguration": Object { + "Destinations": Array [ + Object { + "CloudWatchLogsLogGroup": Object { + "LogGroupArn": Object { + "Fn::GetAtt": Array [ + "StateMachineLogs3CB16D3C", + "Arn", + ], + }, + }, + }, + ], + "Level": "ERROR", + }, + "RoleArn": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + Object { + "Key": "DataProductId", + "Value": "test-data-product", + }, + Object { + "Key": "DomainId", + "Value": "test-domain", + }, + ], + "TracingConfiguration": Object { + "Enabled": true, + }, + }, + "Type": "AWS::StepFunctions::StateMachine", + "UpdateReplacePolicy": "Delete", + }, + "StateMachineLogs3CB16D3C": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "LogGroupName": "/aws/vendedlogs/states/ada/dataproduct/test-d4688test-d45928737/StateMachineLogs/loggroup-######", + "RetentionInDays": 731, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + Object { + "Key": "DataProductId", + "Value": "test-data-product", + }, + Object { + "Key": "DomainId", + "Value": "test-domain", + }, + ], + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "StaticInfrastructureNotificationBusDataProductOnDemandUpdateRuleCBE74CDB": Object { + "Properties": Object { + "Description": "On demand updates for Test", + "EventBusName": "eventBus", + "EventPattern": Object { + "detail": Object { + "dataProductId": Array [ + "test-data-product", + ], + "domainId": Array [ + "test-domain", + ], + }, + "detail-type": Array [ + "DataProductOnDemandUpdate", + ], + "source": Array [ + "ada.data-products", + ], + }, + "State": "ENABLED", + "Targets": Array [ + Object { + "Arn": "arn:aws:lambda:ap-southeast-1:1111111111:test", + "Id": "Target0", + "Input": Object { + "Fn::Join": Array [ + "", + Array [ + "{\\"stateMachineArn\\":\\"", + Object { + "Ref": "StateMachine2E01A3A5", + }, + "\\",\\"dataProductIdentifier\\":{\\"domainId\\":\\"test-domain\\",\\"dataProductId\\":\\"test-data-product\\"},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"}}", + ], + ], + }, + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + }, + "Rules": Object {}, +} +`; diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.test.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.test.ts new file mode 100644 index 0000000..5bd7e2e --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.test.ts @@ -0,0 +1,114 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { TestApp as App, TEST_ENVIRONMENT, cleanTemplateForSnapshot } from '@ada/cdk-core'; +import { DEFAULT_CALLER, MOCK_BASE_DATAPRODUCT, TEST_STATIC_INFRASTRUCTURE } from '@ada/microservice-test-common'; +import { DataProductUpdateTriggerType } from '@ada/common'; +import { DynamicInfra } from '@ada/data-product-infra-types'; +import { ID } from '../..'; +import { ISourceDetails__REDSHIFT } from '../..'; +import { RedshiftSourceStack } from './stack'; +import { Template } from 'aws-cdk-lib/assertions'; +import { testSynthesizeConnectorStack } from '@ada/services/data-product/dynamic-infrastructure/synthesizers/testing/helpers'; + +const baseSourceDetails = { + databaseEndpoint: 'default.123456789012.us-east-1.redshift-serverless.amazonaws.com', + databasePort: '5439', + databaseName: 'dev', + databaseTable: 'test_data', + databaseType: 'Serverless', + workgroup: 'default', + databaseUsername: '', + clusterIdentifier: '', +} + +describe('redshift-source-stack', () => { + it.each([[DataProductUpdateTriggerType.ON_DEMAND]])( + 'should create resources with trigger type %s', + async (trigger) => { + const app = new App(); + const props: DynamicInfra.StackProps = { + env: TEST_ENVIRONMENT, + dataProduct: { + ...MOCK_BASE_DATAPRODUCT, + sourceDetails: { + ...baseSourceDetails, + }, + updateTrigger: { triggerType: trigger }, + enableAutomaticTransforms: true, + transforms: [ + { + scriptId: 'my-transform', + }, + ], + } as any, + callingUser: DEFAULT_CALLER, + staticInfrastructure: TEST_STATIC_INFRASTRUCTURE, + }; + + expect(() => Template.fromStack(new RedshiftSourceStack(app, 'test-stack', props))).not.toThrow(); + }, + ); + + it('should create resources schedule for cross account access', () => { + const app = new App(); + const props: DynamicInfra.StackProps = { + dataProduct: { + ...MOCK_BASE_DATAPRODUCT, + sourceDetails: { + ...baseSourceDetails, + crossAccountRoleArn: 'arn:aws:iam::11111111111:role/DynamoDB-FullAccess-For-Account', + }, + updateTrigger: { triggerType: DataProductUpdateTriggerType.SCHEDULE, scheduleRate: 'cron(0 12 * * ? *)' }, + enableAutomaticTransforms: true, + transforms: [ + { + scriptId: 'my-transform', + }, + ], + } as any, + callingUser: DEFAULT_CALLER, + staticInfrastructure: TEST_STATIC_INFRASTRUCTURE, + env: TEST_ENVIRONMENT, + }; + + expect(() => Template.fromStack(new RedshiftSourceStack(app, 'test-stack', props))).not.toThrow(); + }); + + it('unsupported trigger type should throw an error', () => { + const app = new App(); + const props: DynamicInfra.StackProps = { + dataProduct: { + ...MOCK_BASE_DATAPRODUCT, + sourceDetails: { + ...baseSourceDetails, + crossAccountRoleArn: 'arn:aws:iam::11111111111:role/DynamoDB-FullAccess-For-Account', + }, + updateTrigger: { triggerType: 'unknownTrigger' }, + transforms: [ + { + scriptId: 'my-transform', + }, + ], + } as any, + callingUser: DEFAULT_CALLER, + staticInfrastructure: TEST_STATIC_INFRASTRUCTURE, + env: TEST_ENVIRONMENT, + }; + + expect(() => Template.fromStack(new RedshiftSourceStack(app, 'test-stack', props))).toThrow(); + }); +}); + +describe('stack/synthesizer/redshift', () => { + it('snapshot', async () => { + const stack = await testSynthesizeConnectorStack({ + sourceType: ID, + sourceDetails: { + ...baseSourceDetails, + crossAccountRoleArn: 'arn:aws:iam::11111111111:role/Redshift-Access-Role', + } as ISourceDetails__REDSHIFT, + }); + + expect(cleanTemplateForSnapshot(Template.fromStack(stack).toJSON())).toMatchSnapshot(); + }); +}); diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.ts new file mode 100644 index 0000000..e5091c1 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/dynamic/stack.ts @@ -0,0 +1,59 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { AmazonNativeConnectorSourceTask } from '@ada/connectors/common/amazon/base-stack'; +import { Construct } from 'constructs'; +import { DynamicInfraStackProps } from '@ada/dynamic-infra/stacks/dynamic-infrastructure-stack-base'; +import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { ISourceDetails__REDSHIFT } from '@ada/connectors/sources/amazon_redshift'; +import { StaticInfra } from '@ada/infra-common/services'; + +/** + * Stack for dynamic infrastructure for a Redshift Data Product + */ +export class RedshiftSourceStack extends AmazonNativeConnectorSourceTask { + constructor(scope: Construct, id: string, props: DynamicInfraStackProps) { + const details = props.dataProduct.sourceDetails as ISourceDetails__REDSHIFT; + const updateTrigger = props.dataProduct.updateTrigger; + const { databaseEndpoint, databaseName, + databasePort, databaseTable, + databaseType, databaseUsername, + clusterIdentifier, workgroup, + crossAccountRoleArn } = details; + + super(scope, id, { + ...props, + connectorId: 'redshift', + connectorName: 'Amazon Redshift', + importStepName: 'ImportRedshiftData', + importDataStateAccessor: (refs: StaticInfra.Refs.IRecord) => refs.redshiftConnector.importDataStateMachine, + lastUpdatedDetailTableName: (refs: StaticInfra.Refs.IRecord) => refs.redshiftConnector.lastUpdatedDetailTableName, + stateMachineInput: { + databaseEndpoint, + databasePort, + databaseName, + databaseTable, + databaseType, + workgroup, + databaseUsername, + clusterIdentifier, + dataProductId: props.dataProduct.dataProductId, + crossAccountRoleArn: crossAccountRoleArn || '', + domainId: props.dataProduct.domainId, + triggerType: updateTrigger.triggerType, + scheduleRate: updateTrigger.scheduleRate || '', + }, + }); + + if (details.crossAccountRoleArn) { + this.staticInfrastructureReferences.redshiftConnector.otherConstructs!.ecsTaskRole.addToPrincipalPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + resources: [details.crossAccountRoleArn], + actions: ['sts:AssumeRole', 'sts:TagSession'], + }), + ); + } + } +} + +export default RedshiftSourceStack; diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/register.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/register.ts new file mode 100644 index 0000000..81cfec0 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/register.ts @@ -0,0 +1,33 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ + +import { ConnectorIntegrator } from './static'; +import { Connectors } from '@ada/connectors/interface'; +import { ID } from '../index'; +import DynamicStack from './dynamic/stack'; +import type { DataIngressECSCluster } from '@ada/services/data-product/container/infra/ecs-cluster'; +import type ImportDataStateMachine from './static/import-data-state-machine'; +declare module '@ada/connectors/interface' { + interface CONNECTOR_INFRA_REGISTRY { + [ID]: Connectors.IConnectorInfra< + // Static Parameters + { + redshiftConnector: Connectors.Infra.Static.ImportData.StateMachine.Param; + }, + // Static Refs + { + redshiftConnector: Connectors.Infra.Static.ImportData.StateMachine.Ref; + }, + // Static Stack Properties + { + readonly amazonRedshiftECSCluster: DataIngressECSCluster; + readonly amazonRedshiftImportDataStateMachine: ImportDataStateMachine; + } + >; + } +} + +Connectors.Infra.register(ID, { + staticIntegrator: ConnectorIntegrator, + dynamicStackClass: DynamicStack, +}); diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/import-data-state-machine/index.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/import-data-state-machine/index.ts new file mode 100644 index 0000000..93815b2 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/import-data-state-machine/index.ts @@ -0,0 +1,80 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { AMAZON_BASE_TASK_INPUT } from '@ada/connectors/common/amazon/infra'; +import { Construct } from 'constructs'; +import { ContainerDefinition, ICluster, TaskDefinition } from 'aws-cdk-lib/aws-ecs'; +import { SecurityGroup, Vpc } from 'aws-cdk-lib/aws-ec2'; +import { StateMachine, TaskInput } from 'aws-cdk-lib/aws-stepfunctions'; +import BaseEcsRunnerStateMachine from '@ada/connectors/common/common/base-esc-runner-state-machine'; + +export interface RedshiftImportDataStateMachineProps { + readonly cluster: ICluster; + readonly taskDefinition: TaskDefinition; + readonly containerDefinition: ContainerDefinition; + readonly securityGroup: SecurityGroup; + readonly vpc: Vpc; +} + +/** + * Construct to create a generic Redshift Data importer + */ +export default class RedshiftImportDataStateMachine extends BaseEcsRunnerStateMachine { + public readonly stateMachine: StateMachine; + + constructor(scope: Construct, id: string, props: RedshiftImportDataStateMachineProps) { + super(scope, id, { + ...props, + taskEnv: TaskInput.fromObject([ + ...AMAZON_BASE_TASK_INPUT, + { + name: 'DATABASE_ENDPOINT', + value: TaskInput.fromJsonPathAt('$.databaseEndpoint').value, + }, + { + name: 'DATABASE_PORT', + value: TaskInput.fromJsonPathAt('$.databasePort').value, + }, + { + name: 'DATABASE_NAME', + value: TaskInput.fromJsonPathAt('$.databaseName').value, + }, + { + name: 'DATABASE_TABLE', + value: TaskInput.fromJsonPathAt('$.databaseTable').value, + }, + { + name: 'DATABASE_TYPE', + value: TaskInput.fromJsonPathAt('$.databaseType').value, + }, + { + name: 'WORKGROUP', + value: TaskInput.fromJsonPathAt('$.workgroup').value, + }, + { + name: 'DATABASE_USERNAME', + value: TaskInput.fromJsonPathAt('$.databaseUsername').value, + }, + { + name: 'CLUSTER_IDENTIFIER', + value: TaskInput.fromJsonPathAt('$.clusterIdentifier').value, + }, + { + name: 'TABLE_NAME', + value: TaskInput.fromJsonPathAt('$.tableName').value, + }, + { + name: 'DOMAIN_ID', + value: TaskInput.fromJsonPathAt('$.domainId').value, + }, + { + name: 'DATA_PRODUCT_ID', + value: TaskInput.fromJsonPathAt('$.dataProductId').value, + }, + { + name: 'CROSS_ACCOUNT_ACCESS_ROLE', + value: TaskInput.fromJsonPathAt('$.crossAccountRoleArn').value, + }, + ]), + }); + } +} diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/index.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/index.ts new file mode 100644 index 0000000..51dc2ef --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/infra/static/index.ts @@ -0,0 +1,112 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { Connectors } from '@ada/connectors/interface'; +import { Construct } from 'constructs'; +import { DataIngressECSCluster } from '@ada/services/data-product/container/infra/ecs-cluster'; +import { ExternalSourceRedshiftAccessPolicyStatement, getDockerImagePath } from '@ada/infra-common'; +import { ID } from '../..'; +import { Role } from 'aws-cdk-lib/aws-iam'; +import { StateMachine } from 'aws-cdk-lib/aws-stepfunctions'; +import { + addCfnNagSuppressionsToRolePolicy, +} from '@ada/cdk-core'; +import ImportDataStateMachine from './import-data-state-machine'; +import type { StaticInfra } from '@ada/data-product-infra-types'; + +/* eslint-disable max-len */ + +//////////////////////////////////////////// +// CONNECTOR STATIC INFRA - the actual static infrastructure deployed for this connector +//////////////////////////////////////////// +export const ConnectorIntegrator: Connectors.Infra.Static.Integrator = { + ID, + staticInfra: (constructor) => { + return class StaticInfrastructureStack extends constructor implements Connectors.Infra.StaticStackFor { + amazonRedshiftECSCluster: DataIngressECSCluster; + readonly amazonRedshiftImportDataStateMachine: ImportDataStateMachine; + + public override readonly staticInfraParameterValue: InstanceType< + typeof constructor + >['staticInfraParameterValue'] & + Connectors.Infra.ParamsFor; + + constructor(scope: Construct, id: string, props: StaticInfra.Stack.IConstructProps) { + super(scope, id, props); + + //////////////////////////////////////////// + // STATIC INFRA + //////////////////////////////////////////// + this.amazonRedshiftECSCluster = this.ingressContainerInfra.createCluster('Redshift', { + // NOTE: consider resizing + cpu: 512, + memoryMiB: 1024, + name: 'redshift', + imageTarballPath: getDockerImagePath(Connectors.getDockerImageName('REDSHIFT')), + }); + + this.amazonRedshiftECSCluster.taskDefinition.taskRole.addToPrincipalPolicy( + ExternalSourceRedshiftAccessPolicyStatement, + ); + + addCfnNagSuppressionsToRolePolicy(this.amazonRedshiftECSCluster.taskDefinition.taskRole, + [{ + id: 'W76', + reason: 'SPCM expected to be high for ECS Task execution role', + }, + ]); + + this.lastUpdatedDetailTable.grantReadWriteData(this.amazonRedshiftECSCluster.taskDefinition.taskRole); + + this.amazonRedshiftImportDataStateMachine = new ImportDataStateMachine(this, 'RedshiftDataImportStateMachine', { + cluster: this.amazonRedshiftECSCluster.cluster, + taskDefinition: this.amazonRedshiftECSCluster.taskDefinition, + containerDefinition: this.amazonRedshiftECSCluster.containerDefinition, + securityGroup: this.ingressContainerInfra.dataIngressVPC.ecsSecurityGroup, + vpc: this.ingressContainerInfra.dataIngressVPC.vpc, + }); + + //////////////////////////////////////////// + // STATIC PARAMETERS - connector specific parameters stored in SSM availble in dynamic infra + //////////////////////////////////////////// + this.staticInfraParameterValue.redshiftConnector = { + importDataStateMachineArn: this.amazonRedshiftImportDataStateMachine.stateMachine.stateMachineArn, + lastUpdatedDetailTableName: this.lastUpdatedDetailTable.tableName, + otherArns: { + ecsTaskRole: this.amazonRedshiftECSCluster.taskDefinition.taskRole.roleArn, + }, + }; + } + }; + }, + staticInfraRefs: (constructor) => { + return class StaticInfrastructureReferences extends constructor implements Connectors.Infra.IRefsFor { + public override readonly staticInfrastructureReferences: InstanceType< + typeof constructor + >['staticInfrastructureReferences'] & + Connectors.Infra.RefsFor; + + constructor(scope: Construct, id: string, props: StaticInfra.Refs.IConstructProps) { + super(scope, id, props); + + //////////////////////////////////////////// + // STATIC REFS - dereference all SSM parameter values above to infra references + //////////////////////////////////////////// + this.staticInfrastructureReferences.redshiftConnector = { + importDataStateMachine: StateMachine.fromStateMachineArn( + this, + 'amazonRedshiftImportDataStateMachine', + props.staticInfrastructure.redshiftConnector.importDataStateMachineArn, + ), + lastUpdatedDetailTableName: props.staticInfrastructure.redshiftConnector.lastUpdatedDetailTableName, + otherConstructs: { + ecsTaskRole: Role.fromRoleArn( + this, + 'redshiftEcsTaskRole', + props.staticInfrastructure.redshiftConnector.otherArns!.ecsTaskRole, + ), + }, + }; + } + }; + }, +}; diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__init__.py b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__init__.py new file mode 100644 index 0000000..43cae41 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__init__.py @@ -0,0 +1,10 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### +from handlers.common import * # NOSONAR +from .pull_samples import pull_samples + +REDSHIFT = IConnector( + pull_samples=pull_samples +) diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/__init__.py b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/__init__.py new file mode 100644 index 0000000..90fbcf9 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/__init__.py @@ -0,0 +1,4 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/test_pull_samples.py b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/test_pull_samples.py new file mode 100644 index 0000000..1db7211 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/__test__/test_pull_samples.py @@ -0,0 +1,93 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### +import json +from unittest.mock import patch, MagicMock +import pandas as pd + +import pytest +from handlers.__tests__.sampling_helpers import SamplingTestHelpers +from handlers.common import * # NOSONAR +from handlers.sampling import * # NOSONAR + +test_data = pd.DataFrame({ + 'Column1': ['11', '21'], + 'Column2': ['12', '22'] +}) + +@patch("awswrangler.s3") +@patch("botocore.client.BaseClient._make_api_call") +@patch("redshift_connector.connect") +def test_pull_data_sample_redshift_serverless_happy_path(redshift_connection, boto_client, s3): + source_details = { + "databaseEndpoint": "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "databasePort": "5439", + "databaseName": "dev", + "databaseTable": "sample_data_dev", + "databaseType": "Serverless", + "workgroup": "default", + "databaseUsername": "", + "clusterIdentifier": "", + "crossAccountRoleArn": "" + } + + mock_conn = MagicMock() + mock_cursor = mock_conn.cursor.return_value + mock_cursor.execute.return_value = None + mock_cursor.fetch_dataframe.return_value = test_data + redshift_connection.return_value = mock_conn + + boto_client.side_effect = [{ + "Plaintext": json.dumps(source_details).encode('utf-8'), + }, { + "Credentials": { + "AccessKeyId": "TestAccessKeyId", + "SecretAccessKey": "TestSecretAccessKey", + "SessionToken": "TestSessionToken", + } + }, { + "dbUser": "username", + "dbPassword": "password" + }] + + table_details = SamplingTestHelpers.pull_data_sample( + 'REDSHIFT', source_details)['tableDetails'] + + assert len(table_details) == 1 + assert s3.to_parquet.called + +@patch("awswrangler.s3") +@patch("botocore.client.BaseClient._make_api_call") +@patch("redshift_connector.connect") +def test_pull_data_sample_redshift_cluster_happy_path(redshift_connection, boto_client, s3): + source_details = { + "databaseEndpoint": "test-redshift-cluster.c9reiliclukz.us-east-1.redshift.amazonaws.com", + "databasePort": "5439", + "databaseName": "dev", + "databaseTable": "sample_data_dev", + "databaseType": "Cluster", + "workgroup": "", + "databaseUsername": "awsuser", + "clusterIdentifier": "test-redshift-cluster", + "crossAccountRoleArn": "" + } + + boto_client.side_effect = [{ + "Plaintext": json.dumps(source_details).encode('utf-8'), + }, { + "Credentials": { + "AccessKeyId": "TestAccessKeyId", + "SecretAccessKey": "TestSecretAccessKey", + "SessionToken": "TestSessionToken", + } + }, { + "DbUser": "username", + "DbPassword": "password" + }] + + table_details = SamplingTestHelpers.pull_data_sample( + 'REDSHIFT', source_details)['tableDetails'] + + assert len(table_details) == 1 + assert s3.to_parquet.called diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/pull_samples.py b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/pull_samples.py new file mode 100644 index 0000000..00927ed --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_redshift/preview/pull_samples.py @@ -0,0 +1,114 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### +import redshift_connector +import boto3 +from handlers.common import * # NOSONAR +from datetime import datetime +from botocore.config import Config + +def get_redshift_client(boto3_session, database_type: str, session_name: str, endpoint: str, cross_account_access_role: str): + boto_session = get_boto3_session(boto3_session, session_name, cross_account_access_role) + + client_config = get_client_config(endpoint) + + if database_type == 'Cluster': + return boto_session.client('redshift', config=client_config) + + return boto_session.client('redshift-serverless', config=client_config) + +def get_boto3_session(boto3_session, session_name: str, cross_account_access_role: str): + + if not cross_account_access_role: + return boto3_session + + print(f"Assuming Cross account access role {cross_account_access_role}") + sts_client = boto3_session.client('sts') + assumed_role = sts_client.assume_role( + RoleArn=cross_account_access_role, + RoleSessionName=session_name, + Tags=[ + {'Key': 'ada:service', 'Value': 'data-product'} + ] + ) + credentials = assumed_role['Credentials'] + return boto3.session.Session( + aws_access_key_id=credentials['AccessKeyId'], + aws_secret_access_key=credentials['SecretAccessKey'], + aws_session_token=credentials['SessionToken'], + ) + +def get_client_config(endpoint: str): + region = endpoint.split('.')[-4] + + print(f"Client config region {region}") + + return Config( + region_name=region, + signature_version='v4' + ) + +def get_creds(redshift_client, database_type: str, database: str, username: str, cluster_identifier: str, workgroup: str): + if database_type == 'Cluster': + creds = redshift_client.get_cluster_credentials(DbUser=username, + DbName=database, + ClusterIdentifier=cluster_identifier, + AutoCreate=False, + DurationSeconds=3600 + ) + + return { + 'username': creds['DbUser'], + 'password': creds['DbPassword'], + } + + creds = redshift_client.get_credentials(dbName=database, + durationSeconds=3600, + workgroupName=workgroup + ) + + return { + 'username': creds['dbUser'], + 'password': creds['dbPassword'], + } + +def pull_samples(input: IPullSamplesInput) -> IPullSamplesReturn: # NOSONAR (python:S3776) - false positive + """ + Pull data samples from Redshift + """ + boto3_session = input.boto3_session + source_details = input.source_details + sample_size = input.sample_size + + endpoint = source_details["databaseEndpoint"] + port = int(source_details["databasePort"]) + database = source_details["databaseName"] + table = source_details["databaseTable"] + database_type = source_details["databaseType"] + workgroup = source_details["workgroup"] + username = source_details["databaseUsername"] + cluster_identifier = source_details["clusterIdentifier"] + cross_account_access_role = source_details["crossAccountRoleArn"] + + session_name=str(round(datetime.timestamp(datetime.now()))) + + redshift_client = get_redshift_client(boto3_session, database_type, session_name, endpoint, cross_account_access_role) + + creds = get_creds(redshift_client, database_type, database, username, cluster_identifier, workgroup) + + with redshift_connector.connect( + host=endpoint, + port=port, + user=creds['username'], + password=creds['password'], + database=database + ) as conn: + + with conn.cursor() as cursor: + cursor.execute(f"SELECT * FROM {table.replace('`', '')} LIMIT {str(sample_size)}") + + result = cursor.fetch_dataframe() + + return [Sample(DEFAULT_DATASET_ID, next(iter([result])), 'parquet')] + diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/__snapshots__/stack.test.ts.snap b/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/__snapshots__/stack.test.ts.snap index b5d96d1..9dc24b9 100644 --- a/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/__snapshots__/stack.test.ts.snap +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/__snapshots__/stack.test.ts.snap @@ -664,7 +664,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"},{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"parquet\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-1--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-1-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"},{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\",\\"glueJobName\\":\\"test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-1--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-1-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, @@ -672,7 +672,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tablePrefix.$\\":\\"$.Payload.currentTransformJob.outputCrawlerTablePrefix\\",\\"transformJobs.$\\":\\"$.Payload.transformJobs\\",\\"transformJobIndex.$\\":\\"$.Payload.transformJobIndex\\",\\"transformJobCount.$\\":\\"$.Payload.transformJobCount\\",\\"currentTransformJob.$\\":\\"$.Payload.currentTransformJob\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}}}}}},\\"CrawlTransformOutput\\":{\\"Next\\":\\"GetCrawledTransformOutputTableDetails\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.currentTransformCrawlOutput\\",\\"Resource\\":\\"arn:", + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tablePrefix.$\\":\\"$.Payload.currentTransformJob.outputCrawlerTablePrefix\\",\\"transformJobs.$\\":\\"$.Payload.transformJobs\\",\\"transformJobIndex.$\\":\\"$.Payload.transformJobIndex\\",\\"transformJobCount.$\\":\\"$.Payload.transformJobCount\\",\\"currentTransformJob.$\\":\\"$.Payload.currentTransformJob\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}}}}}},\\"CrawlTransformOutput\\":{\\"Next\\":\\"GetCrawledTransformOutputTableDetails\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.currentTransformCrawlOutput\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, @@ -688,7 +688,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"dataProductCompositeIdentifier\\":\\"test-domain.test-data-product\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\"},\\"DetailType\\":\\"DataProductImportSuccess\\",\\"EventBusName\\":\\"arn:", + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"dataProductCompositeIdentifier\\":\\"test-domain.test-data-product\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\"},\\"DetailType\\":\\"DataProductImportSuccess\\",\\"EventBusName\\":\\"arn:", Object { "Ref": "AWS::Partition", }, @@ -700,7 +700,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"executionId.$\\":\\"$$.Execution.Id\\",\\"errorDetails.$\\":\\"$.ErrorDetails\\",\\"currentPayload.$\\":\\"$\\"},\\"DetailType\\":\\"DataProductImportError\\",\\"EventBusName\\":\\"arn:", + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"S3\\",\\"sourceDetails\\":{\\"bucket\\":\\"test-bucket\\",\\"key\\":\\"test-key\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"executionId.$\\":\\"$$.Execution.Id\\",\\"errorDetails.$\\":\\"$.ErrorDetails\\",\\"currentPayload.$\\":\\"$\\"},\\"DetailType\\":\\"DataProductImportError\\",\\"EventBusName\\":\\"arn:", Object { "Ref": "AWS::Partition", }, diff --git a/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/stack.ts b/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/stack.ts index 15bd170..c508859 100644 --- a/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/stack.ts +++ b/source/packages/@ada/infra/src/connectors/sources/amazon_s3/infra/dynamic/stack.ts @@ -1,7 +1,16 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import { Bucket, IBucket } from 'aws-cdk-lib/aws-s3'; -import { Choice, Condition, IStateMachine, LogLevel, Pass, StateMachine, TaskInput } from 'aws-cdk-lib/aws-stepfunctions'; +import { + Choice, + Condition, + DefinitionBody, + IStateMachine, + LogLevel, + Pass, + StateMachine, + TaskInput, +} from 'aws-cdk-lib/aws-stepfunctions'; import { Construct } from 'constructs'; import { Crawler } from '@ada/dynamic-infra/constructs/glue/crawler'; import { @@ -25,6 +34,10 @@ export class S3SourceStack extends DynamicInfrastructureStackBase { super(scope, id, props); } + protected getDefaultTransformRequired(): boolean { + return true; + } + protected createDataSourceInfrastructureAndStateMachine(props: DynamicInfraStackProps): IStateMachine { const { dataProduct } = props; const { sourceDetails } = dataProduct; @@ -54,21 +67,21 @@ export class S3SourceStack extends DynamicInfrastructureStackBase { new Choice(this, 'VerifyCrawlerStepFunctionOutput') // Look at the "status" field .when( - Condition.stringEquals('$.Output.Payload.status', 'FAILED'), - new Pass(this, 'DeconstructErrorFromStateMachineExecution', { - parameters: { - ErrorDetails: TaskInput.fromObject({ - Error: TaskInput.fromJsonPathAt('$.Output.Payload.error').value, - }).value, - }, - }).next(this.putErrorEventOnEventBridge), + Condition.stringEquals('$.Output.Payload.status', 'FAILED'), + new Pass(this, 'DeconstructErrorFromStateMachineExecution', { + parameters: { + ErrorDetails: TaskInput.fromObject({ + Error: TaskInput.fromJsonPathAt('$.Output.Payload.error').value, + }).value, + }, + }).next(this.putErrorEventOnEventBridge), ) .otherwise(getCrawledTableDetails.next(this.transformLoop.executeAllTransformsAndCompleteStateMachine())), ); return new StateMachine(this, 'StateMachine', { tracingEnabled: true, - definition, + definitionBody: DefinitionBody.fromChainable(definition), role: this.role, logs: { destination: new LogGroup(this, 'StateMachineLogs', { diff --git a/source/packages/@ada/infra/src/connectors/sources/file_upload/infra/dynamic/stack.ts b/source/packages/@ada/infra/src/connectors/sources/file_upload/infra/dynamic/stack.ts index f257a00..56d1604 100644 --- a/source/packages/@ada/infra/src/connectors/sources/file_upload/infra/dynamic/stack.ts +++ b/source/packages/@ada/infra/src/connectors/sources/file_upload/infra/dynamic/stack.ts @@ -1,9 +1,7 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import { Construct } from 'constructs'; -import { - DynamicInfraStackProps, -} from '@ada/dynamic-infra/stacks/dynamic-infrastructure-stack-base'; +import { DynamicInfraStackProps } from '@ada/dynamic-infra/stacks/dynamic-infrastructure-stack-base'; import { IStateMachine } from 'aws-cdk-lib/aws-stepfunctions'; import { Rule } from 'aws-cdk-lib/aws-events'; import { S3SourceStack } from '../../../amazon_s3/infra/dynamic/stack'; @@ -16,6 +14,10 @@ export class FileUploadSourceTask extends S3SourceStack { super(scope, id, props); } + protected getDefaultTransformRequired(): boolean { + return false; + } + protected createDataSourceInfrastructureAndStateMachine(props: DynamicInfraStackProps): IStateMachine { return super.createDataSourceInfrastructureAndStateMachine(props); } diff --git a/source/packages/@ada/infra/src/connectors/sources/google_analytics/infra/dynamic/__snapshots__/stack.test.ts.snap b/source/packages/@ada/infra/src/connectors/sources/google_analytics/infra/dynamic/__snapshots__/stack.test.ts.snap index 126d300..272e0ae 100644 --- a/source/packages/@ada/infra/src/connectors/sources/google_analytics/infra/dynamic/__snapshots__/stack.test.ts.snap +++ b/source/packages/@ada/infra/src/connectors/sources/google_analytics/infra/dynamic/__snapshots__/stack.test.ts.snap @@ -46,38 +46,6 @@ Object { }, "Type": "AWS::Glue::Job", }, - "ArbitraryTransformsTransformJobsAndCrawlersTransformJobglobaladaparquetdatatypemap1Job4CA16839": Object { - "Properties": Object { - "Command": Object { - "Name": "glueetl", - "PythonVersion": "3", - "ScriptLocation": "s3://script-bucket/transform_wrapper/transform_wrapper.py", - }, - "DefaultArguments": Object { - "--INPUT_ARGS": "{}", - "--additional-python-modules": "awswrangler", - "--extra-py-files": "s3://script-bucket/scripts/global/ada_parquet_data_type_map/transform_script.py", - }, - "ExecutionProperty": Object { - "MaxConcurrentRuns": 1000, - }, - "GlueVersion": "3.0", - "Name": "test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", - "Role": Object { - "Fn::GetAtt": Array [ - "SourceAccessRoleC447CA39", - "Arn", - ], - }, - "SecurityConfiguration": "glueSecurityConfiguration", - "Tags": Object { - "Application": "Ada", - "DataProductId": "test-data-product", - "DomainId": "test-domain", - }, - }, - "Type": "AWS::Glue::Job", - }, "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler0Crawler1DA2C7B0": Object { "Properties": Object { "Classifiers": Array [], @@ -110,38 +78,6 @@ Object { }, "Type": "AWS::Glue::Crawler", }, - "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler1CrawlerA6E4809D": Object { - "Properties": Object { - "Classifiers": Array [], - "CrawlerSecurityConfiguration": "glueSecurityConfiguration", - "DatabaseName": "rawDB", - "Name": "test-d4688test-d45928737-transform-1--crawler", - "Role": Object { - "Fn::GetAtt": Array [ - "SourceAccessRoleC447CA39", - "Arn", - ], - }, - "SchemaChangePolicy": Object { - "DeleteBehavior": "DEPRECATE_IN_DATABASE", - "UpdateBehavior": "UPDATE_IN_DATABASE", - }, - "TablePrefix": "test-d4688test-d45928737-transform-1-", - "Tags": Object { - "Application": "Ada", - "DataProductId": "test-data-product", - "DomainId": "test-domain", - }, - "Targets": Object { - "S3Targets": Array [ - Object { - "Path": "data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/", - }, - ], - }, - }, - "Type": "AWS::Glue::Crawler", - }, "SourceAccessRoleC447CA39": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { @@ -562,27 +498,6 @@ Object { ], }, }, - Object { - "Action": Array [ - "glue:StartJobRun", - "glue:GetJobRun", - "glue:GetJobRuns", - "glue:BatchStopJobRun", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":glue:ap-southeast-1:1111111111:job/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", - ], - ], - }, - }, ], "Version": "2012-10-17", }, @@ -662,7 +577,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"},{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"parquet\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-1--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-1-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"GOOGLE_ANALYTICS\\",\\"sourceDetails\\":{\\"dimensions\\":\\"ga:dimension1,ga:dimension2\\",\\"metrics\\":\\"ga:metric1,ga:metric2\\",\\"projectId\\":\\"mock-project-id\\",\\"viewId\\":\\"mock-view-id\\",\\"clientEmail\\":\\"mock@example.com\\",\\"clientId\\":\\"mock-client-id\\",\\"privateKeyId\\":\\"mock-private-key-id\\",\\"privateKey\\":\\"mock-private-key\\",\\"privateKeySecretName\\":\\"mock-private-key-secret-name\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"GOOGLE_ANALYTICS\\",\\"sourceDetails\\":{\\"dimensions\\":\\"ga:dimension1,ga:dimension2\\",\\"metrics\\":\\"ga:metric1,ga:metric2\\",\\"projectId\\":\\"mock-project-id\\",\\"viewId\\":\\"mock-view-id\\",\\"clientEmail\\":\\"mock@example.com\\",\\"clientId\\":\\"mock-client-id\\",\\"privateKeyId\\":\\"mock-private-key-id\\",\\"privateKey\\":\\"mock-private-key\\",\\"privateKeySecretName\\":\\"mock-private-key-secret-name\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, diff --git a/source/packages/@ada/infra/src/connectors/sources/google_bigquery/docker-image/script.sh b/source/packages/@ada/infra/src/connectors/sources/google_bigquery/docker-image/script.sh index 758dc9e..b556138 100755 --- a/source/packages/@ada/infra/src/connectors/sources/google_bigquery/docker-image/script.sh +++ b/source/packages/@ada/infra/src/connectors/sources/google_bigquery/docker-image/script.sh @@ -20,7 +20,11 @@ # CLIENT_X509_CERT_URL: can com from service account configuration, default: https://www.googleapis.com/robot/v1/metadata/x509/[client-email] # from https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html + +set -e + output=$(curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | head -n 1 | cut -d $' ' -f2) + export AWS_ACCESS_KEY_ID=$(jq -r .AccessKeyId <<< "$output") export AWS_SECRET_ACCESS_KEY=$(jq -r .SecretAccessKey <<< "$output") export AWS_SECURITY_TOKEN=$(jq -r .Token <<< "$output") diff --git a/source/packages/@ada/infra/src/connectors/sources/google_bigquery/infra/dynamic/__snapshots__/stack.test.ts.snap b/source/packages/@ada/infra/src/connectors/sources/google_bigquery/infra/dynamic/__snapshots__/stack.test.ts.snap index 46fb6d8..124627b 100644 --- a/source/packages/@ada/infra/src/connectors/sources/google_bigquery/infra/dynamic/__snapshots__/stack.test.ts.snap +++ b/source/packages/@ada/infra/src/connectors/sources/google_bigquery/infra/dynamic/__snapshots__/stack.test.ts.snap @@ -46,38 +46,6 @@ Object { }, "Type": "AWS::Glue::Job", }, - "ArbitraryTransformsTransformJobsAndCrawlersTransformJobglobaladaparquetdatatypemap1Job4CA16839": Object { - "Properties": Object { - "Command": Object { - "Name": "glueetl", - "PythonVersion": "3", - "ScriptLocation": "s3://script-bucket/transform_wrapper/transform_wrapper.py", - }, - "DefaultArguments": Object { - "--INPUT_ARGS": "{}", - "--additional-python-modules": "awswrangler", - "--extra-py-files": "s3://script-bucket/scripts/global/ada_parquet_data_type_map/transform_script.py", - }, - "ExecutionProperty": Object { - "MaxConcurrentRuns": 1000, - }, - "GlueVersion": "3.0", - "Name": "test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", - "Role": Object { - "Fn::GetAtt": Array [ - "SourceAccessRoleC447CA39", - "Arn", - ], - }, - "SecurityConfiguration": "glueSecurityConfiguration", - "Tags": Object { - "Application": "Ada", - "DataProductId": "test-data-product", - "DomainId": "test-domain", - }, - }, - "Type": "AWS::Glue::Job", - }, "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler0Crawler1DA2C7B0": Object { "Properties": Object { "Classifiers": Array [], @@ -110,38 +78,6 @@ Object { }, "Type": "AWS::Glue::Crawler", }, - "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler1CrawlerA6E4809D": Object { - "Properties": Object { - "Classifiers": Array [], - "CrawlerSecurityConfiguration": "glueSecurityConfiguration", - "DatabaseName": "rawDB", - "Name": "test-d4688test-d45928737-transform-1--crawler", - "Role": Object { - "Fn::GetAtt": Array [ - "SourceAccessRoleC447CA39", - "Arn", - ], - }, - "SchemaChangePolicy": Object { - "DeleteBehavior": "DEPRECATE_IN_DATABASE", - "UpdateBehavior": "UPDATE_IN_DATABASE", - }, - "TablePrefix": "test-d4688test-d45928737-transform-1-", - "Tags": Object { - "Application": "Ada", - "DataProductId": "test-data-product", - "DomainId": "test-domain", - }, - "Targets": Object { - "S3Targets": Array [ - Object { - "Path": "data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/", - }, - ], - }, - }, - "Type": "AWS::Glue::Crawler", - }, "SourceAccessRoleC447CA39": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { @@ -562,27 +498,6 @@ Object { ], }, }, - Object { - "Action": Array [ - "glue:StartJobRun", - "glue:GetJobRun", - "glue:GetJobRuns", - "glue:BatchStopJobRun", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":glue:ap-southeast-1:1111111111:job/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", - ], - ], - }, - }, ], "Version": "2012-10-17", }, @@ -662,7 +577,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"},{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"parquet\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-1--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-1-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"GOOGLE_BIGQUERY\\",\\"sourceDetails\\":{\\"projectId\\":\\"mock-project-id\\",\\"query\\":\\"SELECT * FROM mock\\",\\"clientEmail\\":\\"mock@example.com\\",\\"clientId\\":\\"mock-client-id\\",\\"privateKeyId\\":\\"mock-private-key-id\\",\\"privateKey\\":\\"mock-private-key\\",\\"privateKeySecretName\\":\\"mock-private-key-secret-name\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"GOOGLE_BIGQUERY\\",\\"sourceDetails\\":{\\"projectId\\":\\"mock-project-id\\",\\"query\\":\\"SELECT * FROM mock\\",\\"clientEmail\\":\\"mock@example.com\\",\\"clientId\\":\\"mock-client-id\\",\\"privateKeyId\\":\\"mock-private-key-id\\",\\"privateKey\\":\\"mock-private-key\\",\\"privateKeySecretName\\":\\"mock-private-key-secret-name\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, diff --git a/source/packages/@ada/infra/src/connectors/sources/google_storage/infra/dynamic/__snapshots__/stack.test.ts.snap b/source/packages/@ada/infra/src/connectors/sources/google_storage/infra/dynamic/__snapshots__/stack.test.ts.snap index 0cfb969..55411e6 100644 --- a/source/packages/@ada/infra/src/connectors/sources/google_storage/infra/dynamic/__snapshots__/stack.test.ts.snap +++ b/source/packages/@ada/infra/src/connectors/sources/google_storage/infra/dynamic/__snapshots__/stack.test.ts.snap @@ -46,38 +46,6 @@ Object { }, "Type": "AWS::Glue::Job", }, - "ArbitraryTransformsTransformJobsAndCrawlersTransformJobglobaladaparquetdatatypemap1Job4CA16839": Object { - "Properties": Object { - "Command": Object { - "Name": "glueetl", - "PythonVersion": "3", - "ScriptLocation": "s3://script-bucket/transform_wrapper/transform_wrapper.py", - }, - "DefaultArguments": Object { - "--INPUT_ARGS": "{}", - "--additional-python-modules": "awswrangler", - "--extra-py-files": "s3://script-bucket/scripts/global/ada_parquet_data_type_map/transform_script.py", - }, - "ExecutionProperty": Object { - "MaxConcurrentRuns": 1000, - }, - "GlueVersion": "3.0", - "Name": "test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", - "Role": Object { - "Fn::GetAtt": Array [ - "SourceAccessRoleC447CA39", - "Arn", - ], - }, - "SecurityConfiguration": "glueSecurityConfiguration", - "Tags": Object { - "Application": "Ada", - "DataProductId": "test-data-product", - "DomainId": "test-domain", - }, - }, - "Type": "AWS::Glue::Job", - }, "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler0Crawler1DA2C7B0": Object { "Properties": Object { "Classifiers": Array [], @@ -110,38 +78,6 @@ Object { }, "Type": "AWS::Glue::Crawler", }, - "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler1CrawlerA6E4809D": Object { - "Properties": Object { - "Classifiers": Array [], - "CrawlerSecurityConfiguration": "glueSecurityConfiguration", - "DatabaseName": "rawDB", - "Name": "test-d4688test-d45928737-transform-1--crawler", - "Role": Object { - "Fn::GetAtt": Array [ - "SourceAccessRoleC447CA39", - "Arn", - ], - }, - "SchemaChangePolicy": Object { - "DeleteBehavior": "DEPRECATE_IN_DATABASE", - "UpdateBehavior": "UPDATE_IN_DATABASE", - }, - "TablePrefix": "test-d4688test-d45928737-transform-1-", - "Tags": Object { - "Application": "Ada", - "DataProductId": "test-data-product", - "DomainId": "test-domain", - }, - "Targets": Object { - "S3Targets": Array [ - Object { - "Path": "data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/", - }, - ], - }, - }, - "Type": "AWS::Glue::Crawler", - }, "SourceAccessRoleC447CA39": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { @@ -562,27 +498,6 @@ Object { ], }, }, - Object { - "Action": Array [ - "glue:StartJobRun", - "glue:GetJobRun", - "glue:GetJobRuns", - "glue:BatchStopJobRun", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":glue:ap-southeast-1:1111111111:job/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", - ], - ], - }, - }, ], "Version": "2012-10-17", }, @@ -662,7 +577,7 @@ Object { Object { "Ref": "AWS::Partition", }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"},{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"parquet\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-1--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-1-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"GOOGLE_STORAGE\\",\\"sourceDetails\\":{\\"bucket\\":\\"mock-bucket\\",\\"key\\":\\"mock-bucket-key\\",\\"projectId\\":\\"mock-project-id\\",\\"clientEmail\\":\\"mock@example.com\\",\\"clientId\\":\\"mock-client-id\\",\\"privateKeyId\\":\\"mock-private-key-id\\",\\"privateKey\\":\\"mock-private-key\\",\\"privateKeySecretName\\":\\"mock-private-key-secret-name\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"GOOGLE_STORAGE\\",\\"sourceDetails\\":{\\"bucket\\":\\"mock-bucket\\",\\"key\\":\\"mock-bucket-key\\",\\"projectId\\":\\"mock-project-id\\",\\"clientEmail\\":\\"mock@example.com\\",\\"clientId\\":\\"mock-client-id\\",\\"privateKeyId\\":\\"mock-private-key-id\\",\\"privateKey\\":\\"mock-private-key\\",\\"privateKeySecretName\\":\\"mock-private-key-secret-name\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", Object { "Ref": "AWS::Partition", }, diff --git a/source/packages/@ada/infra/src/connectors/sources/index.ts b/source/packages/@ada/infra/src/connectors/sources/index.ts index a3abdf8..05dd5e0 100644 --- a/source/packages/@ada/infra/src/connectors/sources/index.ts +++ b/source/packages/@ada/infra/src/connectors/sources/index.ts @@ -25,12 +25,16 @@ export * as AmazonDynamoDB from './amazon_dynamodb'; export * as AmazonCloudWatch from './amazon_cloudwatch'; +export * as AmazonRedshift from './amazon_redshift'; + export * as MYSQL5 from './jdbc_mysql5'; export * as POSTGRESQL from './jdbc_postgresql'; export * as SQLSERVER from './jdbc_sqlserver'; +export * as ORACLE from './jdbc_oracle'; + export * as AmazonCloudTrail from './amazon_cloudtrail'; export * as MongoDB from './mongodb'; diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_mysql5/index.ts b/source/packages/@ada/infra/src/connectors/sources/jdbc_mysql5/index.ts index fc34a84..99a1ddd 100644 --- a/source/packages/@ada/infra/src/connectors/sources/jdbc_mysql5/index.ts +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_mysql5/index.ts @@ -152,7 +152,7 @@ export const CONNECTOR: Connectors.IConnector; + +/** + * Connector definition + * @required + */ +export const CONNECTOR: Connectors.IConnector = { + ID, + FOLDER: 'jdbc_oracle', + + // Interface references - used for typecasting only + ISourceDetails: {} as ISourceDetails__ORACLE, + ISourceDetailsFormData: {} as IFormData__ORACLE, + + METADATA: { + label: 'Oracle', + description: 'Data product from Oracle database', + icon: ID, // NB: icons are stored in @ada/website referenced by ID + }, + + CONFIG: { + stability: Connectors.Stability.STABLE, + + managedSecret: { + enabled: true, + secretDetails: [ + { + secretNameProperty: 'dbCredentialSecretName', + secretValueProperty: 'password', + }, + ], + }, + + supports: { + preview: true, + automaticTransforms: true, + customTransforms: true, + updateTriggers: { + AUTOMATIC: false, + ON_DEMAND: true, + SCHEDULE: true, + }, + updateTriggerScheduleRate: { + HOURLY: true, + DAILY: true, + WEEKLY: true, + MONTHLY: true, + CUSTOM: true, + }, + source: { + query: false, + }, + }, + }, + + SCHEMA: { + id: `Connector_${ID}`, + type: 'object', + properties: { + databaseEndpoint: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + databasePort: { + type: 'string', + ...PATTERN_DB_PORT, + }, + databaseName: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + databaseTable: { + type: 'string', + ...PATTERN_NOT_EMPTY, + }, + username: { + type: 'string', + ...PATTERN_ORACLE_USERNAME, + }, + password: { + type: 'string', + }, + }, + required: ['databaseEndpoint', 'databasePort', 'databaseName', 'databaseTable', 'username', 'password'], + }, + + VIEW: { + Wizard: { + fields: [ + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseEndpoint', + label: 'Database Endpoint or Host Name', + description: + 'Enter the database endpoint or host name for the Oracle database. Ensure the network connectivity has been correctly set up.', + placeholder: '', + helperText: 'Databse host name for on-premise databases or database endpoint for AWS RDS instances', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_NOT_EMPTY, + message: 'Must be a valid database endpoint', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databasePort', + label: 'Database Port', + description: 'Enter the database port for the Oracle database', + placeholder: '1521', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_DB_PORT, + message: 'Must be 0 to 65535', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseName', + label: 'Database Name', + description: 'Enter the name of the database to be imported', + placeholder: '', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_NOT_EMPTY, + message: + 'Must be a valid database name that consists of alphanumeric characters, dash, underscore and dot', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.databaseTable', + label: 'Database Table', + description: 'Enter the name of the table to be imported from the database', + placeholder: '', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_NOT_EMPTY, + message: + 'Must be a valid database table name that consists of alphanumeric characters, dash, underscore and dot', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.username', + label: 'Database Username', + description: 'Username to access the database', + placeholder: '', + helperText: '', + helperTextAsAlert: 'info', + validate: [ + { + type: 'required', + }, + { + type: 'pattern', + pattern: PATTERN_ORACLE_USERNAME, + message: + 'Must be a valid database user name that consists of alphanumeric characters, dash, underscore and dot', + }, + ], + }, + { + component: TEXT_FIELD, + name: 'sourceDetails.password', + label: 'Database Password', + description: 'Password to access the database', + placeholder: '', + helperText: '', + helperTextAsAlert: 'info', + type: 'password', + validate: [ + { + type: 'required', + }, + ], + }, + ], + sourceDetailsFormDataToInputData: ({ + sourceDetails: { databaseEndpoint, databasePort, databaseName, databaseTable, username, password }, + }) => { + return { + databaseEndpoint, + databasePort, + databaseName, + databaseSchema: '', + databaseTable, + username, + password, + }; + }, + }, + Summary: { + properties: [ + { key: 'databaseEndpoint', label: 'Database Endpoint' }, + { key: 'databasePort', label: 'Database Port' }, + { key: 'databaseName', label: 'Database Name' }, + { key: 'databaseTable', label: 'Database Table' }, + { key: 'username', label: 'Database Username' }, + { key: 'password', label: 'Database Password' }, + ], + }, + }, +}; + +//////////////////////////////////////////////////////////////// +// REGISTER CONNECTOR - DO NOT EDIT BELOW THIS LINE +//////////////////////////////////////////////////////////////// +Connectors.register(CONNECTOR); + +export type ISourceDetails = typeof CONNECTOR['ISourceDetails']; + +export type ISourceDetailsFormData = typeof CONNECTOR['ISourceDetailsFormData']; + +declare module '@ada/connectors/interface' { + interface CONNECTOR_REGISTRY { + [ID]: typeof CONNECTOR; + } +} diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/__snapshots__/stack.test.ts.snap b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/__snapshots__/stack.test.ts.snap new file mode 100644 index 0000000..d6fad8d --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/__snapshots__/stack.test.ts.snap @@ -0,0 +1,820 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`stack/synthesizer/oracle snapshot 1`] = ` +Object { + "Outputs": Object { + "StateMachineArn": Object { + "Export": Object { + "Name": "DataImportStateMachineArn-test-d4688test-d45928737", + }, + "Value": Object { + "Ref": "StateMachine2E01A3A5", + }, + }, + }, + "Parameters": Object {}, + "Resources": Object { + "ArbitraryTransformsTransformJobsAndCrawlersTransformJobglobaladajsonrelationalise0JobAB08D24E": Object { + "Properties": Object { + "Command": Object { + "Name": "glueetl", + "PythonVersion": "3", + "ScriptLocation": "s3://script-bucket/transform_wrapper/transform_wrapper.py", + }, + "Connections": Object { + "Connections": Array [ + "test-d4688test-d45928737-connection", + ], + }, + "DefaultArguments": Object { + "--INPUT_ARGS": "{}", + "--additional-python-modules": "awswrangler", + "--extra-py-files": "s3://script-bucket/scripts/global/ada_json_relationalise/transform_script.py", + }, + "ExecutionProperty": Object { + "MaxConcurrentRuns": 1000, + }, + "GlueVersion": "3.0", + "Name": "test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SecurityConfiguration": "glueSecurityConfiguration", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + }, + "Type": "AWS::Glue::Job", + }, + "ArbitraryTransformsTransformJobsAndCrawlersTransformJobglobaladaparquetdatatypemap1Job4CA16839": Object { + "Properties": Object { + "Command": Object { + "Name": "glueetl", + "PythonVersion": "3", + "ScriptLocation": "s3://script-bucket/transform_wrapper/transform_wrapper.py", + }, + "DefaultArguments": Object { + "--INPUT_ARGS": "{}", + "--additional-python-modules": "awswrangler", + "--extra-py-files": "s3://script-bucket/scripts/global/ada_parquet_data_type_map/transform_script.py", + }, + "ExecutionProperty": Object { + "MaxConcurrentRuns": 1000, + }, + "GlueVersion": "3.0", + "Name": "test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SecurityConfiguration": "glueSecurityConfiguration", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + }, + "Type": "AWS::Glue::Job", + }, + "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler0Crawler1DA2C7B0": Object { + "Properties": Object { + "Classifiers": Array [], + "CrawlerSecurityConfiguration": "glueSecurityConfiguration", + "DatabaseName": "rawDB", + "Name": "test-d4688test-d45928737-transform-0--crawler", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SchemaChangePolicy": Object { + "DeleteBehavior": "DEPRECATE_IN_DATABASE", + "UpdateBehavior": "UPDATE_IN_DATABASE", + }, + "TablePrefix": "test-d4688test-d45928737-transform-0-", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + "Targets": Object { + "S3Targets": Array [ + Object { + "Path": "data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/", + }, + ], + }, + }, + "Type": "AWS::Glue::Crawler", + }, + "ArbitraryTransformsTransformJobsAndCrawlersTransformOutputCrawler1CrawlerA6E4809D": Object { + "Properties": Object { + "Classifiers": Array [], + "CrawlerSecurityConfiguration": "glueSecurityConfiguration", + "DatabaseName": "rawDB", + "Name": "test-d4688test-d45928737-transform-1--crawler", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SchemaChangePolicy": Object { + "DeleteBehavior": "DEPRECATE_IN_DATABASE", + "UpdateBehavior": "UPDATE_IN_DATABASE", + }, + "TablePrefix": "test-d4688test-d45928737-transform-1-", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + "Targets": Object { + "S3Targets": Array [ + Object { + "Path": "data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/", + }, + ], + }, + }, + "Type": "AWS::Glue::Crawler", + }, + "GlueConnection": Object { + "Properties": Object { + "CatalogId": Object { + "Ref": "AWS::AccountId", + }, + "ConnectionInput": Object { + "ConnectionProperties": Object { + "JDBC_CONNECTION_URL": "jdbc:oracle:thin://@mydb.123456789012.ap-southeast-2.rds.amazonaws.com:undefined/undefined", + "JDBC_ENFORCE_SSL": "false", + "KAFKA_SSL_ENABLED": "false", + "PASSWORD": "{{resolve:secretsmanager:undefined}}", + }, + "ConnectionType": "JDBC", + "Description": "Connect to database", + "Name": "test-d4688test-d45928737-connection", + "PhysicalConnectionRequirements": Object { + "AvailabilityZone": "ap-southeast-2a", + "SecurityGroupIdList": Array [ + "sg-12345", + "sg-23456", + ], + "SubnetId": "subnet-123", + }, + }, + }, + "Type": "AWS::Glue::Connection", + }, + "SourceAccessRoleC447CA39": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "glue.amazonaws.com", + }, + }, + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "states.ap-southeast-1.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Policies": Array [ + Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "logs:CreateLogGroup", + "logs:PutLogEvents", + "logs:CreateLogStream", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "glue:CreateTable", + "glue:CreateSchema", + "glue:CreatePartition*", + "glue:UpdateTable", + "glue:UpdateSchema", + "glue:UpdatePartition", + "glue:Get*", + "glue:BatchGet*", + "glue:BatchCreatePartition", + "glue:BatchUpdatePartition", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "ec2:CreateTags", + "ec2:DeleteTags", + ], + "Condition": Object { + "ForAllValues:StringEquals": Object { + "aws:TagKeys": Array [ + "aws-glue-service-resource", + ], + }, + }, + "Effect": "Allow", + "Resource": Array [ + "arn:aws:ec2:*:*:network-interface/*", + "arn:aws:ec2:*:*:security-group/*", + "arn:aws:ec2:*:*:instance/*", + ], + }, + Object { + "Action": Array [ + "glue:*", + "s3:GetBucketLocation", + "s3:ListBucket", + "s3:ListAllMyBuckets", + "s3:GetBucketAcl", + "ec2:DescribeVpcEndpoints", + "ec2:DescribeRouteTables", + "ec2:CreateNetworkInterface", + "ec2:DeleteNetworkInterface", + "ec2:DescribeNetworkInterfaces", + "ec2:DescribeSecurityGroups", + "ec2:DescribeSubnets", + "ec2:DescribeVpcAttribute", + "iam:ListRolePolicies", + "iam:GetRole", + "iam:GetRolePolicy", + "cloudwatch:PutMetricData", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "glueTransformsPolicy", + }, + ], + "Tags": Array [ + Object { + "Key": "ada:groups", + "Value": ":admin:analyst:", + }, + Object { + "Key": "ada:service", + "Value": "data-product", + }, + Object { + "Key": "ada:user", + "Value": "test-user", + }, + Object { + "Key": "Application", + "Value": "Ada", + }, + Object { + "Key": "DataProductId", + "Value": "test-data-product", + }, + Object { + "Key": "DomainId", + "Value": "test-domain", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "SourceAccessRoleDefaultPolicyADA23135": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::data-bucket", + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::data-bucket/test-domain/test-data-product/test-stack/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "kms:GenerateDataKey", + "kms:Decrypt", + "kms:Encrypt", + ], + "Effect": "Allow", + "Resource": "arn:aws:kms:us-east-1:123456789012:key/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::script-bucket", + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::script-bucket/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt*", + "kms:Encrypt*", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + "kms:Describe*", + "kms:List*", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "logs:CreateLogDelivery", + "logs:GetLogDelivery", + "logs:UpdateLogDelivery", + "logs:DeleteLogDelivery", + "logs:ListLogDeliveries", + "logs:PutResourcePolicy", + "logs:DescribeResourcePolicies", + "logs:DescribeLogGroups", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + "xray:GetSamplingRules", + "xray:GetSamplingTargets", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": "states:StartExecution", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:stateMachine:glueCrawlerStateMachine", + ], + ], + }, + }, + Object { + "Action": Array [ + "states:DescribeExecution", + "states:StopExecution", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:execution:glueCrawlerStateMachine*", + ], + ], + }, + }, + Object { + "Action": Array [ + "events:PutTargets", + "events:PutRule", + "events:DescribeRule", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule", + ], + ], + }, + }, + Object { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": Array [ + "arn:aws:lambda:ap-southeast-1:1111111111:test", + "arn:aws:lambda:ap-southeast-1:1111111111:test:*", + ], + }, + Object { + "Action": "events:PutEvents", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus", + ], + ], + }, + }, + Object { + "Action": "states:StartExecution", + "Effect": "Allow", + "Resource": "arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachine", + }, + Object { + "Action": Array [ + "states:DescribeExecution", + "states:StopExecution", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:execution:TestStateMachine*", + ], + ], + }, + }, + Object { + "Action": Array [ + "glue:StartJobRun", + "glue:GetJobRun", + "glue:GetJobRuns", + "glue:BatchStopJobRun", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":glue:ap-southeast-1:1111111111:job/$.glueJobName", + ], + ], + }, + }, + Object { + "Action": Array [ + "glue:StartJobRun", + "glue:GetJobRun", + "glue:GetJobRuns", + "glue:BatchStopJobRun", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":glue:ap-southeast-1:1111111111:job/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0", + ], + ], + }, + }, + Object { + "Action": Array [ + "glue:StartJobRun", + "glue:GetJobRun", + "glue:GetJobRuns", + "glue:BatchStopJobRun", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":glue:ap-southeast-1:1111111111:job/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1", + ], + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "SourceAccessRoleDefaultPolicyADA23135", + "Roles": Array [ + Object { + "Ref": "SourceAccessRoleC447CA39", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "StartCrawler29B459CE": Object { + "Properties": Object { + "Classifiers": Array [], + "CrawlerSecurityConfiguration": "glueSecurityConfiguration", + "DatabaseName": "rawDB", + "Name": "test-d4688test-d45928737-start-crawler", + "Role": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "SchemaChangePolicy": Object { + "DeleteBehavior": "DEPRECATE_IN_DATABASE", + "UpdateBehavior": "UPDATE_IN_DATABASE", + }, + "TablePrefix": "test-d4688test-d45928737-start", + "Tags": Object { + "Application": "Ada", + "DataProductId": "test-data-product", + "DomainId": "test-domain", + }, + "Targets": Object { + "JdbcTargets": Array [ + Object { + "ConnectionName": "test-d4688test-d45928737-connection", + "Path": "undefined/undefined", + }, + ], + }, + }, + "Type": "AWS::Glue::Crawler", + }, + "StateMachine2E01A3A5": Object { + "DeletionPolicy": "Delete", + "DependsOn": Array [ + "SourceAccessRoleDefaultPolicyADA23135", + "SourceAccessRoleC447CA39", + ], + "Properties": Object { + "DefinitionString": Object { + "Fn::Join": Array [ + "", + Array [ + "{\\"StartAt\\":\\"ExecuteCrawlertest-d4688test-d45928737-start-crawler\\",\\"States\\":{\\"ExecuteCrawlertest-d4688test-d45928737-start-crawler\\":{\\"Next\\":\\"VerifyCrawlerStepFunctionOutput\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input\\":{\\"crawlerName\\":\\"test-d4688test-d45928737-start-crawler\\"},\\"StateMachineArn\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:stateMachine:glueCrawlerStateMachine\\"}},\\"VerifyCrawlerStepFunctionOutput\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.Output.Payload.status\\",\\"StringEquals\\":\\"FAILED\\",\\"Next\\":\\"DeconstructErrorFromStateMachineExecution\\"}],\\"Default\\":\\"GetCrawledTableDetailsFortest-d4688test-d45928737-start\\"},\\"GetCrawledTableDetailsFortest-d4688test-d45928737-start\\":{\\"Next\\":\\"PrepareTransformChain\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tablePrefix\\":\\"test-d4688test-d45928737-start\\"}}}},\\"PrepareTransformChain\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"tablePrefix.$\\":\\"$.Payload.tablePrefix\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"transformJobs\\":[{\\"scriptId\\":\\"ada_json_relationalise\\",\\"namespace\\":\\"global\\",\\"applicableClassifications\\":[\\"json\\"],\\"glueJobName\\":\\"test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_json_relationalise/0/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-0--global-ada_json_relationalise-0/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-0--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-0-\\"},{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\",\\"glueJobName\\":\\"test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1\\",\\"outputS3Target\\":{\\"bucket\\":\\"data-bucket\\",\\"key\\":\\"test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\"},\\"outputS3TargetPath\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/transform/global-ada_parquet_data_type_map/1/ada_default_dataset/\\",\\"tempS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/test-stack/temp/test-d4688test-d45928737-transform-1--global-ada_parquet_data_type_map-1/\\",\\"outputCrawlerName\\":\\"test-d4688test-d45928737-transform-1--crawler\\",\\"outputCrawlerTablePrefix\\":\\"test-d4688test-d45928737-transform-1-\\"}],\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"ORACLE\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"mydb.123456789012.ap-southeast-2.rds.amazonaws.com\\"}}}}}},\\"StartTransformations\\":{\\"Type\\":\\"Pass\\",\\"Next\\":\\"IsTransformRemaining?\\"},\\"PrepareNextTransform\\":{\\"Next\\":\\"StartTransformations\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload.$\\":\\"$\\"}},\\"GetCrawledTransformOutputTableDetails\\":{\\"Next\\":\\"PrepareNextTransform\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Payload\\":{\\"Payload\\":{\\"databaseName\\":\\"rawDB\\",\\"tablePrefix.$\\":\\"$.Payload.currentTransformJob.outputCrawlerTablePrefix\\",\\"transformJobs.$\\":\\"$.Payload.transformJobs\\",\\"transformJobIndex.$\\":\\"$.Payload.transformJobIndex\\",\\"transformJobCount.$\\":\\"$.Payload.transformJobCount\\",\\"currentTransformJob.$\\":\\"$.Payload.currentTransformJob\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"ingestionTimestamp.$\\":\\"$.Payload.ingestionTimestamp\\",\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"ORACLE\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"mydb.123456789012.ap-southeast-2.rds.amazonaws.com\\"}}}}}},\\"CrawlTransformOutput\\":{\\"Next\\":\\"GetCrawledTransformOutputTableDetails\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.currentTransformCrawlOutput\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input\\":{\\"crawlerName.$\\":\\"$.Payload.currentTransformJob.outputCrawlerName\\"},\\"StateMachineArn\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:ap-southeast-1:1111111111:stateMachine:glueCrawlerStateMachine\\"}},\\"RunTransformJobs\\":{\\"Type\\":\\"Map\\",\\"ResultPath\\":\\"$.Payload.currentTransformJobOutputs\\",\\"Next\\":\\"CrawlTransformOutput\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Iterator\\":{\\"StartAt\\":\\"RunTransformJob\\",\\"States\\":{\\"RunTransformJob\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.currentTransformJobOutput\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::glue:startJobRun.sync\\",\\"Parameters\\":{\\"JobName.$\\":\\"$.glueJobName\\",\\"Arguments\\":{\\"--INPUT_TABLE_NAME.$\\":\\"$.inputTableName\\",\\"--OUTPUT_S3_PATH.$\\":\\"$.outputS3TargetPath\\",\\"--DATABASE_NAME\\":\\"rawDB\\",\\"--DOMAIN_ID\\":\\"test-domain\\",\\"--DATA_PRODUCT_ID\\":\\"test-data-product\\",\\"--TEMP_S3_PATH.$\\":\\"$.tempS3Path\\"}}}}},\\"ItemsPath\\":\\"$.Payload.currentResolvedTransformJobs\\"},\\"IsTransformRemaining?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.Payload.transformJobIndex\\",\\"NumericLessThanPath\\":\\"$.Payload.transformJobCount\\",\\"Next\\":\\"RunTransformJobs\\"}],\\"Default\\":\\"IsAutomaticPiiEnabled?\\"},\\"IsAutomaticPiiEnabled?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.Payload.dataProduct.enableAutomaticPii\\",\\"BooleanEquals\\":true,\\"Next\\":\\"GeneratePiiQuery\\"}],\\"Default\\":\\"NotifyForSuccess\\"},\\"NotifyForSuccess\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"ORACLE\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"mydb.123456789012.ap-southeast-2.rds.amazonaws.com\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"dataProductCompositeIdentifier\\":\\"test-domain.test-data-product\\",\\"tableDetails.$\\":\\"$.Payload.tableDetails\\"},\\"DetailType\\":\\"DataProductImportSuccess\\",\\"EventBusName\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus\\",\\"Source\\":\\"ada.data-products\\"}]}},\\"GetPiiResultsFromAthena\\":{\\"Next\\":\\"NotifyForSuccess\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.tableDetails\\",\\"Resource\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Parameters\\":{\\"Payload\\":{\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"executePiiDetectionOutput.$\\":\\"$.Payload.executePiiDetectionOutput\\"}}},\\"ExecutePiiQueryForAllTables\\":{\\"Type\\":\\"Map\\",\\"ResultPath\\":\\"$.Payload.executePiiDetectionOutput\\",\\"Next\\":\\"GetPiiResultsFromAthena\\",\\"InputPath\\":\\"$.Payload.generatePiiQueryOutput.piiQuery\\",\\"Parameters\\":{\\"contextIndex.$\\":\\"$$.Map.Item.Index\\",\\"query.$\\":\\"$$.Map.Item.Value\\",\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"outputS3Path\\":\\"s3://data-bucket/test-domain/test-data-product/_pii-detection-output\\"},\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Iterator\\":{\\"StartAt\\":\\"IsQueryNotEmpty?\\",\\"States\\":{\\"IsQueryNotEmpty?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Not\\":{\\"Variable\\":\\"$.query\\",\\"StringEquals\\":\\"\\"},\\"Next\\":\\"ExecuteQueryForPIIDetection\\"}],\\"Default\\":\\"SkipPiiDetection\\"},\\"SkipPiiDetection\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"piiDetectionSkipped\\":true},\\"End\\":true},\\"ExecuteQueryForPIIDetection\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::states:startExecution.sync:2\\",\\"Parameters\\":{\\"Input.$\\":\\"$\\",\\"StateMachineArn\\":\\"arn:aws:states:us-east-1:123456789012:stateMachine:TestStateMachine\\"}}}}},\\"GeneratePiiQuery\\":{\\"Next\\":\\"ExecutePiiQueryForAllTables\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"ResultPath\\":\\"$.ErrorDetails\\",\\"Next\\":\\"NotifyForError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.Payload.generatePiiQueryOutput\\",\\"Resource\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"Parameters\\":{\\"Payload\\":{\\"tableDetails.$\\":\\"$.Payload.tableDetails\\",\\"athenaUtilitiesLambdaName\\":\\"arn:aws:lambda:ap-southeast-1:1111111111:test\\",\\"databaseName\\":\\"rawDB\\"}}},\\"NotifyForError\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::events:putEvents\\",\\"Parameters\\":{\\"Entries\\":[{\\"Detail\\":{\\"dataProduct\\":{\\"dataProductId\\":\\"test-data-product\\",\\"domainId\\":\\"test-domain\\",\\"name\\":\\"Test\\",\\"infrastructureStatus\\":\\"PROVISIONING\\",\\"dataStatus\\":\\"NO_DATA\\",\\"dataSets\\":{},\\"tags\\":[],\\"enableAutomaticTransforms\\":true,\\"enableAutomaticPii\\":false,\\"transforms\\":[{\\"scriptId\\":\\"ada_parquet_data_type_map\\",\\"namespace\\":\\"global\\"}],\\"updateTrigger\\":{\\"triggerType\\":\\"ON_DEMAND\\"},\\"parentDataProducts\\":[],\\"childDataProducts\\":[],\\"sourceType\\":\\"ORACLE\\",\\"sourceDetails\\":{\\"databaseEndpoint\\":\\"mydb.123456789012.ap-southeast-2.rds.amazonaws.com\\"}},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"},\\"executionId.$\\":\\"$$.Execution.Id\\",\\"errorDetails.$\\":\\"$.ErrorDetails\\",\\"currentPayload.$\\":\\"$\\"},\\"DetailType\\":\\"DataProductImportError\\",\\"EventBusName\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:event-bus/eventBus\\",\\"Source\\":\\"ada.data-products\\"}]}},\\"DeconstructErrorFromStateMachineExecution\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"ErrorDetails\\":{\\"Error.$\\":\\"$.Output.Payload.error\\"}},\\"Next\\":\\"NotifyForError\\"}}}", + ], + ], + }, + "LoggingConfiguration": Object { + "Destinations": Array [ + Object { + "CloudWatchLogsLogGroup": Object { + "LogGroupArn": Object { + "Fn::GetAtt": Array [ + "StateMachineLogs3CB16D3C", + "Arn", + ], + }, + }, + }, + ], + "Level": "ERROR", + }, + "RoleArn": Object { + "Fn::GetAtt": Array [ + "SourceAccessRoleC447CA39", + "Arn", + ], + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + Object { + "Key": "DataProductId", + "Value": "test-data-product", + }, + Object { + "Key": "DomainId", + "Value": "test-domain", + }, + ], + "TracingConfiguration": Object { + "Enabled": true, + }, + }, + "Type": "AWS::StepFunctions::StateMachine", + "UpdateReplacePolicy": "Delete", + }, + "StateMachineLogs3CB16D3C": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "LogGroupName": "/aws/vendedlogs/states/ada/dataproduct/test-d4688test-d45928737/StateMachineLogs/loggroup-######", + "RetentionInDays": 731, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + Object { + "Key": "DataProductId", + "Value": "test-data-product", + }, + Object { + "Key": "DomainId", + "Value": "test-domain", + }, + ], + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "StaticInfrastructureNotificationBusDataProductOnDemandUpdateRuleCBE74CDB": Object { + "Properties": Object { + "Description": "On demand updates for Test", + "EventBusName": "eventBus", + "EventPattern": Object { + "detail": Object { + "dataProductId": Array [ + "test-data-product", + ], + "domainId": Array [ + "test-domain", + ], + }, + "detail-type": Array [ + "DataProductOnDemandUpdate", + ], + "source": Array [ + "ada.data-products", + ], + }, + "State": "ENABLED", + "Targets": Array [ + Object { + "Arn": "arn:aws:lambda:ap-southeast-1:1111111111:test", + "Id": "Target0", + "Input": Object { + "Fn::Join": Array [ + "", + Array [ + "{\\"stateMachineArn\\":\\"", + Object { + "Ref": "StateMachine2E01A3A5", + }, + "\\",\\"dataProductIdentifier\\":{\\"domainId\\":\\"test-domain\\",\\"dataProductId\\":\\"test-data-product\\"},\\"callingUser\\":{\\"userId\\":\\"test-user\\",\\"groups\\":[\\"admin\\",\\"analyst\\"],\\"username\\":\\"test-user@example.com\\"}}", + ], + ], + }, + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + }, + "Rules": Object {}, +} +`; diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.test.ts b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.test.ts new file mode 100644 index 0000000..bf1b58d --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.test.ts @@ -0,0 +1,91 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { TestApp as App, TEST_ENVIRONMENT, cleanTemplateForSnapshot } from '@ada/cdk-core'; +import { DEFAULT_CALLER, MOCK_BASE_DATAPRODUCT, TEST_STATIC_INFRASTRUCTURE } from '@ada/microservice-test-common'; +import { DataProductUpdateTriggerType } from '@ada/common'; +import { DynamicInfra } from '@ada/data-product-infra-types'; +import { ID } from '../..'; +import { ISourceDetails__JDBC } from '@ada/connectors/common/jdbc/types'; +import { OracleSourceStack } from './stack'; +import { Template } from 'aws-cdk-lib/assertions'; +import { testSynthesizeConnectorStack } from '@ada/services/data-product/dynamic-infrastructure/synthesizers/testing/helpers'; + +describe('oracle-source-stack', () => { + it(`should create resources with trigger type ${DataProductUpdateTriggerType.ON_DEMAND}`, () => { + const app = new App(); + const props: DynamicInfra.StackProps = { + env: TEST_ENVIRONMENT, + dataProduct: { + ...MOCK_BASE_DATAPRODUCT, + sourceDetails: { databaseEndpoint: 'mydb.123456789012.ap-southeast-2.rds.amazonaws.com' }, + updateTrigger: { triggerType: DataProductUpdateTriggerType.ON_DEMAND }, + enableAutomaticTransforms: true, + transforms: [ + { + scriptId: 'my-transform', + }, + ], + } as any, + callingUser: DEFAULT_CALLER, + staticInfrastructure: TEST_STATIC_INFRASTRUCTURE, + }; + + expect(() => Template.fromStack(new OracleSourceStack(app, 'test-oracle-stack', props))).not.toThrow(); + }); + + it('should create resources schedule', () => { + const app = new App(); + const props: DynamicInfra.StackProps = { + dataProduct: { + ...MOCK_BASE_DATAPRODUCT, + sourceDetails: { databaseEndpoint: 'mydb.123456789012.ap-southeast-2.rds.amazonaws.com' }, + updateTrigger: { triggerType: DataProductUpdateTriggerType.SCHEDULE, scheduleRate: 'cron(0 12 * * ? *)' }, + enableAutomaticTransforms: true, + transforms: [ + { + scriptId: 'my-transform', + }, + ], + } as any, + callingUser: DEFAULT_CALLER, + staticInfrastructure: TEST_STATIC_INFRASTRUCTURE, + env: TEST_ENVIRONMENT, + }; + + expect(() => Template.fromStack(new OracleSourceStack(app, 'test-oracle-stack', props))).not.toThrow(); + }); + + it('unsupported trigger type should throw an error', () => { + const app = new App(); + const props: DynamicInfra.StackProps = { + dataProduct: { + ...MOCK_BASE_DATAPRODUCT, + sourceDetails: { databaseEndpoint: 'mydb.123456789012.ap-southeast-2.rds.amazonaws.com' }, + updateTrigger: { triggerType: 'unknownTrigger' }, + transforms: [ + { + scriptId: 'my-transform', + }, + ], + } as any, + callingUser: DEFAULT_CALLER, + staticInfrastructure: TEST_STATIC_INFRASTRUCTURE, + env: TEST_ENVIRONMENT, + }; + + expect(() => Template.fromStack(new OracleSourceStack(app, 'test-oracle-stack', props))).toThrow(); + }); +}); + +describe('stack/synthesizer/oracle', () => { + it('snapshot', async () => { + const stack = await testSynthesizeConnectorStack({ + sourceType: ID, + sourceDetails: { + databaseEndpoint: 'mydb.123456789012.ap-southeast-2.rds.amazonaws.com', + } as ISourceDetails__JDBC, + }); + + expect(cleanTemplateForSnapshot(Template.fromStack(stack).toJSON())).toMatchSnapshot(); + }); +}); diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.ts b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.ts new file mode 100644 index 0000000..d56708f --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/dynamic/stack.ts @@ -0,0 +1,22 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { Construct } from 'constructs'; +import { DynamicInfraStackProps } from '@ada/dynamic-infra/stacks/dynamic-infrastructure-stack-base'; +import { ISourceDetails__JDBC } from '@ada/connectors/common/jdbc/types'; +import { JDBCSourceStackBase } from '@ada/connectors/common/jdbc/base-stack'; + +/** + * Stack for dynamic infrastructure for an OracleDB data product + */ +export class OracleSourceStack extends JDBCSourceStackBase { + constructor(scope: Construct, id: string, props: DynamicInfraStackProps) { + super(scope, id, props); + } + + protected getConnectionString(sourceDetails: ISourceDetails__JDBC): string { + const { databaseEndpoint, databasePort, databaseName } = sourceDetails; + return `jdbc:oracle:thin://@${databaseEndpoint}:${databasePort}/${databaseName}`; + } +} + +export default OracleSourceStack; diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/register.ts b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/register.ts new file mode 100644 index 0000000..2d2015a --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/register.ts @@ -0,0 +1,20 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +//////////////////////////////////////////////////////////////// +// REGISTER CONNECTOR INFRA - DO NOT EDIT THIS FILE +//////////////////////////////////////////////////////////////// +import { ConnectorIntegrator } from './static'; +import { Connectors } from '@ada/connectors/interface'; +import { ID } from '../index'; +import DynamicStack from './dynamic/stack'; + +declare module '@ada/connectors/interface' { + interface CONNECTOR_INFRA_REGISTRY { + [ID]: Connectors.IConnectorInfra<{}, {}, {}>; + } +} + +Connectors.Infra.register(ID, { + staticIntegrator: ConnectorIntegrator, + dynamicStackClass: DynamicStack, +}); diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/static/index.ts b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/static/index.ts new file mode 100644 index 0000000..426e163 --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/infra/static/index.ts @@ -0,0 +1,15 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { Connectors } from '@ada/connectors/interface'; +import { ID } from '../..'; + +/* eslint-disable max-len */ + +//////////////////////////////////////////// +// CONNECTOR STATIC INFRA - the actual static infrastructure deployed for this connector +//////////////////////////////////////////// +export const ConnectorIntegrator: Connectors.Infra.Static.Integrator = { + ID, + staticInfra: undefined, + staticInfraRefs: undefined, +}; diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/__init__.py b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/__init__.py new file mode 100644 index 0000000..6ca3e9b --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/__init__.py @@ -0,0 +1,10 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### +from handlers.common import * # NOSONAR +from .pull_samples import pull_samples + +ORACLE = IConnector( + pull_samples=pull_samples +) diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/pull_samples.py b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/pull_samples.py new file mode 100644 index 0000000..2361bcb --- /dev/null +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_oracle/preview/pull_samples.py @@ -0,0 +1,53 @@ +################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +################################################################### +import re +import awswrangler as wr +import os +import uuid + +from handlers.common import * # NOSONAR +from handlers.sampling.common import SamplingUtils # NOSONAR +from handlers.sampling.common import PreviewGlueConnection # NOSONAR +from handlers.sampling.common import SecretsManager # NOSONAR +import pandas as pd + +SOURCEDETAILS_CREDENTIAL_FIELD_NAME = 'password' +SOURCEDETAILS_CREDENTIAL_SECRET_NAME = 'dbCredentialSecretName' + + +def pull_samples(input: IPullSamplesInput) -> IPullSamplesReturn: # NOSONAR (python:S3776) - false positive + """ + Pull sample data from Oracle Database + """ + boto3_session = input.boto3_session + source_details = input.source_details + sample_size = input.sample_size + + jdbc_connection_string = "jdbc:oracle:thin://@" + \ + source_details['databaseEndpoint'] + ":" + source_details['databasePort'] + "/" + source_details['databaseName'] + + # retrieve password from source details + db_password = SecretsManager.get_credentials_from_source( + source_details, + SOURCEDETAILS_CREDENTIAL_FIELD_NAME, + SOURCEDETAILS_CREDENTIAL_SECRET_NAME + ) + + with PreviewGlueConnection(jdbc_connection_string, source_details, db_password, boto3_session) as glue_connection_name: + # aws wrangler to connect to oracle db and pull out a preview + # sanitize sql table name to prevent sql injection + table_name = source_details['databaseTable'].replace('`', '') + sql_query = f"SELECT * FROM {table_name} FETCH FIRST {str(sample_size)} rows only" + + try: + df = None + con_oracle = wr.oracle.connect(glue_connection_name, boto3_session=boto3_session) + df = pd.DataFrame(wr.oracle.read_sql_query(sql=sql_query, con=con_oracle)) + con_oracle.close() + + except Exception as e: + print(e) + + return [Sample(source_details['databaseTable'], next(iter([df])), 'parquet')] diff --git a/source/packages/@ada/infra/src/connectors/sources/jdbc_postgresql/index.ts b/source/packages/@ada/infra/src/connectors/sources/jdbc_postgresql/index.ts index f8bb675..5e16c26 100644 --- a/source/packages/@ada/infra/src/connectors/sources/jdbc_postgresql/index.ts +++ b/source/packages/@ada/infra/src/connectors/sources/jdbc_postgresql/index.ts @@ -166,7 +166,7 @@ export const CONNECTOR: Connectors.IConnector ({ ...(jest.requireActual('@ada/aws-sdk') as any), AwsLambdaInstance: jest.fn().mockImplementation(() => ({ - invokeAsync: (...args: any[]) => ({ - promise: jest.fn(() => Promise.resolve(mockInvokeAsync(...args))), + invoke: (...args: any[]) => ({ + promise: jest.fn(() => Promise.resolve(mockInvoke(...args))), }), })), SSM: jest.fn().mockImplementation(() => ({ @@ -39,9 +40,10 @@ describe('start-tear-down-destroy-data', () => { }), ); - expect(mockInvokeAsync).toHaveBeenCalledWith({ + expect(mockInvoke).toHaveBeenCalledWith({ FunctionName: 'tear-down-lambda-arn', - InvokeArgs: JSON.stringify({ mode: TearDownMode.DESTROY_DATA }), + Payload: JSON.stringify({ mode: TearDownMode.DESTROY_DATA }), + InvocationType: InvocationType.EVENT }); }); }); diff --git a/source/packages/@ada/infra/src/services/administration/api/handlers/__tests__/start-tear-down-retain-data.test.ts b/source/packages/@ada/infra/src/services/administration/api/handlers/__tests__/start-tear-down-retain-data.test.ts index 4905a5b..8312d7d 100644 --- a/source/packages/@ada/infra/src/services/administration/api/handlers/__tests__/start-tear-down-retain-data.test.ts +++ b/source/packages/@ada/infra/src/services/administration/api/handlers/__tests__/start-tear-down-retain-data.test.ts @@ -1,17 +1,18 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ +import { InvocationType } from 'aws-cdk-lib/triggers'; import { DEFAULT_CALLER } from '../../../../../common/services/testing/default-entities'; import { TearDownMode } from '../types'; import { buildApiRequest } from '../../../../api/api-gateway'; import { handler } from '../start-tear-down-retain-data'; -const mockInvokeAsync = jest.fn(); +const mockInvoke = jest.fn(); jest.mock('@ada/aws-sdk', () => ({ ...(jest.requireActual('@ada/aws-sdk') as any), AwsLambdaInstance: jest.fn().mockImplementation(() => ({ - invokeAsync: (...args: any[]) => ({ - promise: jest.fn(() => Promise.resolve(mockInvokeAsync(...args))), + invoke: (...args: any[]) => ({ + promise: jest.fn(() => Promise.resolve(mockInvoke(...args))), }), })), SSM: jest.fn().mockImplementation(() => ({ @@ -39,9 +40,10 @@ describe('start-tear-down-retain-data', () => { }), ); - expect(mockInvokeAsync).toHaveBeenCalledWith({ + expect(mockInvoke).toHaveBeenCalledWith({ FunctionName: 'tear-down-lambda-arn', - InvokeArgs: JSON.stringify({ mode: TearDownMode.RETAIN_DATA }), + Payload: JSON.stringify({ mode: TearDownMode.RETAIN_DATA }), + InvocationType: InvocationType.EVENT, }); }); }); diff --git a/source/packages/@ada/infra/src/services/administration/api/handlers/tear-down.ts b/source/packages/@ada/infra/src/services/administration/api/handlers/tear-down.ts index 801f1ca..bcda3bb 100644 --- a/source/packages/@ada/infra/src/services/administration/api/handlers/tear-down.ts +++ b/source/packages/@ada/infra/src/services/administration/api/handlers/tear-down.ts @@ -9,6 +9,7 @@ import { AwsS3Instance, } from '@ada/aws-sdk'; import { DataProductStore } from '../../../data-product/components/ddb/data-product'; +import { InvocationType } from 'aws-cdk-lib/triggers'; import { Logger } from '@ada/infra-common/constructs/lambda/lambda-logger'; import { TearDownDetails } from '@ada/api-client'; import { TearDownLambdaEvent, TearDownMode, TeardownEnvironmentVars } from './types'; @@ -41,9 +42,10 @@ const DATA_PRODUCT_START_DESTROY_BATCH_SIZE = 10; export const startTearDown = async (event: TearDownLambdaEvent): Promise> => { // Trigger the tear down asynchronously await lambda - .invokeAsync({ + .invoke({ FunctionName: TEAR_DOWN_LAMBDA_ARN, - InvokeArgs: JSON.stringify(event), + Payload: JSON.stringify(event), + InvocationType: InvocationType.EVENT, }) .promise(); diff --git a/source/packages/@ada/infra/src/services/administration/jest-dynamodb-config.ts b/source/packages/@ada/infra/src/services/administration/jest-dynamodb-config.ts index 8359ac4..ff3a056 100644 --- a/source/packages/@ada/infra/src/services/administration/jest-dynamodb-config.ts +++ b/source/packages/@ada/infra/src/services/administration/jest-dynamodb-config.ts @@ -3,8 +3,8 @@ SPDX-License-Identifier: Apache-2.0 */ import { AttributeType } from 'aws-cdk-lib/aws-dynamodb'; // must be imported before any aliases import { Bucket } from 'aws-cdk-lib/aws-s3'; import { CountedTable } from '../../common/constructs/dynamodb/counted-table'; +import { DefinitionBody, Pass, StateMachine } from 'aws-cdk-lib/aws-stepfunctions'; import { NestedStack } from 'aws-cdk-lib'; -import { Pass, StateMachine } from 'aws-cdk-lib/aws-stepfunctions'; import { RetainedAspect, TestApp } from '@ada/cdk-core'; import { TestStackWithMockedApiService, buildCdkEnvironmentForTests } from '@ada/microservice-test-common'; import AdministrationServiceStack, { AdministrationServiceStackProps } from './stack'; @@ -13,12 +13,14 @@ import DataProductCreationStateMachine from '../data-product/components/creation export const generateEnvironmentForTests = () => { const stack = new TestStackWithMockedApiService(new TestApp()); new RetainedAspect(stack); //NOSONAR (S1848) - cdk construct is used - const { federatedApi, - counterTable, - notificationBus, - entityManagementTables, - internalTokenKey, - operationalMetricsConfig } = stack; + const { + federatedApi, + counterTable, + notificationBus, + entityManagementTables, + internalTokenKey, + operationalMetricsConfig, + } = stack; return { ...buildCdkEnvironmentForTests( @@ -33,11 +35,11 @@ export const generateEnvironmentForTests = () => { entityManagementTables, federatedApi, glueCrawlerStateMachine: new StateMachine(stack, 'CrawlerStateMachine', { - definition: new Pass(stack, 'noop'), + definitionBody: DefinitionBody.fromChainable(new Pass(stack, 'noop')), }), internalTokenKey, notificationBus, - operationalMetricsConfig + operationalMetricsConfig, }), dataProductTable: new CountedTable(stack, 'DataProductTable', { partitionKey: { diff --git a/source/packages/@ada/infra/src/services/administration/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/administration/stack/__snapshots__/index.test.ts.snap index 617c4f8..8a6bc57 100644 --- a/source/packages/@ada/infra/src/services/administration/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/administration/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-AdministrationService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-AdministrationService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaAdministrationServiceApiLambdaStartTearDownDestroyDataC06606E1Ref": Object { "Value": Object { @@ -1446,6 +1446,7 @@ Object { }, "ApiRestApiRefadministrationOPTIONS9595A0BA": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1511,6 +1512,7 @@ Object { }, "ApiRestApiRefadministrationstartteardownOPTIONS6D1EC999": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1597,11 +1599,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefadministrationstartteardowndestroydataDeleteAdministrationStartTearDownDestroyDataResponseC7F18D56", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1692,52 +1690,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefadministrationstartteardowndestroydataDeleteAdministrationStartTearDownDestroyDataResponseC7F18D56": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the tear down that has been started", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "coreStackId": Object { - "type": "string", - }, - "message": Object { - "type": "string", - }, - "mode": Object { - "description": "Indicates the teardown mode being performed.", - "enum": Array [ - "retain-data", - "destroy-data", - ], - "type": "string", - }, - "retainedResources": Object { - "description": "List of resource arns that will be retained after deletion has completed, unless mode is destroy data.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "coreStackId", - "mode", - "message", - "retainedResources", - ], - "title": "DeleteAdministrationStartTearDownDestroyDataResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefadministrationstartteardowndestroydataOPTIONSB50EAC5B": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1870,11 +1825,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefadministrationstartteardownretaindataDeleteAdministrationStartTearDownRetainDataResponse49D721C1", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1907,52 +1858,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefadministrationstartteardownretaindataDeleteAdministrationStartTearDownRetainDataResponse49D721C1": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the tear down that has been started", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "coreStackId": Object { - "type": "string", - }, - "message": Object { - "type": "string", - }, - "mode": Object { - "description": "Indicates the teardown mode being performed.", - "enum": Array [ - "retain-data", - "destroy-data", - ], - "type": "string", - }, - "retainedResources": Object { - "description": "List of resource arns that will be retained after deletion has completed, unless mode is destroy data.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "coreStackId", - "mode", - "message", - "retainedResources", - ], - "title": "DeleteAdministrationStartTearDownRetainDataResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefadministrationstartteardownretaindataOPTIONS4EFC215B": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { diff --git a/source/packages/@ada/infra/src/services/api/api/handlers/api-access-policy/put-policy.ts b/source/packages/@ada/infra/src/services/api/api/handlers/api-access-policy/put-policy.ts index b01c468..aadd518 100644 --- a/source/packages/@ada/infra/src/services/api/api/handlers/api-access-policy/put-policy.ts +++ b/source/packages/@ada/infra/src/services/api/api/handlers/api-access-policy/put-policy.ts @@ -1,6 +1,9 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ -import { ApiAccessPolicyStore } from '../../../components/ddb/api-access-policy'; +import { + ApiAccessPolicyStore, + ApiAccessPolicyWithCreateUpdateDetails, +} from '../../../components/ddb/api-access-policy'; import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; import { DefaultUser } from '@ada/microservice-common'; @@ -14,15 +17,19 @@ export const handler = ApiLambdaHandler.for( async ({ requestParameters, body: policyToWrite }, { userId }) => { const { apiAccessPolicyId } = requestParameters; - // NB: Only the api access policy protects this api, and only admin has rights to call this api by default. - return ApiResponse.success( - // Allow the system user to overwrite an existing api access policy - await ApiAccessPolicyStore.getInstance().putApiAccessPolicy( - apiAccessPolicyId, - userId, - policyToWrite, - userId === DefaultUser.SYSTEM, - ), + const ret = await ApiAccessPolicyStore.getInstance().putApiAccessPolicy( + apiAccessPolicyId, + userId, + policyToWrite, + userId === DefaultUser.SYSTEM, ); + + if (userId !== DefaultUser.SYSTEM) { + return ApiResponse.success(ret); + } else { + return ApiResponse.success({ + apiAccessPolicyId: ret.apiAccessPolicyId, + } as ApiAccessPolicyWithCreateUpdateDetails); + } }, ); diff --git a/source/packages/@ada/infra/src/services/api/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/api/stack/__snapshots__/index.test.ts.snap index aca0589..43a119f 100644 --- a/source/packages/@ada/infra/src/services/api/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/api/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-ApiService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-ApiService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaApiServiceFederatedApiAccessRequestTableC2AE5655Arn": Object { "Value": Object { @@ -178,7 +178,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -316,7 +316,7 @@ Object { "Fn::Join": Array [ "", Array [ - "{\\"service\\":\\"apigateway\\",\\"action\\":\\"deleteRestApi\\",\\"parameters\\":{\\"restApiId\\":\\"", + "{\\"service\\":\\"APIGateway\\",\\"action\\":\\"deleteRestApi\\",\\"parameters\\":{\\"restApiId\\":\\"", Object { "Ref": "FederatedApiFederatedRestApi4B626648", }, @@ -340,23 +340,40 @@ Object { "PolicyDocument": Object { "Statement": Array [ Object { - "Action": "apigateway:DeleteRestApi", + "Action": "apigateway:DELETE", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:1111111111:restapis/", - Object { - "Ref": "FederatedApiFederatedRestApi4B626648", - }, + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:1111111111:restapis/", + Object { + "Ref": "FederatedApiFederatedRestApi4B626648", + }, + ], ], - ], - }, + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1::/restapis/", + Object { + "Ref": "FederatedApiFederatedRestApi4B626648", + }, + ], + ], + }, + ], }, ], "Version": "2012-10-17", @@ -3985,6 +4002,7 @@ Object { }, "FederatedApiFederatedRestApiOPTIONSDAF42E56": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -4089,11 +4107,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiapiaccesspolicyListApiAccessPoliciesResponseB0D1C168", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -4189,191 +4203,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "FederatedApiFederatedRestApiapiaccesspolicyListApiAccessPoliciesResponseB0D1C168": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Available api access policies to associate with groups", - "RestApiId": Object { - "Ref": "FederatedApiFederatedRestApi4B626648", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ApiAccessPolicy": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "type": "object", - }, - "ApiAccessPolicyEntity": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "type": "object", - }, - "ApiAccessPolicyIdentifier": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "policies": Object { - "items": Object { - "$ref": "#/definitions/ApiAccessPolicyEntity", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "policies", - ], - "title": "ListApiAccessPoliciesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "FederatedApiFederatedRestApiapiaccesspolicyOPTIONS7ECA6862": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -4448,11 +4280,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdDeleteApiAccessPolicyResponse112CBBCC", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -4554,226 +4382,67 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdDeleteApiAccessPolicyResponse112CBBCC": Object { + "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdGET30806867": Object { "DependsOn": Array [ - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdPutApiAccessPolicyResponse3C622807", + "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdOPTIONSDE3C07F9", ], "Properties": Object { - "ContentType": "application/json", - "Description": "The deleted api access policy", - "RestApiId": Object { - "Ref": "FederatedApiFederatedRestApi4B626648", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "FederatedApiCustomAuthorizerHandlerFACFB2CE", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ApiAccessPolicy": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "FederatedApiApiAccessPolicyRoutesLambdaGetPolicyDDAF129E", + "Arn", + ], }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", + "/invocations", ], - "type": "object", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "FederatedApiFederatedRestApiFederatedRestApiErrorModel6C6C15A5", + }, }, - "ApiAccessPolicyIdentifier": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "FederatedApiFederatedRestApiFederatedRestApiErrorModel6C6C15A5", }, - "required": Array [ - "apiAccessPolicyId", - ], - "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "StatusCode": "403", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "FederatedApiFederatedRestApiFederatedRestApiErrorModel6C6C15A5", }, - "type": "object", }, - }, - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "title": "DeleteApiAccessPolicyResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdGET30806867": Object { - "DependsOn": Array [ - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdOPTIONSDE3C07F9", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "FederatedApiCustomAuthorizerHandlerFACFB2CE", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "FederatedApiApiAccessPolicyRoutesLambdaGetPolicyDDAF129E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdGetApiAccessPolicyResponse604553CE", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiFederatedRestApiErrorModel6C6C15A5", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiFederatedRestApiErrorModel6C6C15A5", - }, - }, - "StatusCode": "403", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiFederatedRestApiErrorModel6C6C15A5", - }, - }, - "StatusCode": "404", + "StatusCode": "404", }, ], "OperationName": "GetApiAccessPolicy", @@ -4850,160 +4519,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdGetApiAccessPolicyResponse604553CE": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The api access policy", - "RestApiId": Object { - "Ref": "FederatedApiFederatedRestApi4B626648", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ApiAccessPolicy": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "type": "object", - }, - "ApiAccessPolicyIdentifier": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "title": "GetApiAccessPolicyResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdOPTIONSDE3C07F9": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -5078,11 +4596,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdPutApiAccessPolicyResponse3C622807", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -5182,9 +4696,6 @@ Object { "Type": "AWS::Lambda::Permission", }, "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdPutApiAccessPolicyRequest39ED14BC": Object { - "DependsOn": Array [ - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdGetApiAccessPolicyResponse604553CE", - ], "Properties": Object { "ContentType": "application/json", "Description": "Details of the api access policy to create/update", @@ -5257,161 +4768,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdPutApiAccessPolicyResponse3C622807": Object { - "DependsOn": Array [ - "FederatedApiFederatedRestApiapiaccesspolicyapiAccessPolicyIdPutApiAccessPolicyRequest39ED14BC", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated api access policy", - "RestApiId": Object { - "Ref": "FederatedApiFederatedRestApi4B626648", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ApiAccessPolicy": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "type": "object", - }, - "ApiAccessPolicyIdentifier": Object { - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "apiAccessPolicyId": Object { - "description": "Identifier for an api access policy", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the api access policy", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "Name of the api access policy", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "resources": Object { - "items": Object { - "description": "Resource arn for execute-api:Invoke permission associated with the policy", - "maxLength": 2048, - "pattern": "^arn:[^:]+:execute-api:[^:]+:[0-9]+:[^\\\\/]+\\\\/.*$", - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyId", - "name", - "resources", - ], - "title": "PutApiAccessPolicyResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "FederatedApiFederatedRestApicostGETA93F13B5": Object { "DependsOn": Array [ "FederatedApiFederatedRestApicostOPTIONS031F695C", @@ -5447,11 +4803,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApicostListCostsResponse4C465921", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -5546,144 +4898,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "FederatedApiFederatedRestApicostListCostsResponse4C465921": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the cost", - "RestApiId": Object { - "Ref": "FederatedApiFederatedRestApi4B626648", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "MetricValue": Object { - "properties": Object { - "amount": Object { - "description": "The actual number that represents the metric.", - "type": "string", - }, - "unit": Object { - "description": "The unit that the metric is given in.", - "type": "string", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "dimensionValueAttributes": Object { - "description": "Group by function", - "items": Object { - "properties": Object { - "key": Object { - "description": "The key to group by", - "type": "string", - }, - "type": Object { - "description": "Group Definition type. \\"DIMENSION\\"|\\"TAG\\"|\\"COST_CATEGORY\\"", - "type": "string", - }, - }, - "type": "object", - }, - "type": "array", - }, - "groupDefinitions": Object { - "description": "Group by function", - "items": Object { - "properties": Object { - "key": Object { - "description": "The key to group by", - "type": "string", - }, - "type": Object { - "description": "Group Definition type. \\"DIMENSION\\"|\\"TAG\\"|\\"COST_CATEGORY\\"", - "type": "string", - }, - }, - "type": "object", - }, - "type": "array", - }, - "resultsByTime": Object { - "description": "Results by time", - "items": Object { - "properties": Object { - "estimated": Object { - "description": "Whether it is an estimation or not", - "type": "boolean", - }, - "groups": Object { - "description": "Groups", - "items": Object { - "properties": Object { - "keys": Object { - "items": Object { - "type": "string", - }, - "type": "array", - }, - "metrics": Object { - "additionalProperties": Object { - "$ref": "#/definitions/MetricValue", - }, - "type": "object", - }, - }, - "type": "object", - }, - "type": "array", - }, - "timePeriod": Object { - "properties": Object { - "end": Object { - "description": "end timestamp", - "type": "string", - }, - "start": Object { - "description": "start timestamp", - "type": "string", - }, - }, - "type": "object", - }, - "total": Object { - "description": "Total", - "properties": Object { - "blendedCost": Object { - "additionalProperties": Object { - "$ref": "#/definitions/MetricValue", - }, - "type": "object", - }, - "usageQuantity": Object { - "additionalProperties": Object { - "$ref": "#/definitions/MetricValue", - }, - "type": "object", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - "type": "array", - }, - }, - "required": Array [ - "groupDefinitions", - "resultsByTime", - "dimensionValueAttributes", - ], - "title": "listCostsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "FederatedApiFederatedRestApicostOPTIONS031F695C": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -5725,6 +4942,7 @@ Object { }, "FederatedApiFederatedRestApipermissionOPTIONS4C8552DE": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -5778,6 +4996,7 @@ Object { }, "FederatedApiFederatedRestApipermissionuserOPTIONSBFEA1350": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -5922,11 +5141,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "FederatedApiFederatedRestApipermissionuseruserIdGetPermissionUserResponseE0166071", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -5970,52 +5185,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "FederatedApiFederatedRestApipermissionuseruserIdGetPermissionUserResponseE0166071": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of APIs that the user has access to", - "RestApiId": Object { - "Ref": "FederatedApiFederatedRestApi4B626648", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "Permission": Object { - "description": "Define the permission for the given route", - "properties": Object { - "access": Object { - "description": "A flag that define whether the user can call this route or not", - "type": "boolean", - }, - }, - "type": "object", - }, - "UserPermission": Object { - "additionalProperties": Object { - "$ref": "#/definitions/Permission", - "description": "Define the permission for the given route", - }, - "description": "Map of route by name", - "type": "object", - }, - }, - "properties": Object { - "permissions": Object { - "$ref": "#/definitions/UserPermission", - "description": "Map of route by name", - }, - }, - "required": Array [ - "permissions", - ], - "title": "GetPermissionUserResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "FederatedApiFederatedRestApipermissionuseruserIdOPTIONS39A666CC": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { diff --git a/source/packages/@ada/infra/src/services/api/stack/index.ts b/source/packages/@ada/infra/src/services/api/stack/index.ts index 69b05c7..2c0ca35 100644 --- a/source/packages/@ada/infra/src/services/api/stack/index.ts +++ b/source/packages/@ada/infra/src/services/api/stack/index.ts @@ -11,6 +11,7 @@ import { EntityManagementTables } from '../components/entity/constructs/entity-m import { FederatedRestApi } from '../../../common/constructs/api/federated-api'; import { InternalTokenKey } from '../../../common/constructs/kms/internal-token-key'; import { NotificationBus } from '../components/notification/constructs/bus'; +import { PolicyStatement } from 'aws-cdk-lib/aws-iam'; import { Stack } from 'aws-cdk-lib'; import { UserPool } from 'aws-cdk-lib/aws-cognito'; import FederatedApi from '../api'; @@ -85,21 +86,22 @@ export class ApiServiceStack extends BaseMicroservice { // Using custom resource to delete the entire api, rather than per resource (resources, methods, integration, etc) new AwsCustomResource(this, 'ApiTeardown', { //NOSONAR (typescript:S1848) - cdk construct is used onDelete: { - service: 'apigateway', + service: 'APIGateway', action: 'deleteRestApi', parameters: { restApiId: this.api.restApiId, }, }, - policy: AwsCustomResourcePolicy.fromSdkCalls({ - resources: [ - Stack.of(this).formatArn({ - service: 'apigateway', - resource: 'restapis', - resourceName: this.api.restApiId, - }), + policy: AwsCustomResourcePolicy.fromStatements([new PolicyStatement({ + resources: [Stack.of(this).formatArn({ + service: 'apigateway', + resource: 'restapis', + resourceName: this.api.restApiId, + }), + `arn:${Stack.of(this).partition}:apigateway:${Stack.of(this).region}::/restapis/${this.api.restApiId}` ], - }), + actions: ['apigateway:DELETE'], + })]), }); } } diff --git a/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/build-data-product.test.ts b/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/build-data-product.test.ts index 9c8fe0b..de48308 100644 --- a/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/build-data-product.test.ts +++ b/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/build-data-product.test.ts @@ -31,7 +31,7 @@ jest.mock('@ada/aws-sdk', () => ({ assumeRole: () => ({ promise: jest.fn(() => Promise.resolve({ - Credentials: { AccessKeyId: 'access-key', SecretAccessKey: 'secret-key', SessionToken: 'session-token' }, + Credentials: { AccessKeyId: 'accessKey', SecretAccessKey: 'secretKey', SessionToken: 'sessionToken' }, }), ), }), diff --git a/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/post-data-product.test.ts b/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/post-data-product.test.ts index 4d46bc8..604b724 100644 --- a/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/post-data-product.test.ts +++ b/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/post-data-product.test.ts @@ -9,7 +9,6 @@ import { DataProductDataStatus, DataProductInfrastructureStatus, DataProductSourceDataStatus, - DefaultGroupIds, ReservedDataProducts, } from '@ada/common'; import { @@ -32,7 +31,7 @@ import { METRICS_EVENT_TYPE, OperationalMetricsClient } from '@ada/services/api/ jest.mock('@ada/api-client-lambda'); const mockStartExecution = jest.fn(); const mockCreateSecret = jest.fn(); -const mockInvokeAsync = jest.fn(); +const mockInvoke = jest.fn(); const mockSendOperationalMetrics = jest.fn(); jest.mock('@ada/aws-sdk', () => ({ @@ -55,8 +54,8 @@ jest.mock('@ada/aws-sdk', () => ({ }), })), AwsLambdaInstance: jest.fn().mockImplementation(() => ({ - invokeAsync: (...args: any[]) => ({ - promise: jest.fn(() => Promise.resolve(mockInvokeAsync(...args))), + invoke: (...args: any[]) => ({ + promise: jest.fn(() => Promise.resolve(mockInvoke(...args))), }), })), })); @@ -141,7 +140,7 @@ describe('post-data-product', () => { }, }), }); - expect(mockInvokeAsync).toHaveBeenCalled(); + expect(mockInvoke).toHaveBeenCalled(); // Should set the default policy expect(API.putGovernancePolicyDomainDataProduct).toHaveBeenCalledWith< @@ -212,7 +211,7 @@ describe('post-data-product', () => { }, }), }); - expect(mockInvokeAsync).toHaveBeenCalled(); + expect(mockInvoke).toHaveBeenCalled(); // Should have created the secret as this is google storage expect(mockCreateSecret).toHaveBeenCalledWith({ @@ -255,7 +254,7 @@ describe('post-data-product', () => { }, }), }); - expect(mockInvokeAsync).toHaveBeenCalled(); + expect(mockInvoke).toHaveBeenCalled(); // Should set the default policy with the full access groups expect(API.putGovernancePolicyDomainDataProduct).toHaveBeenCalledWith< @@ -290,7 +289,7 @@ describe('post-data-product', () => { // Shouldn't have kicked off any infrastructure creation expect(mockStartExecution).not.toHaveBeenCalled(); - expect(mockInvokeAsync).not.toHaveBeenCalled(); + expect(mockInvoke).not.toHaveBeenCalled(); }); it('should not allow creating a data product with a script in a different domain', async () => { @@ -307,7 +306,7 @@ describe('post-data-product', () => { // Shouldn't have kicked off any infrastructure creation expect(mockStartExecution).not.toHaveBeenCalled(); - expect(mockInvokeAsync).not.toHaveBeenCalled(); + expect(mockInvoke).not.toHaveBeenCalled(); }); it('should not update an existing data product', async () => { @@ -421,7 +420,7 @@ describe('post-data-product', () => { }, }), }); - expect(mockInvokeAsync).toHaveBeenCalled(); + expect(mockInvoke).toHaveBeenCalled(); // Should set the default policy expect(API.putGovernancePolicyDomainDataProduct).toHaveBeenCalledWith< diff --git a/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/put-data-protuct.test.ts b/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/put-data-protuct.test.ts index 01cbdec..2b2aa40 100644 --- a/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/put-data-protuct.test.ts +++ b/source/packages/@ada/infra/src/services/data-product/api/handlers/__tests__/put-data-protuct.test.ts @@ -1,7 +1,7 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import 'jest-extended'; -import { MOCK_API_CLIENT as API, Api } from '@ada/api-client/mock'; +import { MOCK_API_CLIENT as API } from '@ada/api-client/mock'; import { APIGatewayProxyResult } from 'aws-lambda'; import { CallingUser, DataProductAccess, DataProductDataStatus, DataProductInfrastructureStatus } from '@ada/common'; import { @@ -20,7 +20,7 @@ import { noopMockRelationshipClient } from '../../../../api/components/entity/re jest.mock('@ada/api-client-lambda'); const mockStartExecution = jest.fn(); const mockCreateSecret = jest.fn(); -const mockInvokeAsync = jest.fn(); +const mockInvoke = jest.fn(); jest.mock('@ada/aws-sdk', () => ({ ...(jest.requireActual('@ada/aws-sdk') as any), @@ -42,8 +42,8 @@ jest.mock('@ada/aws-sdk', () => ({ }), })), AwsLambdaInstance: jest.fn().mockImplementation(() => ({ - invokeAsync: (...args: any[]) => ({ - promise: jest.fn(() => Promise.resolve(mockInvokeAsync(...args))), + invoke: (...args: any[]) => ({ + promise: jest.fn(() => Promise.resolve(mockInvoke(...args))), }), })), })); @@ -135,7 +135,7 @@ describe('put-data-product', () => { // Shouldn't have kicked off any infrastructure creation expect(mockStartExecution).not.toHaveBeenCalled(); - expect(mockInvokeAsync).not.toHaveBeenCalled(); + expect(mockInvoke).not.toHaveBeenCalled(); }); it('should update an existing data product event if updatedTimestamp does not match', async () => { @@ -221,6 +221,6 @@ describe('put-data-product', () => { // Shouldn't have kicked off any infrastructure creation expect(mockStartExecution).not.toHaveBeenCalled(); - expect(mockInvokeAsync).not.toHaveBeenCalled(); + expect(mockInvoke).not.toHaveBeenCalled(); }); }); diff --git a/source/packages/@ada/infra/src/services/data-product/api/handlers/build-data-product.ts b/source/packages/@ada/infra/src/services/data-product/api/handlers/build-data-product.ts index 8c76e18..7cb32ec 100644 --- a/source/packages/@ada/infra/src/services/data-product/api/handlers/build-data-product.ts +++ b/source/packages/@ada/infra/src/services/data-product/api/handlers/build-data-product.ts @@ -19,6 +19,7 @@ import { buildFlatDataType, previewSchemaToColumnMetadata, } from '@ada/microservice-common'; +import { InvocationType } from 'aws-cdk-lib/triggers'; import { LockClient } from '../../../api/components/entity/locks/client'; import { Logger } from '@ada/infra-common/constructs/lambda/lambda-logger'; import { VError } from 'verror'; @@ -55,9 +56,10 @@ export const isRawSourceSupported = (dataProduct: DataProduct): boolean => { export const startBuildDataProductSchemaAndSource = async (input: BuildDataProductInput) => { // Invoke the lambda handler defined in this file await lambda - .invokeAsync({ + .invoke({ FunctionName: BUILD_DATA_PRODUCT_LAMBDA_ARN ?? '', - InvokeArgs: JSON.stringify(input), + Payload: JSON.stringify(input), + InvocationType: InvocationType.EVENT, }) .promise(); }; diff --git a/source/packages/@ada/infra/src/services/data-product/api/handlers/put-script.ts b/source/packages/@ada/infra/src/services/data-product/api/handlers/put-script.ts index 001150d..29cf5f1 100644 --- a/source/packages/@ada/infra/src/services/data-product/api/handlers/put-script.ts +++ b/source/packages/@ada/infra/src/services/data-product/api/handlers/put-script.ts @@ -5,7 +5,7 @@ import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; import { DefaultGroupIds, DefaultUser, ReservedDomains } from '@ada/common'; import { EntityIdentifier, entityIdentifier } from '@ada/api-client/types'; import { ScriptBucket } from '../../components/s3/script'; -import { ScriptIdentifier } from '@ada/api'; +import { ScriptEntity, ScriptIdentifier } from '@ada/api'; import { ScriptStore } from '../../components/ddb/script'; import { VError } from 'verror'; @@ -95,6 +95,11 @@ export const handler = ApiLambdaHandler.for( await lockClient.release(...domainLocks); - return ApiResponse.success(writtenScript); + if (callingUser.userId !== DefaultUser.SYSTEM) { + return ApiResponse.success(writtenScript); + } else { + // for system user, the call is made from CDK custom resource which has length limitation on response object. + return ApiResponse.success({ name: writtenScript.name } as ScriptEntity); + } }, ); diff --git a/source/packages/@ada/infra/src/services/data-product/components/crawler-poller-state-machine/index.ts b/source/packages/@ada/infra/src/services/data-product/components/crawler-poller-state-machine/index.ts index 7b98211..678b06b 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/crawler-poller-state-machine/index.ts +++ b/source/packages/@ada/infra/src/services/data-product/components/crawler-poller-state-machine/index.ts @@ -1,6 +1,16 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ -import { Choice, Condition, LogLevel, Pass, StateMachine, TaskInput, Wait, WaitTime } from 'aws-cdk-lib/aws-stepfunctions'; +import { + Choice, + Condition, + DefinitionBody, + LogLevel, + Pass, + StateMachine, + TaskInput, + Wait, + WaitTime, +} from 'aws-cdk-lib/aws-stepfunctions'; import { Construct } from 'constructs'; import { Duration, RemovalPolicy, Stack } from 'aws-cdk-lib'; import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; @@ -94,7 +104,7 @@ export class CrawlerPollerStateMachine extends Construct { ); this.stateMachine = new StateMachine(this, 'StateMachine', { - definition, + definitionBody: DefinitionBody.fromChainable(definition), tracingEnabled: true, timeout: Duration.minutes(10), logs: { diff --git a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/index.ts b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/index.ts index 8cdf520..aa19ce5 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/index.ts +++ b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/index.ts @@ -5,6 +5,7 @@ import { CatchProps, Choice, Condition, + DefinitionBody, LogLevel, StateMachine, TaskInput, @@ -163,7 +164,7 @@ export class DataProductCreationStateMachine extends Construct { startDataProductInfraDeploymentLambda.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, - actions: ['ssm:GetParameter', 'iam:PassRole'], + actions: ['ssm:GetParameter', 'iam:PassRole', 'sts:AssumeRole'], resources: [ stack.formatArn({ service: 'iam', region: '', resource: 'role', resourceName: 'cdk-*' }), stack.formatArn({ service: 'ssm', resource: 'parameter', resourceName: 'cdk-bootstrap/*' }), @@ -257,7 +258,7 @@ export class DataProductCreationStateMachine extends Construct { ); this.stateMachine = new StateMachine(this, 'StateMachine', { - definition, + definitionBody: DefinitionBody.fromChainable(definition), tracingEnabled: true, timeout: Duration.minutes(30), logs: { diff --git a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/__tests__/start-data-product-infra-deployment.test.ts b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/__tests__/start-data-product-infra-deployment.test.ts index 3d8181f..60fa435 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/__tests__/start-data-product-infra-deployment.test.ts +++ b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/__tests__/start-data-product-infra-deployment.test.ts @@ -15,12 +15,15 @@ import { localDynamoRelationshipClient } from '../../../../../api/components/ent const mockAddTags = jest.fn(); +const cfnSymbol = Symbol.for('@aws-cdk/cx-api.CloudFormationStackArtifact'); // Mock cdk apps to ensure we don't synthesize any resources jest.mock('aws-cdk-lib', () => ({ ...(jest.requireActual('aws-cdk-lib') as any), App: class MockApp { public synth = jest.fn().mockReturnValue({ getStackByName: jest.fn().mockReturnValue({ + [cfnSymbol]: 'CloudFormation', + dependencies: [], tags: { Application: 'Ada', }, @@ -61,10 +64,14 @@ jest.mock('aws-cdk/lib/api/aws-auth', () => ({ })); const mockDeployStack = jest.fn(); +const mockBuildSingleAsset = jest.fn(); +const mockPublishSingleAsset = jest.fn(); -jest.mock('aws-cdk/lib/api/cloudformation-deployments', () => ({ - CloudFormationDeployments: class MockCloudFormationDeployments { +jest.mock('aws-cdk/lib/api/deployments', () => ({ + Deployments: class MockDeployments { public deployStack = (...args: any[]) => Promise.resolve(mockDeployStack(...args)); + public buildSingleAsset = (...args: any[]) => Promise.resolve(mockBuildSingleAsset(...args)); + public publishSingleAsset = (...args: any[]) => Promise.resolve(mockPublishSingleAsset(...args)); }, })); diff --git a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/package.json b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/package.json index c44d2a3..1e1e025 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/package.json +++ b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/package.json @@ -5,24 +5,23 @@ }, "private": true, "dependencies": { - "@aws-cdk/aws-apigatewayv2-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-apigatewayv2-authorizers-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-apigatewayv2-integrations-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-glue-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-kinesisfirehose-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-kinesisfirehose-destinations-alpha": "2.70.0-alpha.0", - "@aws-cdk/aws-lambda-python-alpha": "2.70.0-alpha.0", - "@aws-cdk/cloudformation-diff": "2.70.0", - "aws-cdk-lib": "2.70.0", + "@aws-cdk/aws-apigatewayv2-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-apigatewayv2-authorizers-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-apigatewayv2-integrations-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-glue-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-kinesisfirehose-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-kinesisfirehose-destinations-alpha": "2.88.0-alpha.0", + "@aws-cdk/aws-lambda-python-alpha": "2.88.0-alpha.0", + "@aws-cdk/cloudformation-diff": "2.88.0", + "aws-cdk-lib": "2.88.0", "constructs": "^10.1.181", - "aws-cdk": "2.70.0", - "cdk-assets": "2.70.0", + "aws-cdk": "2.88.0", + "cdk-assets": "2.88.0", "chalk": "^4", "promptly": "^3.2.0", - "proxy-agent": "^5.0.0" + "proxy-agent": "^6.3.0" }, "resolutions": { - "vm2": "^3.9.17", "xml2js": "^0.5.0" }, "workspaces": { diff --git a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/yarn.lock b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/yarn.lock index 0f7fb35..096ee43 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/yarn.lock +++ b/source/packages/@ada/infra/src/services/data-product/components/creation-state-machine/steps/start-data-product-infra-deployment/yarn.lock @@ -2,118 +2,108 @@ # yarn lockfile v1 -"@aws-cdk/asset-awscli-v1@^2.2.97": - version "2.2.139" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.139.tgz#4236502e21e96153734c3faad6e09693c89ec865" - integrity sha512-PGRtKbDfI8BmLEik4awqe/u02GKhpdyYvgI6XWGvSyn2qx+f4rVmyLqM2wiFI8wFWFt6YBAQaegKJS1cEZVe2A== +"@aws-cdk/asset-awscli-v1@^2.2.200": + version "2.2.200" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz#6ead533f73f705ad7350eb46955e2538e50cd013" + integrity sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg== -"@aws-cdk/asset-kubectl-v20@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz#d01c1efb867fb7f2cfd8c8b230b8eae16447e156" - integrity sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw== - -"@aws-cdk/asset-node-proxy-agent-v5@^2.0.77": - version "2.0.115" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.115.tgz#e95a73089b7ba637cf2e20f2d073076f01298fc0" - integrity sha512-MJ5/tMBOo6m7Bazs5TqEijIZNo4DH9NOAuv6mXjFT9k1yNAdOAr0imzG9L3uk2JpSmKrGRDSPRkrJFOszNtSaw== - -"@aws-cdk/aws-apigatewayv2-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-alpha/-/aws-apigatewayv2-alpha-2.70.0-alpha.0.tgz#995c85d8f9b0a69c3bf47803d53229fd1dd9e9cf" - integrity sha512-CfvGy+9jgXYesURS7Epx/Vt8Hq4OBmbuW+JQjbQy56/maRnikZ9FfTYO8RvPNNvJqFjwpHShD2ow+dAY1E9f5Q== - -"@aws-cdk/aws-apigatewayv2-authorizers-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-authorizers-alpha/-/aws-apigatewayv2-authorizers-alpha-2.70.0-alpha.0.tgz#4fbefb0507ea4af4b28c9f26bb172119f87f8705" - integrity sha512-ZBZ3cVUCAuIj2Kda+eHhGamnFMAcoQzdNh1xoyc5o2Pf17iHk5qB+RO1S1tHSHu+KPMk798UlYZfujEsh+ywMQ== - -"@aws-cdk/aws-apigatewayv2-integrations-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-integrations-alpha/-/aws-apigatewayv2-integrations-alpha-2.70.0-alpha.0.tgz#6d6485e301832feb4b76e805b77359056cb8120f" - integrity sha512-5ZPEtp1vF13mfY7aIwrpy0fZVDehgWx97DFEUlSGpgBP8/v1rBgt+dGr7mnyoNK5JerdMIzLlZw+Gh6nr+4PxA== - -"@aws-cdk/aws-glue-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.70.0-alpha.0.tgz#d2af041e23bece341d557dc92b72d20b814e3d7c" - integrity sha512-o67qcmSQ+GL+3xQPcSnhQxjQtGnB0+UBofYd4wdtNmLU7KeQtfWDuEDINypBLRERmVo/T6JmL1qpuJ6rnetsNQ== - -"@aws-cdk/aws-kinesisfirehose-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-alpha/-/aws-kinesisfirehose-alpha-2.70.0-alpha.0.tgz#dc70d054fb9eafd0ab9183c5b53efbea08905980" - integrity sha512-k8IxRxwjTLjjmRGz3xnhM65GixsXBbuMrov4aYkbLQcAOxgPM4Glr5A6RymMxL/eKaYg9QilP4Uv/pJQAE/q+Q== - -"@aws-cdk/aws-kinesisfirehose-destinations-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-destinations-alpha/-/aws-kinesisfirehose-destinations-alpha-2.70.0-alpha.0.tgz#a510122c558c782484605fb65d0ce50ace0ac90f" - integrity sha512-br6bsFPlVtnq7ovUGzE72qYR+O/TqXlojDRw71DSP+AdoyvunZuJ01TIw4kGfJGnghyqVH0ViwwSfGRl4is+bg== - -"@aws-cdk/aws-lambda-python-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.70.0-alpha.0.tgz#c6cb842604f19608207c9b36e0a9acafa004a691" - integrity sha512-0tPUNb540t2GAIAzyEGrk+OiQ90rjQQ0crU+ILFsE+pAaUrWmJYQSXdnKZ3tVVYqe4OgowY/49IdGbrIJnn4YQ== - -"@aws-cdk/cfnspec@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-2.70.0.tgz#16c775f97ebd8dc07e230868b8a31508214e5856" - integrity sha512-VfkS/1l9OpSRlih9Y2jDrETmdJdgLlWW1LhBMTqU4DvjoljtZ3KbrRyHVRVhH6WpukL73/4dEPBV1H4b1RPWwA== +"@aws-cdk/asset-kubectl-v20@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz#d8e20b5f5dc20128ea2000dc479ca3c7ddc27248" + integrity sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg== + +"@aws-cdk/asset-node-proxy-agent-v5@^2.0.165": + version "2.0.166" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz#467507db141cd829ff8aa9d6ea5519310a4276b8" + integrity sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg== + +"@aws-cdk/aws-apigatewayv2-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-alpha/-/aws-apigatewayv2-alpha-2.88.0-alpha.0.tgz#237fa9f4e4034cd4a18c07da73e0a4bf9a49a8e3" + integrity sha512-xCYzaXDyI+cs88MTFOMCE142KczRwEERTF0AtCqWgBwi6Se0aWd8ilwOh3jkL90sRDYquIJ01jlET2biFWmduw== + +"@aws-cdk/aws-apigatewayv2-authorizers-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-authorizers-alpha/-/aws-apigatewayv2-authorizers-alpha-2.88.0-alpha.0.tgz#d41aca6fcec0ffb1ae65fbf67ee2149f74755b35" + integrity sha512-0R3el9USkc6r24kn6GT9YtezEraf3Xm+U57nEK35JWU7ePHtxQ2qpN6wKCw+2A5oq5NKEj03a0m52mAbk1wg0Q== + +"@aws-cdk/aws-apigatewayv2-integrations-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-integrations-alpha/-/aws-apigatewayv2-integrations-alpha-2.88.0-alpha.0.tgz#32cd96f6db2f4dd8161254a2f6fd87f3059c8e8d" + integrity sha512-G7wvMnGEysfpNEJaVNUAY4PEPkD4QesMHfWyDIUNyED9lx1NiSv3hgtr87hzadJq+j2nRCCwMj9Rls8d+bBzQw== + +"@aws-cdk/aws-glue-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.88.0-alpha.0.tgz#2b6e575dff836df6807fd52e0585f8f87559d898" + integrity sha512-ozyZgSTDAkClIBEL5QM/c+WXNgCrNUk9q6v3x/VGaYaXqrT21o7DKATkoOk2wnDTR2dY4HZJL2O5yUBhvc3oFw== + +"@aws-cdk/aws-kinesisfirehose-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-alpha/-/aws-kinesisfirehose-alpha-2.88.0-alpha.0.tgz#1ae599c36ff16642cd24d9b3c40f48d1ba24e666" + integrity sha512-mYUJ6uX25k31WhPJ2kxKWWOkQhXQ7K6xfD0aWwLxXusyCJanJPlswVpt04CoDsnLiOXIf5k0Xp/cFWbi4tvCMg== + +"@aws-cdk/aws-kinesisfirehose-destinations-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-destinations-alpha/-/aws-kinesisfirehose-destinations-alpha-2.88.0-alpha.0.tgz#249681ada4c4a38d1caaf4cf7c4067d628180f8f" + integrity sha512-/9bTGm87lBMWGQHWqE4JkSM18RrRU0dATf8izP7UrbxRchgYtlncFIrTt3AvAGaABqKz1pcb5ZBnTncVO+uLvA== + +"@aws-cdk/aws-lambda-python-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.88.0-alpha.0.tgz#9edfef326f687934c342ba41eeaaca02a3f51534" + integrity sha512-CdSLWAeHLx9uRqAt9OhaWmlsc1wrDEMIDtRWCHVwPW1oVzEjiQ1yUH3sRxZtL0O9rRXpZbJrtUdOM+3SZld64w== + +"@aws-cdk/cfnspec@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-2.88.0-alpha.0.tgz#13af371fa6f0edd17cf160387474c5693cb2f071" + integrity sha512-pArQaqBC8mtoRwTToQGtHefeIkA5Cv8EwtbgZW/XgASjb5ZvE/RiRl3TmszXgLwthdvZx2sMMoIYwJTE50JQsA== dependencies: fs-extra "^9.1.0" md5 "^2.3.0" -"@aws-cdk/cloud-assembly-schema@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.70.0.tgz#4d5c7fa0b70306ede6c4cbab59944825a1695c7a" - integrity sha512-tfycT27rO5yGWfIF2jhEJ98D8M/JKSvHaSbQqz0lJnxfzjAzdN9pie71g1frDcb10qp8dWBlYAl9PfCi1JEesA== +"@aws-cdk/cloud-assembly-schema@2.88.0": + version "2.88.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.88.0.tgz#29c6452aa240d56063c7453e750987e20d089cab" + integrity sha512-dDcbH9g1CQmXdKe4k0eADZfJGIvNw9ZLBH6Mm4M6H1+kaHaxOir016OrZ/xt+eTCPF+uwfSvfFsu4HzUysopyg== dependencies: jsonschema "^1.4.1" - semver "^7.3.8" + semver "^7.5.4" -"@aws-cdk/cloudformation-diff@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.70.0.tgz#6f42e17de4cb146821d6b7b29988402de6542056" - integrity sha512-FarQ4Axs0dKMMLTIxKUhBCAcUr7jIoWQFAJ9y+XZcS28yAsQufJsFov2NLqJDFXiNP/rlwdkb7tbi3hsPaN8Cg== +"@aws-cdk/cloudformation-diff@2.88.0": + version "2.88.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.88.0.tgz#b93e22fffdee8811ca8c60311d61efd400a5d067" + integrity sha512-3F6xfAnV/c91/6nm3ZCk0S4rfq3OJ/fSOihSr7VTqABN2vs16e2LYtPialUQvmIXM6I46fByx9DMaBTkQFBxJA== dependencies: - "@aws-cdk/cfnspec" "2.70.0" + "@aws-cdk/cfnspec" "2.88.0-alpha.0" chalk "^4" diff "^5.1.0" fast-deep-equal "^3.1.3" string-width "^4.2.3" table "^6.8.1" -"@aws-cdk/cx-api@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-2.70.0.tgz#3913ff06a525c9637ba59d061ef0236aaeaa06bd" - integrity sha512-ZviNNmB85kdA3bz9bK9H6rb2gFebpl+aHje0PWFjHNrixSx8ocVyfHYFM7DSBx3PRWgBl2VQT6r3K/AAufB5dg== +"@aws-cdk/cx-api@2.88.0": + version "2.88.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-2.88.0.tgz#f84423f841d47c891a678c97ea5ad9b993964cc1" + integrity sha512-Wf6ax/1eGjE42Dc7NvlMzu6QU5wraUnKIay9QvznZaJYkkcWZ7LlRwmoh95p431RTOoYME3dWzHOEsV/LBv5xQ== dependencies: - "@aws-cdk/cloud-assembly-schema" "2.70.0" - semver "^7.3.8" + "@aws-cdk/cloud-assembly-schema" "2.88.0" + semver "^7.5.4" "@balena/dockerignore@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.7.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== +agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== dependencies: - debug "4" + debug "^4.3.4" ajv@^8.0.1: version "8.11.0" @@ -166,7 +156,7 @@ archiver@^5.3.1: tar-stream "^2.2.0" zip-stream "^4.1.0" -ast-types@^0.13.2: +ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== @@ -193,35 +183,36 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-cdk-lib@2.70.0: - version "2.70.0" - resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.70.0.tgz#207422bf8766caf56c76956f9f2263cdbe97ef67" - integrity sha512-q/Go/3VERycIMJp3LfVtjRCLnIJHXJ0gfev5qM5yPyuvoDgZaKuaGA54T0IebgXDyZzS6We3j/DhuP/nPR8sPw== +aws-cdk-lib@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.88.0.tgz#72d165cb7dc168c5fa3b22caaacd8d33364866fc" + integrity sha512-bmhokh30HVeqlotWaoEmK7mKB9SJbJwpbsiVgmYe3JcMu8DposHQqaIPI7LnC+dg015tZaxUsExxOYBEw+vntQ== dependencies: - "@aws-cdk/asset-awscli-v1" "^2.2.97" - "@aws-cdk/asset-kubectl-v20" "^2.1.1" - "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.77" + "@aws-cdk/asset-awscli-v1" "^2.2.200" + "@aws-cdk/asset-kubectl-v20" "^2.1.2" + "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.165" "@balena/dockerignore" "^1.0.2" case "1.6.3" - fs-extra "^9.1.0" + fs-extra "^11.1.1" ignore "^5.2.4" jsonschema "^1.4.1" minimatch "^3.1.2" punycode "^2.3.0" - semver "^7.3.8" + semver "^7.5.4" + table "^6.8.1" yaml "1.10.2" -aws-cdk@2.70.0: - version "2.70.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.70.0.tgz#95377f7ddc8f5a0a625f5feb15e610b32b70e3cf" - integrity sha512-B12e+h8FNNS2BGgBKzKrU541shC/9CWeC1Z/CwX2NKxPgbeP2eGtgR1hCfT/VaotcfJ8+dSd4I32nNNc+wz+QA== +aws-cdk@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.88.0.tgz#2e1adfa0d13145c44ff8a81705d962e861bf29f1" + integrity sha512-7Tj0uusA2nsEOsqkd4kB5vmzciz7l/eGBN5a+Ce4/CCcoe4ZCvT85L+T6tK0aohUTLZTAlTPBceH34RN5iMYpA== optionalDependencies: fsevents "2.3.2" -aws-sdk@^2.1329.0: - version "2.1358.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1358.0.tgz#86996622bc6c6ca6aed460273a168d6aeea27086" - integrity sha512-ZolqFlnm0mDNgub7FGrVi7r5A1rw+58zZziKhlis3IxOtIpHdx4BQU5pH4htAMuD0Ct557p/dC/wmnZH/1Rc9Q== +aws-sdk@^2.1417.0: + version "2.1420.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1420.0.tgz#ae49a7b8e54fbcd72bfdd4a94473ccf25ca8c984" + integrity sha512-BvGzkKGgOXNj9WAeazvOLu48sCbU52mKLGIY5AjBKX4EuY8APcKKvl1R54kdUoJDnMwv0HwQpGvrVvLTDdOv/A== dependencies: buffer "4.9.2" events "1.1.1" @@ -244,6 +235,11 @@ base64-js@^1.0.2, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -290,11 +286,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -308,15 +299,15 @@ case@1.6.3: resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== -cdk-assets@2.70.0: - version "2.70.0" - resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-2.70.0.tgz#c5047358326f9f63994bce7377e26216fd019650" - integrity sha512-Qk1tXJ7GwfgNbnK/v8wF075a/2K+ZSd3GChq8N61+0dcClf62Yg0BCJmVXfTSEqbD1nGAKcztMvqFgCNIKVU/g== +cdk-assets@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-2.88.0.tgz#300290fb98369f459467e40eed45ce3875b621b7" + integrity sha512-qt5rfsG2Ek7V9GH2z7epF4y0MOLt+Z/2n4ApbgQweLaq5bwptiIfkos5mAA0z+gOcd080yqvsZGPQKytTdlx+A== dependencies: - "@aws-cdk/cloud-assembly-schema" "2.70.0" - "@aws-cdk/cx-api" "2.70.0" + "@aws-cdk/cloud-assembly-schema" "2.88.0" + "@aws-cdk/cx-api" "2.88.0" archiver "^5.3.1" - aws-sdk "^2.1329.0" + aws-sdk "^2.1417.0" glob "^7.2.3" mime "^2.6.0" yargs "^16.2.0" @@ -398,37 +389,26 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-uri-to-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" + integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== -debug@4: +debug@4, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -degenerator@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.2.tgz#6a61fcc42a702d6e50ff6023fe17bff435f68235" - integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ== +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: - ast-types "^0.13.2" - escodegen "^1.8.1" - esprima "^4.0.0" - vm2 "^3.9.8" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" diff@^5.1.0: version "5.1.0" @@ -452,27 +432,26 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -489,16 +468,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -511,6 +480,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -540,14 +518,6 @@ fsevents@2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ== - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -567,17 +537,15 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" -get-uri@3: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== +get-uri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" + integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" + basic-ftp "^5.0.2" + data-uri-to-buffer "^5.0.1" + debug "^4.3.4" fs-extra "^8.1.0" - ftp "^0.3.10" glob@^7.1.4, glob@^7.2.3: version "7.2.3" @@ -627,41 +595,22 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" + agent-base "^7.1.0" + debug "^4.3.4" -https-proxy-agent@5, https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== +https-proxy-agent@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" + integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== dependencies: - agent-base "6" + agent-base "^7.0.2" debug "4" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ieee754@1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -685,16 +634,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ip@^1.1.5: +ip@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -736,11 +690,6 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3: gopd "^1.0.1" has-tostringtag "^1.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -784,14 +733,6 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -822,13 +763,6 @@ lodash.union@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -836,6 +770,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + md5@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -891,40 +830,27 @@ once@^1.3.0, once@^1.4.0: dependencies: wrappy "1" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -pac-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e" - integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - get-uri "3" - http-proxy-agent "^4.0.1" - https-proxy-agent "5" - pac-resolver "^5.0.0" - raw-body "^2.2.0" - socks-proxy-agent "5" - -pac-resolver@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7" - integrity sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q== +pac-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz#db42120c64292685dafaf2bd921e223c56bfb13b" + integrity sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.1" + +pac-resolver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" + integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== dependencies: - degenerator "^3.0.2" - ip "^1.1.5" + degenerator "^5.0.0" + ip "^1.1.8" netmask "^2.0.2" path-is-absolute@^1.0.0: @@ -932,11 +858,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -949,21 +870,21 @@ promptly@^3.2.0: dependencies: read "^1.0.4" -proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b" - integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g== - dependencies: - agent-base "^6.0.0" - debug "4" - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^5.0.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^5.0.0" - -proxy-from-env@^1.0.0: +proxy-agent@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" + integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.1" + +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -988,16 +909,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== -raw-body@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - read@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -1005,16 +916,6 @@ read@^1.0.4: dependencies: mute-stream "~0.0.4" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^2.0.0, readable-stream@^2.0.5: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -1064,11 +965,6 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - sax@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" @@ -1079,18 +975,13 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -1105,21 +996,21 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@5, socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== +socks-proxy-agent@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" + integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" + agent-base "^7.0.1" + debug "^4.3.4" + socks "^2.7.1" -socks@^2.3.3: - version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" - integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== +socks@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: - ip "^1.1.5" + ip "^2.0.0" smart-buffer "^4.2.0" source-map@~0.6.1: @@ -1127,11 +1018,6 @@ source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1148,11 +1034,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -1196,22 +1077,10 @@ tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - tslib@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== universalify@^0.1.0: version "0.1.2" @@ -1223,11 +1092,6 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -1264,14 +1128,6 @@ uuid@8.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== -vm2@^3.9.17, vm2@^3.9.8: - version "3.9.17" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.17.tgz#251b165ff8a0e034942b5181057305e39570aeab" - integrity sha512-AqwtCnZ/ERcX+AVj9vUsphY56YANXxRuqMb7GsDtAr0m0PcQX3u0Aj3KWiXM0YAHy7i6JEeHrwOnwXbGYgRpAw== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - which-typed-array@^1.1.2: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" @@ -1284,11 +1140,6 @@ which-typed-array@^1.1.2: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -1316,21 +1167,11 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" diff --git a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/Dockerfile b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/Dockerfile index 282c029..a1af017 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/Dockerfile +++ b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/Dockerfile @@ -120,9 +120,9 @@ ENV KEY_ID test-key-id ENV AWS_DEFAULT_REGION ap-test-1 ENV PULL_DATA_SAMPLE_ROLE_ARN some-test-role-arn ENV AWS_REGION=ap-test-1 \ - AWS_ACCESS_KEY_ID=test-access-key \ - AWS_SECRET_ACCESS_KEY=test-secret-access-key \ - AWS_SESSION_TOKEN=test-session-token + AWS_ACCESS_KEY_ID=testAccessKey \ + AWS_SECRET_ACCESS_KEY=testSecretAccessKey \ + AWS_SESSION_TOKEN=testSessionToken RUN pytest -vv --capture=tee-sys RUN echo "success" > /glue/handlers/test_result.txt diff --git a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/handlers/sampling/common.py b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/handlers/sampling/common.py index ea77155..b848652 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/handlers/sampling/common.py +++ b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/handlers/sampling/common.py @@ -30,6 +30,9 @@ class SecretsManagerException(Exception): pass +class MissCredentialException(Exception): + pass + class SecretsManager: """Retrieve secrets from AWS SecretsManager""" @@ -95,7 +98,7 @@ def get_credentials_from_source(source_details, credential_field_name, credentia credential_value = secrets_manager.get_secret(source_details[credential_secret_field_name]) else: - raise Exception("Access credentials are not specified in the source details") + raise MissCredentialException("Access credentials are not specified in the source details") return credential_value class SamplingUtils: diff --git a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/poetry.lock b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/poetry.lock index 5707e14..6b4325a 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/poetry.lock +++ b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/poetry.lock @@ -104,31 +104,33 @@ simplejson = "3.17.2" [[package]] name = "awswrangler" -version = "2.15.0" +version = "2.20.1" description = "Pandas on AWS." category = "main" optional = false -python-versions = ">=3.7.1,<3.11" +python-versions = ">=3.7.1,<4.0" [package.dependencies] -backoff = ">=1.11.1,<2.0.0" -boto3 = ">=1.20.17,<2.0.0" -botocore = ">=1.23.17,<2.0.0" +backoff = ">=1.11.1,<3.0.0" +boto3 = ">=1.24.11,<2.0.0" +botocore = ">=1.27.11,<2.0.0" gremlinpython = ">=3.5.2,<4.0.0" jsonpath-ng = ">=1.5.3,<2.0.0" -numpy = ">=1.21.0,<2.0.0" +numpy = {version = ">=1.21.0,<=1.23.4", markers = "python_full_version >= \"3.7.1\" and python_full_version < \"3.11.0\""} openpyxl = ">=3.0.0,<3.1.0" -opensearch-py = ">=1.0.0,<2.0.0" -pandas = ">=1.2.0,<2.0.0" +opensearch-py = ">=1,<3" +pandas = ">=1.2.0,<1.5.0 || >1.5.0,<=1.5.1" pg8000 = ">=1.20.0,<2.0.0" -progressbar2 = ">=3.53.3,<4.0.0" -pyarrow = ">=2.0.0,<7.1.0" +progressbar2 = ">=4.0.0,<5.0.0" +pyarrow = ">=2.0.0,<10.1.0" pymysql = ">=1.0.0,<2.0.0" redshift-connector = ">=2.0.889,<2.1.0" requests-aws4auth = ">=1.1.1,<2.0.0" -SPARQLWrapper = ">=1.8.5,<2.0.0" [package.extras] +deltalake = ["deltalake (>=0.6.4,<0.9.0)"] +oracle = ["oracledb (>=1.0.0,<1.1.0)"] +sparql = ["SPARQLWrapper (>=1.8.5,<3.0.0)"] sqlserver = ["pyodbc (>=4.0.32,<4.1.0)"] [[package]] @@ -156,27 +158,27 @@ lxml = ["lxml"] [[package]] name = "boto3" -version = "1.21.35" +version = "1.26.107" description = "The AWS SDK for Python" category = "main" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] -botocore = ">=1.24.35,<1.25.0" +botocore = ">=1.29.107,<1.30.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.5.0,<0.6.0" +s3transfer = ">=0.6.0,<0.7.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.24.35" +version = "1.29.107" description = "Low-level, data-driven core of boto 3." category = "main" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] jmespath = ">=0.7.1,<2.0.0" @@ -184,7 +186,7 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = ">=1.25.4,<1.27" [package.extras] -crt = ["awscrt (==0.13.8)"] +crt = ["awscrt (==0.16.9)"] [[package]] name = "cachetools" @@ -206,7 +208,7 @@ python-versions = "*" name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" +category = "main" optional = false python-versions = "*" @@ -234,7 +236,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 [[package]] name = "coverage" -version = "7.2.1" +version = "7.2.3" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -250,7 +252,7 @@ toml = ["tomli"] name = "cryptography" version = "39.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -811,6 +813,17 @@ develop = ["black", "botocore", "coverage", "jinja2", "mock", "myst-parser", "py docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] requests = ["requests (>=2.4.0,<3.0.0)"] +[[package]] +name = "oracledb" +version = "1.3.0" +description = "Python interface to Oracle Database" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=3.2.1" + [[package]] name = "packaging" version = "23.0" @@ -888,19 +901,18 @@ python-versions = "*" [[package]] name = "progressbar2" -version = "3.55.0" +version = "4.2.0" description = "A Python Progressbar library to provide visual (yet text based) progress to long running operations." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7.0" [package.dependencies] -python-utils = ">=2.3.0" -six = "*" +python-utils = ">=3.0.0" [package.extras] -docs = ["sphinx (>=1.7.4)"] -tests = ["flake8 (>=3.7.7)", "freezegun (>=0.3.11)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "sphinx (>=1.8.5)"] +docs = ["sphinx (>=1.8.5)"] +tests = ["flake8 (>=3.7.7)", "freezegun (>=0.3.11)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "pytest-mypy", "sphinx (>=1.8.5)"] [[package]] name = "proto-plus" @@ -958,7 +970,7 @@ pyasn1 = ">=0.4.6,<0.5.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -1239,11 +1251,11 @@ pyasn1 = ">=0.1.3" [[package]] name = "s3transfer" -version = "0.5.2" +version = "0.6.0" description = "An Amazon S3 Transfer Manager" category = "main" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] botocore = ">=1.12.36,<2.0a.0" @@ -1299,7 +1311,7 @@ name = "sparqlwrapper" version = "1.8.5" description = "SPARQL Endpoint interface to Python" category = "main" -optional = false +optional = true python-versions = "*" [package.dependencies] @@ -1425,7 +1437,7 @@ ada-docker-image = ["redshift-connector", "SPARQLWrapper", "pytz"] [metadata] lock-version = "1.1" python-versions = ">=3.7.1,<3.11" -content-hash = "283796260a48e4e28b6aac68790e2d0fbafdadc6ee1bf6c61087eed285d580b3" +content-hash = "d9f5b0409f6d081cc6f2471d1d7f1746ba14862f7b93f15b5bfd770cc9c9c0ac" [metadata.files] aenum = [ @@ -1549,8 +1561,8 @@ awslambdaric = [ {file = "awslambdaric-2.0.1.tar.gz", hash = "sha256:4605901db88b4855190bbafba3aedf3a27f0ebe52db0ea7befef33b3da9d1fff"}, ] awswrangler = [ - {file = "awswrangler-2.15.0-py3-none-any.whl", hash = "sha256:0ec6da398631d67e92a269be545735e105866333b2561366cac207d6b1f3e667"}, - {file = "awswrangler-2.15.0.tar.gz", hash = "sha256:5266ce435f51bf346bd5577d77550349c9ab5eac0b00c23bbb854e191a59f817"}, + {file = "awswrangler-2.20.1-py3-none-any.whl", hash = "sha256:0c9a868efacf87bcd7ff9efcb6035d2c1aed30e71d183827c50128b2d7866ac0"}, + {file = "awswrangler-2.20.1.tar.gz", hash = "sha256:110ae666206f3e1611c81d3a5886ce2cff1f2a874f35612ee5047f2aa19a607d"}, ] backoff = [ {file = "backoff-1.11.1-py2.py3-none-any.whl", hash = "sha256:61928f8fa48d52e4faa81875eecf308eccfb1016b018bb6bd21e05b5d90a96c5"}, @@ -1561,12 +1573,12 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, ] boto3 = [ - {file = "boto3-1.21.35-py3-none-any.whl", hash = "sha256:4fb810755bca4696effbeb0c6f792295795fae52e895638038dff53965f3f423"}, - {file = "boto3-1.21.35.tar.gz", hash = "sha256:ab6e001ba9de1db986634424abff6c79d938c15d0d2fa3ef95eb0939c120b4f6"}, + {file = "boto3-1.26.107-py3-none-any.whl", hash = "sha256:9de90a2c0b853f84436b032b28947fc8a765dc462573a8d543b13f16c6579b40"}, + {file = "boto3-1.26.107.tar.gz", hash = "sha256:816a198a6cc4f283af6b21439d85be6dbe4b73c2232dd906c6bafb4fece28d19"}, ] botocore = [ - {file = "botocore-1.24.35-py3-none-any.whl", hash = "sha256:734aa598af5d6bc0351e6ecce4a91b0b6ccf245febfd8d4de8425211aada5f36"}, - {file = "botocore-1.24.35.tar.gz", hash = "sha256:36b5422d8f0c312983582b8b4b056c98e1fd6121cb0b2ddb1f67e882e1ae6867"}, + {file = "botocore-1.29.107-py3-none-any.whl", hash = "sha256:ee1e43e6cd0864cc6811ba3f05123647612ee3f07a286a4c94f5885aa86d6922"}, + {file = "botocore-1.29.107.tar.gz", hash = "sha256:f63942b4b7248c0b3d6ecbc2852cf0787c23ace2a91a012f7ee0b3ae3eb08f4f"}, ] cachetools = [ {file = "cachetools-5.0.0-py3-none-any.whl", hash = "sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4"}, @@ -1651,57 +1663,57 @@ colorama = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] coverage = [ - {file = "coverage-7.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8"}, - {file = "coverage-7.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03"}, - {file = "coverage-7.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339"}, - {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a"}, - {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820"}, - {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4"}, - {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6"}, - {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833"}, - {file = "coverage-7.2.1-cp310-cp310-win32.whl", hash = "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4"}, - {file = "coverage-7.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6"}, - {file = "coverage-7.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6"}, - {file = "coverage-7.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9"}, - {file = "coverage-7.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b"}, - {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319"}, - {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508"}, - {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed"}, - {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e"}, - {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b"}, - {file = "coverage-7.2.1-cp311-cp311-win32.whl", hash = "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80"}, - {file = "coverage-7.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273"}, - {file = "coverage-7.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97"}, - {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84"}, - {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd"}, - {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc"}, - {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e"}, - {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54"}, - {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5"}, - {file = "coverage-7.2.1-cp37-cp37m-win32.whl", hash = "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae"}, - {file = "coverage-7.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff"}, - {file = "coverage-7.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657"}, - {file = "coverage-7.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1"}, - {file = "coverage-7.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3"}, - {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99"}, - {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384"}, - {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa"}, - {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec"}, - {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2"}, - {file = "coverage-7.2.1-cp38-cp38-win32.whl", hash = "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0"}, - {file = "coverage-7.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb"}, - {file = "coverage-7.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef"}, - {file = "coverage-7.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454"}, - {file = "coverage-7.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993"}, - {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6"}, - {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63"}, - {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58"}, - {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e"}, - {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431"}, - {file = "coverage-7.2.1-cp39-cp39-win32.whl", hash = "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8"}, - {file = "coverage-7.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a"}, - {file = "coverage-7.2.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616"}, - {file = "coverage-7.2.1.tar.gz", hash = "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, + {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, + {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, + {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, + {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, + {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, + {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, + {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, + {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, + {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, + {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, + {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, + {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, + {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, ] cryptography = [ {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, @@ -2260,6 +2272,36 @@ opensearch-py = [ {file = "opensearch-py-1.1.0.tar.gz", hash = "sha256:7d0c41cea61fedc34542be7fb9169931360134cf823c596f719106c3bd8466fe"}, {file = "opensearch_py-1.1.0-py2.py3-none-any.whl", hash = "sha256:cb573546fb373dac8091be9b8eac2ba8da277713eea4b50b4a49ccd30dec25f1"}, ] +oracledb = [ + {file = "oracledb-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:090909b6f96ba0d9705a65413b3139903271860abe2cb2d5e4120cb700d8946d"}, + {file = "oracledb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a225ed644f04cbd4d4edefb717c282d4b70a06f60a6d98eb8d1e747cdce6c62"}, + {file = "oracledb-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ca297268ebbfb4783f7c37d20329b3472cdcb6b03e18036eccf2cc6cf489b4"}, + {file = "oracledb-1.3.0-cp310-cp310-win32.whl", hash = "sha256:906355f22e9acc331a54ea54b50b524d14db0b8fe33891248a582b801c163998"}, + {file = "oracledb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:8d0be62327337f78fd28d4767018cb568038540c12cfe8e135a7ed86732cf1bf"}, + {file = "oracledb-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:34f0c9f4df230a16e6a79bae601bc21d8ef915a95ebbaacd07dc9e586a419ed0"}, + {file = "oracledb-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd58d90ca0bcbc656049fc5160215e301e0192e12d4cd771dddca2638767bf6b"}, + {file = "oracledb-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd24339fbdab303cbf7b13826686117e7c17a2778599b22b4b2db2d61c9dc8f0"}, + {file = "oracledb-1.3.0-cp311-cp311-win32.whl", hash = "sha256:904a88478b86def89b54980fe80fd88a69b7831fcfaccf98849ec81e88a7ab26"}, + {file = "oracledb-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b22c2d40778c798c84afbef8057ed352b90aeaff522ce675163d6943fa56790"}, + {file = "oracledb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f408b252087c50f2adf6296b42f60ede3a0b4f4ff29963cccc1a2e929e4f0b33"}, + {file = "oracledb-1.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32db286d9ef2aad276bea80c01734b637ce805f7fc53c2a3bace7322324e4e73"}, + {file = "oracledb-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:53e4e826ebaf3dff0294c23d58af91ca85b0d3de246c7b31e413b63a6ebb0a81"}, + {file = "oracledb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e855536c60f46507872ab38dd661f62318149f8ad5477abddb9a54294bdf6604"}, + {file = "oracledb-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfb44e2ca7d17b983a5a9cb43b4f2acc1bc03c9c2010a83e25777bf6b1a6a1c"}, + {file = "oracledb-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:a5fa8ce065a6cc0d5b2384d848e7c4bab9abd6fbbf5a734da4749cc050dcc19c"}, + {file = "oracledb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:785c191c39ee765a910e0d256f72889f527a45aaf3577917c08f0602155e785b"}, + {file = "oracledb-1.3.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:9b50bdd797a65877d6570c57558138f04b329465cef52798091241989216e8b0"}, + {file = "oracledb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786264c0b62bef784cca22b313e875cd08423c5d042bb766092eed6d4355e77b"}, + {file = "oracledb-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1843dfe676fc8637aa9da59e2390730a3e6464f77b86f8b438463c094098b7d3"}, + {file = "oracledb-1.3.0-cp38-cp38-win32.whl", hash = "sha256:b858670555031254be28e4c51382dc0bd22df6f0fa3e8b10c19b6e56f16de986"}, + {file = "oracledb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:09ad628a599612b621548ea034fcc9872766248f50380a1b1bb10509c0c140e9"}, + {file = "oracledb-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f0ce0cde66faaa9d9113aaa48a544cdae56e49a16f7492e49efefb4334103e8c"}, + {file = "oracledb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3f7f7620308dd1adc7eeaf83372492fb80fc39b7cab335ccd332135c10d63ac"}, + {file = "oracledb-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d13baf1e5cc8aa2a45fbd94de09e05228a2ca63a2c0704665cedaeea1be3bf60"}, + {file = "oracledb-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fa3dbf4b8ca9809c774ea6755b7e618617cb84320e88909ba8f2f503f81f217b"}, + {file = "oracledb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:3d0645bc03c91c9074c0553dc21fb3966048e7a9967d4b0b53a2861fc4b9d31f"}, + {file = "oracledb-1.3.0.tar.gz", hash = "sha256:f105a4705916a28d33e2918fa3634097fe83552bf5ea81afc3a7a68528c9e2f3"}, +] packaging = [ {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, @@ -2308,8 +2350,8 @@ ply = [ {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, ] progressbar2 = [ - {file = "progressbar2-3.55.0-py2.py3-none-any.whl", hash = "sha256:e98fee031da31ab9138fd8dd838ac80eafba82764eb75a43d25e3ca622f47d14"}, - {file = "progressbar2-3.55.0.tar.gz", hash = "sha256:86835d1f1a9317ab41aeb1da5e4184975e2306586839d66daf63067c102f8f04"}, + {file = "progressbar2-4.2.0-py2.py3-none-any.whl", hash = "sha256:1a8e201211f99a85df55f720b3b6da7fb5c8cdef56792c4547205be2de5ea606"}, + {file = "progressbar2-4.2.0.tar.gz", hash = "sha256:1393922fcb64598944ad457569fbeb4b3ac189ef50b5adb9cef3284e87e394ce"}, ] proto-plus = [ {file = "proto-plus-1.20.3.tar.gz", hash = "sha256:f28b225bc9e6c14e206fb7f8e996a46fb2ccd902648e512d496abb6a716a4ae5"}, @@ -2667,8 +2709,8 @@ rsa = [ {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, ] s3transfer = [ - {file = "s3transfer-0.5.2-py3-none-any.whl", hash = "sha256:7a6f4c4d1fdb9a2b640244008e142cbc2cd3ae34b386584ef044dd0f27101971"}, - {file = "s3transfer-0.5.2.tar.gz", hash = "sha256:95c58c194ce657a5f4fb0b9e60a84968c808888aed628cd98ab8771fe1db98ed"}, + {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, + {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, ] scramp = [ {file = "scramp-1.4.1-py3-none-any.whl", hash = "sha256:93c9cc2ffe54a451e02981c07a5a23cbd830701102789939cfb4ff91efd6ca8c"}, diff --git a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/pyproject.toml b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/pyproject.toml index 98c7ecd..b50ca4c 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/pyproject.toml +++ b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/docker-image/pyproject.toml @@ -12,11 +12,11 @@ aenum = "2.2.6" aiohttp = "3.8.1" asn1crypto = "1.5.1" awslambdaric = "2.0.1" -awswrangler = "2.15.0" +awswrangler = "2.20.1" backoff = "1.11.1" beautifulsoup4 = "4.10.0" -boto3 = "1.21.35" -botocore = "1.24.35" +boto3 = "1.26.107" +botocore = "1.29.107" cachetools = "5.0.0" certifi = "2021.10.8" charset-normalizer = "2.0.12" @@ -54,7 +54,7 @@ pandas = "1.3.5" pg8000 = "1.24.1" platformdirs = "2.5.1" ply = "3.11" -progressbar2 = "3.55.0" +progressbar2 = "4.2.0" proto-plus = "1.20.3" protobuf = "3.20.2" pyarrow = "7.0.0" @@ -69,7 +69,7 @@ regex = "2022.3.15" requests = "2.27.1" requests-aws4auth = "1.1.2" rsa = "4.8" -s3transfer = "0.5.2" +s3transfer = "0.6.0" scramp = "1.4.1" simplejson = "^3.17.2" # was "3.17.6" but "depends on awslambdaric (2.0.1) which depends on simplejson (3.17.2)" six = "1.16.0" @@ -90,6 +90,7 @@ redshift-connector = {version="2.0.905", optional=true} SPARQLWrapper = {version="1.8.5", optional=true} pytz = {version=">=2020.1,<2021.9", optional=true} # was "2022.1" but "redshift-connector (2.0.905) which depends on pytz (>=2020.1,<2021.9)" pymongo = "^4.3.3" +oracledb = "^1.3.0" [tool.pytest.ini_options] pythonpath = [ diff --git a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/index.ts b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/index.ts index 40236ca..0667fcd 100644 --- a/source/packages/@ada/infra/src/services/data-product/components/schema-preview/index.ts +++ b/source/packages/@ada/infra/src/services/data-product/components/schema-preview/index.ts @@ -2,26 +2,27 @@ SPDX-License-Identifier: Apache-2.0 */ import { Bucket } from '../../../../common/constructs/s3/bucket'; import { Construct } from 'constructs'; -import { DataProductSecretsPolicyStatement } from '../../../../common/constructs/iam/policies'; -import { DockerImageFunction } from 'aws-cdk-lib/aws-lambda'; -import { Duration, RemovalPolicy } from 'aws-cdk-lib'; -import { Effect, IRole, ManagedPolicy, PolicyStatement, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { + DataProductSecretsPolicyStatement, ExternalSourceAssumeRolePolicyStatement, ExternalSourceDataCloudTrailAccessPolicyStatement, ExternalSourceDataCloudWatchAccessPolicyStatement, ExternalSourceDataKmsAccessPolicyStatement, ExternalSourceDataS3AccessPolicyStatement, ExternalSourceDynamoDBAccessPolicyStatement, + ExternalSourceRedshiftAccessPolicyStatement, SolutionContext, TypescriptFunction, getDockerImagePath, tryGetSolutionContext, } from '@ada/infra-common'; +import { DefinitionBody, LogLevel, Pass, StateMachine, TaskInput } from 'aws-cdk-lib/aws-stepfunctions'; +import { DockerImageFunction } from 'aws-cdk-lib/aws-lambda'; +import { Duration, RemovalPolicy } from 'aws-cdk-lib'; +import { Effect, IRole, ManagedPolicy, PolicyStatement, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { Key } from 'aws-cdk-lib/aws-kms'; import { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks'; import { LogGroup } from '../../../../common/constructs/cloudwatch/log-group'; -import { LogLevel, Pass, StateMachine, TaskInput } from 'aws-cdk-lib/aws-stepfunctions'; import { SubnetType } from 'aws-cdk-lib/aws-ec2'; import { TarballImageAsset } from '../../../../common/constructs/ecr-assets/tarball-image-asset'; import { addCfnNagSuppressionsToRolePolicy, getUniqueStateMachineLogGroupName } from '@ada/cdk-core'; @@ -103,6 +104,15 @@ export default class SchemaPreview extends Construct { resources: ['*'], }), ); + + pullDataSampleConnectorRole.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ['redshift:GetClusterCredentials', 'redshift-serverless:GetCredentials'], + resources: ['*'], + }), + ); + // Grant schemapreview lambda permissions to create, use and delete glue connection // so that glue connection can be used in the preview lambda for jdbc connector pullDataSampleConnectorRole.addToPolicy( @@ -125,8 +135,8 @@ export default class SchemaPreview extends Construct { pullDataSampleConnectorRole.addToPolicy(ExternalSourceDataCloudTrailAccessPolicyStatement); // Grant access to Query DynamoDB Tables pullDataSampleConnectorRole.addToPolicy(ExternalSourceDynamoDBAccessPolicyStatement); - // Grant access to Assume external roles - pullDataSampleConnectorRole.addToPolicy(ExternalSourceAssumeRolePolicyStatement); + // Grant access to get Redshift/Redshift Serverless credentials + pullDataSampleConnectorRole.addToPolicy(ExternalSourceRedshiftAccessPolicyStatement); addCfnNagSuppressionsToRolePolicy(pullDataSampleConnectorRole, [ { @@ -262,7 +272,7 @@ export default class SchemaPreview extends Construct { this.stateMachine = new StateMachine(this, 'StateMachine', { tracingEnabled: true, - definition, + definitionBody: DefinitionBody.fromChainable(definition), logs: { destination: new LogGroup(this, 'StateMachineLogs', { logGroupName: getUniqueStateMachineLogGroupName(this, `${id}StateMachineLogs`), diff --git a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/cdk.ts b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/cdk.ts index 0d21670..160d550 100644 --- a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/cdk.ts +++ b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/cdk.ts @@ -1,12 +1,17 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ +import * as cxapi from '@aws-cdk/cx-api'; import { ApiClient } from '@ada/api-client-lambda'; import { App } from 'aws-cdk-lib'; +import { AssetBuildNode, AssetPublishNode, StackNode } from 'aws-cdk/lib/util/work-graph-types'; import { AwsCloudFormationInstance, AwsSSMInstance, CloudFormation } from '@ada/aws-sdk'; import { CallingUser, DATA_PRODUCT_CLOUD_FORMATION_STACK_NAME_PREFIX } from '@ada/common'; -import { CloudFormationDeployments } from 'aws-cdk/lib/api/cloudformation-deployments'; +import { Concurrency } from 'aws-cdk/lib/util/work-graph'; import { DataProduct } from '@ada/api'; +import { Deployments } from 'aws-cdk/lib/api/deployments'; import { SdkProvider } from 'aws-cdk/lib/api/aws-auth'; +import { WorkGraphBuilder } from 'aws-cdk/lib/util/work-graph-builder'; + import { StaticInfra } from '@ada/infra-common/services'; import { VError } from 'verror'; import { getFriendlyHash } from '@ada/cdk-core'; @@ -74,60 +79,107 @@ export const startDataProductInfraDeployment = async ( const stack = app.synth().getStackByName(stackIdentifier); + let dynamicStackArn = ''; console.log('Synthesized dynamic infrastructure stack', stackIdentifier, stack); const sdkProvider = await SdkProvider.withAwsCliCompatibleDefaults(); - const cdk = new CloudFormationDeployments({ sdkProvider }); - - // Prepare for deployment - uploads assets and creates the change set, ready to deploy - const { stackArn } = await cdk.deployStack({ - // @ts-ignore: https://github.com/aws/aws-cdk/issues/18211 - stack, - tags: Object.keys(stack.tags) - .map((Key) => { - return { Key, Value: stack.tags[Key] }; + const deployments = new Deployments({ sdkProvider }); + + const buildAsset = async (assetNode: AssetBuildNode) => { + await deployments.buildSingleAsset(assetNode.assetManifestArtifact, assetNode.assetManifest, assetNode.asset, { + stack: assetNode.parentStack, + stackName: assetNode.parentStack.stackName, + }); + }; + + const publishAsset = async (assetNode: AssetPublishNode) => { + await deployments.publishSingleAsset(assetNode.assetManifest, assetNode.asset, { + stack: assetNode.parentStack, + stackName: assetNode.parentStack.stackName, + }); + }; + + const deployStack = async (assetNode: StackNode) => { + const stack = assetNode.stack; + // Prepare for deployment - uploads assets and creates the change set, ready to deploy + const { stackArn } = await deployments.deployStack({ + // @ts-ignore: https://github.com/aws/aws-cdk/issues/18211 + stack, + tags: Object.keys(stack.tags) + .map((Key) => { + return { Key, Value: stack.tags[Key] }; + }) + .concat([ + { + Key: 'DataProductId', + Value: dataProduct.dataProductId, + }, + { + Key: 'DomainId', + Value: dataProduct.domainId, + }, + ]), + // Do not execute the deployment via cdk since it waits for the deployment to complete + execute: false, + }); + + // Find the change set that was created since the cdk deployStack does not return it + const changeSets = await cfn + .listChangeSets({ + StackName: stackArn, }) - .concat([ - { - Key: 'DataProductId', - Value: dataProduct.dataProductId, - }, - { - Key: 'DomainId', - Value: dataProduct.domainId, - }, - ]), - // Do not execute the deployment via cdk since it waits for the deployment to complete - execute: false, - }); + .promise(); - // Find the change set that was created since the cdk deployStack does not return it - const changeSets = await cfn - .listChangeSets({ - StackName: stackArn, - }) - .promise(); + // We expect a single change set for the data product + if (changeSets?.Summaries?.length !== 1) { + throw new VError( + { name: 'SingleChangeSetError' }, + `Expected a single change set to deploy dynamic infrastructure: ${JSON.stringify(changeSets)}`, + ); + } - // We expect a single change set for the data product - if (changeSets?.Summaries?.length !== 1) { - throw new VError( - { name: 'SingleChangeSetError' }, - `Expected a single change set to deploy dynamic infrastructure: ${JSON.stringify(changeSets)}`, - ); - } + const changeSetId = changeSets.Summaries[0].ChangeSetId!; - const changeSetId = changeSets.Summaries[0].ChangeSetId!; + console.log('Deploying dynamic data product infrastructure with change set id:', changeSetId); - console.log('Deploying dynamic data product infrastructure with change set id:', changeSetId); - - await cfn - .executeChangeSet({ - ChangeSetName: changeSetId, - StackName: stackArn, - }) - .promise(); + await cfn + .executeChangeSet({ + ChangeSetName: changeSetId, + StackName: stackArn, + }) + .promise(); + + dynamicStackArn = stackArn; + }; + + try { + console.log('Prepare assets'); + const stackAndAssetManifests = [ + stack as cxapi.CloudFormationStackArtifact, + ...(( + stack.dependencies?.filter(cxapi.AssetManifestArtifact.isAssetManifestArtifact) ?? [] + ) as cxapi.CloudArtifact[]), + ]; + + const workGraph = new WorkGraphBuilder(false).build(stackAndAssetManifests); + const graphConcurrency: Concurrency = { + stack: 1, + 'asset-build': 1, // This will be CPU-bound/memory bound, mostly matters for Docker builds + 'asset-publish': 1, // This will be I/O-bound, 8 in parallel seems reasonable + }; + + console.log('Start building, publishing and deployment'); + await workGraph.doParallel(graphConcurrency, { + deployStack, + buildAsset, + publishAsset, + }); + } catch (e) { + console.log(`Dynamic infrastructure stack ${stackIdentifier} failed to deploy.`); + throw e; + } - return stackArn; + return dynamicStackArn; }; /** diff --git a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/glue/transform-jobs-and-crawlers.ts b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/glue/transform-jobs-and-crawlers.ts index 19daad3..dff1292 100644 --- a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/glue/transform-jobs-and-crawlers.ts +++ b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/glue/transform-jobs-and-crawlers.ts @@ -25,6 +25,7 @@ export interface TransformJobsAndCrawlersProps { readonly glueSecurityConfigurationName: string; readonly sourceAccessRole: ExternalFacingRole; readonly glueConnectionNames?: string[]; + readonly defaultTransformRequired: boolean; readonly extraJobArgs?: { [key: string]: string }; } @@ -49,6 +50,7 @@ export default class TransformJobsAndCrawlers extends Construct { glueSecurityConfigurationName, sourceAccessRole, glueConnectionNames, + defaultTransformRequired, extraJobArgs, }: TransformJobsAndCrawlersProps, ) { @@ -75,6 +77,15 @@ export default class TransformJobsAndCrawlers extends Construct { // NOTE: Consider accepting the kms key arn as input for s3-based data products to scope this role down. sourceAccessRole.addToPolicy(ExternalSourceDataKmsAccessPolicyStatement); + /** + * If the default transform is required and the user has not supplied any transforms, force this data + * product to execute the default 'ada_parquet_data_type_map', which will force copying + * data to s3 and thus be readable via Athena + */ + if (defaultTransformRequired && dataProduct.transforms.length === 0) { + dataProduct.transforms.push({ scriptId: 'ada_parquet_data_type_map', namespace: 'global' }); + } + // Create a job and a crawler for every script that may be involved in the data product transform chain this.transformJobs = getPossibleTransformsForDataProduct(dataProduct).map((transform, i) => { const scriptId = `${transform.namespace}-${transform.scriptId}`; diff --git a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/step-functions/arbitrary-transform-loop.ts b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/step-functions/arbitrary-transform-loop.ts index 9ec5daf..a474a36 100644 --- a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/step-functions/arbitrary-transform-loop.ts +++ b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/constructs/step-functions/arbitrary-transform-loop.ts @@ -34,6 +34,7 @@ export interface ArbitraryTransformLoopProps { readonly putErrorEventOnEventBridge: EventBridgePutEvents; readonly sourceAccessRole: ExternalFacingRole; readonly glueConnectionNames?: string[]; + readonly defaultTransformRequired: boolean; readonly extraJobArgs?: { [key: string]: string }; } @@ -67,6 +68,7 @@ export default class ArbitraryTransformLoop extends Construct { glueSecurityConfigurationName, sourceAccessRole: props.sourceAccessRole, glueConnectionNames: props.glueConnectionNames, + defaultTransformRequired: props.defaultTransformRequired, extraJobArgs: props.extraJobArgs, }); } diff --git a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/stacks/dynamic-infrastructure-stack-base.ts b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/stacks/dynamic-infrastructure-stack-base.ts index 5ebab45..04fc923 100644 --- a/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/stacks/dynamic-infrastructure-stack-base.ts +++ b/source/packages/@ada/infra/src/services/data-product/dynamic-infrastructure/stacks/dynamic-infrastructure-stack-base.ts @@ -45,6 +45,7 @@ export abstract class DynamicInfrastructureStackBase extends ExtendedStack imple public readonly putErrorEventOnEventBridge: EventBridgePutEvents; public readonly putNoUpdateEventOnEventBridge: EventBridgePutEvents; public readonly transformLoop: ArbitraryTransformLoop; + public readonly defaultTransformRequired: boolean; public readonly catchProps: CatchProps = { resultPath: '$.ErrorDetails', }; @@ -65,6 +66,15 @@ export abstract class DynamicInfrastructureStackBase extends ExtendedStack imple */ protected abstract createAutomaticDataUpdateTriggerRule(props: DynamicInfraStackProps): Rule; + /** + * Set the true to force a default transform (ada_parquet_data_type_map) to execute, if no transforms applied by the User. + * This will force copying data into s3, which will allow Athena to have visibiity on the created Glue tables. + * This is required for any data Glue Connection data sources that aren't supported by Athena. + * See: https://docs.aws.amazon.com/athena/latest/ug/supported-serdes.html + */ + + protected abstract getDefaultTransformRequired(): boolean; + /** * Can be overridden to add additional policy statements to the external facing role */ @@ -138,7 +148,7 @@ export abstract class DynamicInfrastructureStackBase extends ExtendedStack imple }; } - // override this function if the connecto will need to specify connection to the glue transform + // override this function if the connector will need to specify connection to the glue transform protected getConnectionName(): string { return ''; } @@ -180,6 +190,8 @@ export abstract class DynamicInfrastructureStackBase extends ExtendedStack imple this.glueConnectionName = this.getConnectionName(); + this.defaultTransformRequired = this.getDefaultTransformRequired(); + const { putSuccessEventOnEventBridge, putErrorEventOnEventBridge, putNoUpdateEventOnEventBridge } = new CommonTasks( this, 'CommonTasks', @@ -215,6 +227,7 @@ export abstract class DynamicInfrastructureStackBase extends ExtendedStack imple putErrorEventOnEventBridge, sourceAccessRole: this.role, glueConnectionNames: this.glueConnectionName ? [this.glueConnectionName] : undefined, + defaultTransformRequired: this.defaultTransformRequired, extraJobArgs: props.extraJobArgs, }); diff --git a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/api-stack.test.ts.snap b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/api-stack.test.ts.snap index 0ad55bd..7c3bb4b 100644 --- a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/api-stack.test.ts.snap +++ b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/api-stack.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-ApiStack) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-ApiStack) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaDataProductServiceApiStackApiLambdaEventBridgeUpdateDataProductE054F2A1Arn": Object { "Value": Object { @@ -634,7 +634,7 @@ Object { "Ref": "referencetoAdaOpMetricsCustomResource0DFDFE51anonymousDataUUID", }, "AWS_SOLUTION_ID": "SO0190", - "AWS_SOLUTION_VERSION": "v1.2.0", + "AWS_SOLUTION_VERSION": "v1.3.0", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", }, @@ -5348,7 +5348,7 @@ Object { "Ref": "referencetoAdaOpMetricsCustomResource0DFDFE51anonymousDataUUID", }, "AWS_SOLUTION_ID": "SO0190", - "AWS_SOLUTION_VERSION": "v1.2.0", + "AWS_SOLUTION_VERSION": "v1.3.0", "BUILD_DATA_PRODUCT_LAMBDA_ARN": Object { "Fn::GetAtt": Array [ "ApiLambdaBuildDataProductEDA86792", @@ -8102,6 +8102,7 @@ Object { }, "ApiRestApiRefdataproductOPTIONS4912AC11": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -8212,11 +8213,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomainListDataProductDomainsResponseA206C715", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -8304,164 +8301,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdomainListDataProductDomainsResponseA206C715": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all domains", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Domain": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "type": "object", - }, - "DomainEntity": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "type": "object", - }, - "DomainIdentifier": Object { - "properties": Object { - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "domains": Object { - "items": Object { - "$ref": "#/definitions/DomainEntity", - }, - "type": "array", - }, - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "domains", - ], - "title": "ListDataProductDomainsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductdomainOPTIONS55368555": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -8594,11 +8436,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIdDeleteDataProductDomainResponse27FE2FD6", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -8634,134 +8472,6 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefdataproductdomaindomainIdDeleteDataProductDomainResponse27FE2FD6": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIdPutDataProductDomainResponse1924F81C", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The domain that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Domain": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "type": "object", - }, - "DomainIdentifier": Object { - "properties": Object { - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "title": "DeleteDataProductDomainResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductdomaindomainIdGET905CA02E": Object { "DependsOn": Array [ "ApiRestApiRefdataproductdomaindomainIdOPTIONSE2E7F9B4", @@ -8797,11 +8507,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIdGetDataProductDomainResponse5B843E11", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -8895,133 +8601,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdomaindomainIdGetDataProductDomainResponse5B843E11": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The domain with the given id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Domain": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "type": "object", - }, - "DomainIdentifier": Object { - "properties": Object { - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "title": "GetDataProductDomainResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIdOPTIONSE2E7F9B4": Object { + "ApiRestApiRefdataproductdomaindomainIdOPTIONSE2E7F9B4": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -9096,11 +8678,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIdPutDataProductDomainResponse1924F81C", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -9200,9 +8778,6 @@ Object { "Type": "AWS::Lambda::Permission", }, "ApiRestApiRefdataproductdomaindomainIdPutDataProductDomainRequestDDDCC40B": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIdGetDataProductDomainResponse5B843E11", - ], "Properties": Object { "ContentType": "application/json", "Description": "Details about the new domain", @@ -9260,134 +8835,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefdataproductdomaindomainIdPutDataProductDomainResponse1924F81C": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIdPutDataProductDomainRequestDDDCC40B", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated domain", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Domain": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "type": "object", - }, - "DomainIdentifier": Object { - "properties": Object { - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "domainId", - "name", - ], - "title": "PutDataProductDomainResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF": Object { "Properties": Object { "ParentId": Object { @@ -9493,11 +8940,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductListDataProductDomainDataProductsResponse479EA0D0", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -9536,6136 +8979,339 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefdataproductdomaindomainIddataproductListDataProductDomainDataProductsResponse479EA0D0": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductOPTIONSBF9E7128": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all data products", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefDataProductdomaindomainIdDataProduct44B89BE0", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDELETE2B94E547": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTD496EAB3", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteDataProductF3A5E619", + "Arn", + ], }, - }, - "required": Array [ - "dataType", + "/invocations", ], - "type": "object", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "description": "A map of column name to metadata about the column", - "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, - "DataProduct": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", + "StatusCode": "403", + }, + ], + "OperationName": "DeleteDataProductDomainDataProduct", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDELETEApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductDomainDomainIdDataProductDataProductIdBEC64932": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteDataProductF3A5E619", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/DELETE/data-product/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDELETEApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductDomainDomainIdDataProductDataProductId914CE5A4": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteDataProductF3A5E619", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/data-product/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdFileA2FE5C8A": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", + }, + "PathPart": "file", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGET2CF318C4": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTA0730EAF", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductEntity": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "dataProducts": Object { - "items": Object { - "$ref": "#/definitions/DataProductEntity", - }, - "type": "array", - }, - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "dataProducts", - ], - "title": "ListDataProductDomainDataProductsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductOPTIONSBF9E7128": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefDataProductdomaindomainIdDataProduct44B89BE0", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDELETE2B94E547": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTD496EAB3", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "DELETE", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductF3A5E619", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDeleteDataProductDomainDataProductResponse4571B85E", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "DeleteDataProductDomainDataProduct", - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDELETEApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductDomainDomainIdDataProductDataProductIdBEC64932": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductF3A5E619", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/DELETE/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDELETEApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductDomainDomainIdDataProductDataProductId914CE5A4": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductF3A5E619", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/DELETE/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdDeleteDataProductDomainDataProductResponse4571B85E": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductResponseBE79E0FA", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The data product that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", - }, - "description": "A map of column name to metadata about the column", - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProduct": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "title": "DeleteDataProductDomainDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdFileA2FE5C8A": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", - }, - "PathPart": "file", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGET2CF318C4": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTA0730EAF", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductBEE96E77", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGetDataProductDomainDataProductResponse8ED07725", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "GetDataProductDomainDataProduct", - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGETApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductId5F5D4252": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductBEE96E77", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGETApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductIdC19D9BB7": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductBEE96E77", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGetDataProductDomainDataProductResponse8ED07725": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductResponse1A2009BA", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The data product with the given id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", - }, - "description": "A map of column name to metadata about the column", - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "GovernedColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "lensToApply": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - "sqlClauses": Object { - "items": Object { - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "dataType", - "lensToApply", - "sqlClauses", - ], - "type": "object", - }, - "GovernedColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/GovernedColumnMetadata", - }, - "type": "object", - }, - "GovernedDataProduct": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/GovernedDataSetsDetails", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "GovernedDataSetDetails": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/GovernedColumnsMetadata", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "GovernedDataSetsDetails": Object { - "additionalProperties": Object { - "$ref": "#/definitions/GovernedDataSetDetails", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/GovernedDataSetsDetails", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "title": "GetDataProductDomainDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdOPTIONS9D816CD4": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTA0730EAF": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdOPTIONS9D816CD4", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "POST", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPostDataProductF856414D", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductResponse1A2009BA", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "PostDataProductDomainDataProduct", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductRequest0C998C53", - }, - }, - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - "method.request.querystring.initialFullAccessGroups": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductId7F29DF29": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPostDataProductF856414D", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/POST/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductId74346250": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPostDataProductF856414D", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/POST/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductId91244862": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutDataProduct8AA5B687", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdC591C8E5": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutDataProduct8AA5B687", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/data-product/domain/*/data-product/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTD496EAB3": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGET2CF318C4", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutDataProduct8AA5B687", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductResponseBE79E0FA", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "PutDataProductDomainDataProduct", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductRequest8DB6C9BA", - }, - }, - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - "method.request.querystring.initialFullAccessGroups": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductRequest0C998C53": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the new data product", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", - }, - "description": "A map of column name to metadata about the column", - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "name", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "title": "PostDataProductDomainDataProductRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductResponse1A2009BA": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductRequest0C998C53", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created data product", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", - }, - "description": "A map of column name to metadata about the column", - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProduct": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "title": "PostDataProductDomainDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductRequest8DB6C9BA": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGetDataProductDomainDataProductResponse8ED07725", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the data product to update", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", - }, - "description": "A map of column name to metadata about the column", - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "title": "PutDataProductDomainDataProductRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductResponseBE79E0FA": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductRequest8DB6C9BA", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The updated data product", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", - }, - "description": "A map of column name to metadata about the column", - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProduct": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetDataProductBEE96E77", + "Arn", + ], }, - }, - "required": Array [ - "key", + "/invocations", ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", }, + "StatusCode": "400", }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", }, + "StatusCode": "403", }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", + ], + "OperationName": "GetDataProductDomainDataProduct", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGETApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductId5F5D4252": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetDataProductBEE96E77", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/data-product/domain/*/data-product/*", + ], ], - "title": "PutDataProductDomainDataProductResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdStartDataUpdate04A27BD4": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGETApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductIdC19D9BB7": Object { "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetDataProductBEE96E77", + "Arn", + ], }, - "PathPart": "start-data-update", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/data-product/domain/*/data-product/*", + ], + ], }, }, - "Type": "AWS::ApiGateway::Resource", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileOPTIONSBE56ECDF": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdOPTIONS9D816CD4": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -15697,7 +9343,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdFileA2FE5C8A", + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -15705,81 +9351,218 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileUpload6E8EDF0F": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTA0730EAF": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdOPTIONS9D816CD4", + ], "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdFileA2FE5C8A", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "POST", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPostDataProductF856414D", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "PostDataProductDomainDataProduct", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductRequest0C998C53", + }, + }, + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + "method.request.querystring.initialFullAccessGroups": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", }, - "PathPart": "upload", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Resource", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductId7F29DF29": Object { "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileUpload6E8EDF0F", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPostDataProductF856414D", + "Arn", + ], }, - "PathPart": "{fileName}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/POST/data-product/domain/*/data-product/*", + ], + ], }, }, - "Type": "AWS::ApiGateway::Resource", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadOPTIONSF3817AE6": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPOSTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductId74346250": Object { "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPostDataProductF856414D", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "StatusCode": "200", - }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/POST/data-product/domain/*/data-product/*", + ], ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileUpload6E8EDF0F", + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductId91244862": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutDataProduct8AA5B687", + "Arn", + ], }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/data-product/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdC591C8E5": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutDataProduct8AA5B687", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/data-product/domain/*/data-product/*", + ], + ], }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETA41C1AA8": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPUTD496EAB3": Object { "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOST90A6EE62", + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdGET2CF318C4", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "GET", + "HttpMethod": "PUT", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -15794,7 +9577,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetSignedUrl9E99B1BD", + "ApiLambdaPutDataProduct8AA5B687", "Arn", ], }, @@ -15804,13 +9587,17 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGetDataProductDomainDataProductFileUploadResponseD50861B7", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "200", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -15818,7 +9605,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "400", + "StatusCode": "404", }, Object { "ResponseModels": Object { @@ -15826,761 +9613,666 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + "StatusCode": "403", + }, + ], + "OperationName": "PutDataProductDomainDataProduct", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductRequest8DB6C9BA", + }, + }, + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + "method.request.querystring.initialFullAccessGroups": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductRequest0C998C53": Object { + "Properties": Object { + "ContentType": "application/json", + "Description": "Details about the new data product", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "Schema": Object { + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": Object { + "ColumnMetadata": Object { + "properties": Object { + "dataType": Object { + "description": "The data type of the column", + "maxLength": 2048, + "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", + "type": "string", + }, + "description": Object { + "description": "A description of the column", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "ontologyAttributeId": Object { + "description": "The ontology attribute the column maps to (if any)", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "ontologyNamespace": Object { + "description": "The ontologyNamespace of the ontology attribute", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "piiClassification": Object { + "description": "Pii classification of the column", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "sortOrder": Object { + "description": "The order in which this column should appear in the schema and results", + "type": "number", + }, + }, + "required": Array [ + "dataType", + ], + "type": "object", + }, + "ColumnsMetadata": Object { + "additionalProperties": Object { + "$ref": "#/definitions/ColumnMetadata", + }, + "description": "A map of column name to metadata about the column", + "type": "object", + }, + "DataProductBase": Object { + "properties": Object { + "childDataProducts": Object { + "description": "Any child data products, ie data products that use this data product as a source for their data", + "items": Object { + "$ref": "#/definitions/DataProductIdentifier", + }, + "type": "array", + }, + "cloudFormationStackId": Object { + "description": "The id of the cloudformation stack for all resources pertaining to this data product", + "maxLength": 2048, + "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", + "type": "string", + }, + "dataImportStateMachineArn": Object { + "description": "The arn of the state machine for importing data product data (if any)", + "type": "string", + }, + "dataProductId": Object { + "description": "The id of the data product", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "dataStatus": Object { + "$ref": "#/definitions/DataProductDataStatus", + "description": "Status of data product data", + }, + "dataStatusDetails": Object { + "description": "Details about the data status of the data product, eg error message if data import failed", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "description": Object { + "description": "A description of the data product", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "domainId": Object { + "description": "The id of the domain to which this data product belongs", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "enableAutomaticPii": Object { + "description": "Whether or not to automatically apply pii detection and redaction", + "type": "boolean", + }, + "enableAutomaticTransforms": Object { + "description": "Whether or not to automatically apply transforms based on the type of data in the data product", + "type": "boolean", + }, + "infrastructureStatus": Object { + "$ref": "#/definitions/DataProductInfrastructureStatus", + "description": "Status of data product infrastructure", + }, + "infrastructureStatusDetails": Object { + "description": "Details about the infrastructure status of the data product, eg error message if creation failed", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "latestDataUpdateTimestamp": Object { + "description": "The time at which the data product data was last updated", + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "type": "string", + }, + "name": Object { + "description": "The name of the data product", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "parentDataProducts": Object { + "description": "Any parent data products, ie data products that are used as a source for data in this data product", + "items": Object { + "$ref": "#/definitions/DataProductIdentifier", + }, + "type": "array", + }, + "sourceDataSets": Object { + "$ref": "#/definitions/DataSets", + "description": "Map of datasets by id", + }, + "sourceDataStatus": Object { + "$ref": "#/definitions/DataProductSourceDataStatus", + "description": "Status of raw source data product data", + }, + "sourceDataStatusDetails": Object { + "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", + "type": "string", + }, + "sourceDetails": Object { + "$ref": "#/definitions/SouceDetailsSchema", + }, + "sourceType": Object { + "$ref": "#/definitions/SourceTypeEnum", + "description": "Source type value", + }, + "tags": Object { + "$ref": "#/definitions/Tags", + }, + "transforms": Object { + "$ref": "#/definitions/DataProductTransforms", + "description": "Ordered list of transformations applied to data in the data product", + }, + "updateTrigger": Object { + "$ref": "#/definitions/DataProductUpdateTrigger", + "description": "The trigger for a data update", + }, + }, + "required": Array [ + "childDataProducts", + "dataProductId", + "domainId", + "name", + "parentDataProducts", + "sourceType", + "tags", + "transforms", + "updateTrigger", + ], + "type": "object", + }, + "DataProductDataStatus": Object { + "description": "Status of data product data", + "enum": Array [ + "NO_DATA", + "UPDATING", + "READY", + "FAILED", + ], + "type": "string", + }, + "DataProductIdentifier": Object { + "properties": Object { + "dataProductId": Object { + "description": "The id of the data product", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "domainId": Object { + "description": "The id of the domain to which this data product belongs", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, }, + "required": Array [ + "dataProductId", + "domainId", + ], + "type": "object", }, - "StatusCode": "403", - }, - ], - "OperationName": "GetDataProductDomainDataProductFileUpload", - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - "method.request.path.fileName": true, - "method.request.querystring.contentType": true, - "method.request.querystring.partNumber": false, - "method.request.querystring.uploadId": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductIdFileUploadFileName79232A4A": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetSignedUrl9E99B1BD", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/data-product/domain/*/data-product/*/file/upload/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameCAA9EA91": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetSignedUrl9E99B1BD", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/data-product/domain/*/data-product/*/file/upload/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGetDataProductDomainDataProductFileUploadResponseD50861B7": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePostDataProductDomainDataProductFileUploadResponseA60CE1E8", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "An upload url to be used to store the file", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "bucket": Object { + "DataProductInfrastructureStatus": Object { + "description": "Status of data product infrastructure", + "enum": Array [ + "PROVISIONING", + "READY", + "FAILED", + ], "type": "string", }, - "key": Object { + "DataProductSourceDataStatus": Object { + "description": "Status of raw source data product data", + "enum": Array [ + "NO_DATA", + "UPDATING", + "READY", + "FAILED", + ], "type": "string", }, - "signedUrl": Object { - "type": "string", + "DataProductTransform": Object { + "description": "Uniquely identifies the script. Used to calculate the script path in s3", + "properties": Object { + "inlineScriptContent": Object { + "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", + "maxLength": 262144, + "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", + "type": "string", + }, + "inputArgs": Object { + "description": "Arguments to pass to the script", + }, + "namespace": Object { + "description": "The namespace in which the script resides, eg the domain.", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "scriptId": Object { + "description": "Identifies the script within the namespace", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + }, + "required": Array [ + "scriptId", + "namespace", + ], + "type": "object", }, - }, - "required": Array [ - "signedUrl", - "bucket", - "key", - ], - "title": "GetDataProductDomainDataProductFileUploadResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameOPTIONS5664F39A": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", + "DataProductTransforms": Object { + "description": "Ordered list of transformations applied to data in the data product", + "items": Object { + "$ref": "#/definitions/DataProductTransform", + "description": "Uniquely identifies the script. Used to calculate the script path in s3", }, - "StatusCode": "200", + "type": "array", }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, + "DataProductUpdatePolicyType": Object { + "description": "Update types for a data product data", + "enum": Array [ + "APPEND", + "REPLACE", + ], + "type": "string", }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOST90A6EE62": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameOPTIONS5664F39A", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "POST", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", + "DataProductUpdateTrigger": Object { + "description": "The trigger for a data update", + "properties": Object { + "scheduleRate": Object { + "description": "Cron schedule for data update (if triggerType is scheduled)", + "maxLength": 64, + "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", + "type": "string", }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPostMultipartUpload3DC0ABC3", - "Arn", - ], + "triggerType": Object { + "$ref": "#/definitions/DataProductUpdateTriggerType", + "description": "Trigger types for a data product data", + }, + "updatePolicy": Object { + "$ref": "#/definitions/DataProductUpdatePolicyType", + "description": "Update types for a data product data", }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePostDataProductDomainDataProductFileUploadResponseA60CE1E8", }, + "required": Array [ + "triggerType", + ], + "type": "object", }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, + "DataProductUpdateTriggerType": Object { + "description": "Trigger types for a data product data", + "enum": Array [ + "ON_DEMAND", + "SCHEDULE", + "AUTOMATIC", + ], + "type": "string", }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + "DataSet": Object { + "properties": Object { + "columnMetadata": Object { + "$ref": "#/definitions/ColumnsMetadata", + "description": "A map of column name to metadata about the column", + }, + "description": Object { + "description": "A description of the dataset", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "identifiers": Object { + "$ref": "#/definitions/DataSetIdentifiers", + "description": "Details specific to attributes that identify the dataset", + }, + "name": Object { + "description": "The name of the dataset within the data product", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, }, + "required": Array [ + "columnMetadata", + "identifiers", + ], + "type": "object", }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + "DataSetDetails": Object { + "properties": Object { + "description": Object { + "description": "A description of the dataset", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "identifiers": Object { + "$ref": "#/definitions/DataSetIdentifiers", + "description": "Details specific to attributes that identify the dataset", + }, + "name": Object { + "description": "The name of the dataset within the data product", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, }, + "required": Array [ + "identifiers", + ], + "type": "object", }, - "StatusCode": "403", - }, - ], - "OperationName": "PostDataProductDomainDataProductFileUpload", - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - "method.request.path.fileName": true, - "method.request.querystring.contentType": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOSTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameA7A11020": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPostMultipartUpload3DC0ABC3", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/POST/data-product/domain/*/data-product/*/file/upload/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOSTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameBD89D6F5": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPostMultipartUpload3DC0ABC3", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/POST/data-product/domain/*/data-product/*/file/upload/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePUTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameEC13132E": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutMultipartUploadD8BC0E12", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/data-product/domain/*/data-product/*/file/upload/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePUTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameC133F26E": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutMultipartUploadD8BC0E12", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", + "DataSetIdentifiers": Object { + "description": "Details specific to attributes that identify the dataset", + "properties": Object { + "catalog": Object { + "description": "The catalog of the dataset", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "database": Object { + "description": "The database where the detaset is located", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "table": Object { + "description": "The name of the table that contains the data of the dataset", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "type": "object", + }, + "DataSets": Object { + "additionalProperties": Object { + "$ref": "#/definitions/DataSet", }, - "/test-invoke-stage/PUT/data-product/domain/*/data-product/*/file/upload/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePUTBD81A17A": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETA41C1AA8", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", + "description": "Map of datasets by id", + "type": "object", + }, + "ScriptIdentifier": Object { + "description": "Uniquely identifies the script. Used to calculate the script path in s3", + "properties": Object { + "namespace": Object { + "description": "The namespace in which the script resides, eg the domain.", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutMultipartUploadD8BC0E12", - "Arn", - ], + "scriptId": Object { + "description": "Identifies the script within the namespace", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadResponseC4516867", }, + "required": Array [ + "scriptId", + "namespace", + ], + "type": "object", }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, + "SouceDetailsSchema": Object { + "type": "object", }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + "SourceTypeEnum": Object { + "description": "Source type value", + "enum": Array [ + "UPLOAD", + "S3", + "KINESIS", + "GOOGLE_ANALYTICS", + "GOOGLE_BIGQUERY", + "GOOGLE_STORAGE", + "DYNAMODB", + "CLOUDWATCH", + "REDSHIFT", + "MYSQL5", + "POSTGRESQL", + "SQLSERVER", + "ORACLE", + "CLOUDTRAIL", + "MONGODB", + ], + "type": "string", + }, + "Tag": Object { + "properties": Object { + "key": Object { + "maxLength": 128, + "minLength": 1, + "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", + }, + "value": Object { + "maxLength": 256, + "minLength": 0, + "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", + }, }, + "required": Array [ + "key", + ], + "type": "object", }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + "Tags": Object { + "items": Object { + "$ref": "#/definitions/Tag", }, + "type": "array", }, - "StatusCode": "403", - }, - ], - "OperationName": "PutDataProductDomainDataProductFileUpload", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadRequestA4FB1C03", }, - }, - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - "method.request.path.fileName": true, - "method.request.querystring.uploadId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePostDataProductDomainDataProductFileUploadResponseA60CE1E8": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "An uploadId to be used for the subsequent invocations", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", "properties": Object { - "bucket": Object { + "childDataProducts": Object { + "description": "Any child data products, ie data products that use this data product as a source for their data", + "items": Object { + "$ref": "#/definitions/DataProductIdentifier", + }, + "type": "array", + }, + "cloudFormationStackId": Object { + "description": "The id of the cloudformation stack for all resources pertaining to this data product", + "maxLength": 2048, + "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", "type": "string", }, - "key": Object { + "dataImportStateMachineArn": Object { + "description": "The arn of the state machine for importing data product data (if any)", "type": "string", }, - "uploadId": Object { + "dataProductId": Object { + "description": "The id of the data product", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - }, - "required": Array [ - "uploadId", - "bucket", - "key", - ], - "title": "PostDataProductDomainDataProductFileUploadResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadRequestA4FB1C03": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGetDataProductDomainDataProductFileUploadResponseD50861B7", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the uploaded parts", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "parts": Object { + "dataSets": Object { + "$ref": "#/definitions/DataSets", + "description": "Map of datasets by id", + }, + "dataStatus": Object { + "$ref": "#/definitions/DataProductDataStatus", + "description": "Status of data product data", + }, + "dataStatusDetails": Object { + "description": "Details about the data status of the data product, eg error message if data import failed", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "description": Object { + "description": "A description of the data product", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "domainId": Object { + "description": "The id of the domain to which this data product belongs", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "enableAutomaticPii": Object { + "description": "Whether or not to automatically apply pii detection and redaction", + "type": "boolean", + }, + "enableAutomaticTransforms": Object { + "description": "Whether or not to automatically apply transforms based on the type of data in the data product", + "type": "boolean", + }, + "infrastructureStatus": Object { + "$ref": "#/definitions/DataProductInfrastructureStatus", + "description": "Status of data product infrastructure", + }, + "infrastructureStatusDetails": Object { + "description": "Details about the infrastructure status of the data product, eg error message if creation failed", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "latestDataUpdateTimestamp": Object { + "description": "The time at which the data product data was last updated", + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "type": "string", + }, + "name": Object { + "description": "The name of the data product", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "parentDataProducts": Object { + "description": "Any parent data products, ie data products that are used as a source for data in this data product", "items": Object { - "properties": Object { - "etag": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "partNumber": Object { - "type": "number", - }, - }, - "required": Array [ - "etag", - "partNumber", - ], - "type": "object", + "$ref": "#/definitions/DataProductIdentifier", }, "type": "array", }, - }, - "required": Array [ - "parts", - ], - "title": "PutDataProductDomainDataProductFileUploadRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadResponseC4516867": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadRequestA4FB1C03", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the bucket and the object that have been stored", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "bucket": Object { - "maxLength": 63, - "minLength": 3, - "pattern": "^[a-z0-9]+[a-z0-9-]+[a-z0-9]+$", - "type": "string", + "sourceDataSets": Object { + "$ref": "#/definitions/DataSets", + "description": "Map of datasets by id", + }, + "sourceDataStatus": Object { + "$ref": "#/definitions/DataProductSourceDataStatus", + "description": "Status of raw source data product data", }, - "key": Object { - "maxLength": 1024, - "minLength": 1, - "pattern": "^[a-zA-Z0-9!_.*'()-]+(/[a-zA-Z0-9!_.*'()-]+)*$", + "sourceDataStatusDetails": Object { + "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", "type": "string", }, - }, - "required": Array [ - "bucket", - "key", - ], - "title": "PutDataProductDomainDataProductFileUploadResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdateOPTIONS9802E80E": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", + "sourceDetails": Object { + "$ref": "#/definitions/SouceDetailsSchema", }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, + "sourceType": Object { + "$ref": "#/definitions/SourceTypeEnum", + "description": "Source type value", }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdStartDataUpdate04A27BD4", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePUTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdStartDataUpdate6DA3632A": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutStartDataProductDataUpdateAAFC7A82", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/data-product/domain/*/data-product/*/start-data-update", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePUTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdStartDataUpdate2E2F5ABB": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutStartDataProductDataUpdateAAFC7A82", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/data-product/domain/*/data-product/*/start-data-update", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePUTDB52F8F3": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdateOPTIONS9802E80E", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutStartDataProductDataUpdateAAFC7A82", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePutDataProductDomainDataProductStartDataUpdateResponseF41EFD08", - }, + "tags": Object { + "$ref": "#/definitions/Tags", }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, + "transforms": Object { + "$ref": "#/definitions/DataProductTransforms", + "description": "Ordered list of transformations applied to data in the data product", }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, + "updateTrigger": Object { + "$ref": "#/definitions/DataProductUpdateTrigger", + "description": "The trigger for a data update", }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, + "updatedTimestamp": Object { + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "type": "string", }, - "StatusCode": "403", - }, - ], - "OperationName": "PutDataProductDomainDataProductStartDataUpdate", - "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdStartDataUpdate04A27BD4", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "required": Array [ + "name", + "sourceType", + "tags", + "transforms", + "updateTrigger", + ], + "title": "PostDataProductDomainDataProductRequest", + "type": "object", }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePutDataProductDomainDataProductStartDataUpdateResponseF41EFD08": Object { + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPutDataProductDomainDataProductRequest8DB6C9BA": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdPostDataProductDomainDataProductRequest0C998C53", + ], "Properties": Object { "ContentType": "application/json", - "Description": "Details about the data product that we started to update data for", + "Description": "Details about the data product to update", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, @@ -16639,32 +10331,7 @@ Object { "description": "A map of column name to metadata about the column", "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProduct": Object { + "DataProductBase": Object { "properties": Object { "childDataProducts": Object { "description": "Any child data products, ie data products that use this data product as a source for their data", @@ -16690,10 +10357,6 @@ Object { "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, "dataStatus": Object { "$ref": "#/definitions/DataProductDataStatus", "description": "Status of data product data", @@ -16789,7 +10452,6 @@ Object { "required": Array [ "childDataProducts", "dataProductId", - "dataSets", "domainId", "name", "parentDataProducts", @@ -16800,25 +10462,18 @@ Object { ], "type": "object", }, - "DataProductBase": Object { + "DataProductDataStatus": Object { + "description": "Status of data product data", + "enum": Array [ + "NO_DATA", + "UPDATING", + "READY", + "FAILED", + ], + "type": "string", + }, + "DataProductIdentifier": Object { "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, "dataProductId": Object { "description": "The id of the data product", "maxLength": 256, @@ -16826,175 +10481,212 @@ Object { "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", + "domainId": Object { + "description": "The id of the domain to which this data product belongs", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + }, + "required": Array [ + "dataProductId", + "domainId", + ], + "type": "object", + }, + "DataProductInfrastructureStatus": Object { + "description": "Status of data product infrastructure", + "enum": Array [ + "PROVISIONING", + "READY", + "FAILED", + ], + "type": "string", + }, + "DataProductSourceDataStatus": Object { + "description": "Status of raw source data product data", + "enum": Array [ + "NO_DATA", + "UPDATING", + "READY", + "FAILED", + ], + "type": "string", + }, + "DataProductTransform": Object { + "description": "Uniquely identifies the script. Used to calculate the script path in s3", + "properties": Object { + "inlineScriptContent": Object { + "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", + "maxLength": 262144, + "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", "type": "string", }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "inputArgs": Object { + "description": "Arguments to pass to the script", + }, + "namespace": Object { + "description": "The namespace in which the script resides, eg the domain.", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", + "scriptId": Object { + "description": "Identifies the script within the namespace", "maxLength": 256, "minLength": 2, "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", + }, + "required": Array [ + "scriptId", + "namespace", + ], + "type": "object", + }, + "DataProductTransforms": Object { + "description": "Ordered list of transformations applied to data in the data product", + "items": Object { + "$ref": "#/definitions/DataProductTransform", + "description": "Uniquely identifies the script. Used to calculate the script path in s3", + }, + "type": "array", + }, + "DataProductUpdatePolicyType": Object { + "description": "Update types for a data product data", + "enum": Array [ + "APPEND", + "REPLACE", + ], + "type": "string", + }, + "DataProductUpdateTrigger": Object { + "description": "The trigger for a data update", + "properties": Object { + "scheduleRate": Object { + "description": "Cron schedule for data update (if triggerType is scheduled)", + "maxLength": 64, + "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", + "type": "string", }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", + "triggerType": Object { + "$ref": "#/definitions/DataProductUpdateTriggerType", + "description": "Trigger types for a data product data", }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", + "updatePolicy": Object { + "$ref": "#/definitions/DataProductUpdatePolicyType", + "description": "Update types for a data product data", }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", + }, + "required": Array [ + "triggerType", + ], + "type": "object", + }, + "DataProductUpdateTriggerType": Object { + "description": "Trigger types for a data product data", + "enum": Array [ + "ON_DEMAND", + "SCHEDULE", + "AUTOMATIC", + ], + "type": "string", + }, + "DataSet": Object { + "properties": Object { + "columnMetadata": Object { + "$ref": "#/definitions/ColumnsMetadata", + "description": "A map of column name to metadata about the column", + }, + "description": Object { + "description": "A description of the dataset", "maxLength": 2048, "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", "type": "string", }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "identifiers": Object { + "$ref": "#/definitions/DataSetIdentifiers", + "description": "Details specific to attributes that identify the dataset", }, "name": Object { - "description": "The name of the data product", + "description": "The name of the dataset within the data product", "maxLength": 2048, "minLength": 2, "pattern": "^[\\\\w _-]*$", "type": "string", }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", + }, + "required": Array [ + "columnMetadata", + "identifiers", + ], + "type": "object", + }, + "DataSetDetails": Object { + "properties": Object { + "description": Object { + "description": "A description of the dataset", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", "type": "string", }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", + "identifiers": Object { + "$ref": "#/definitions/DataSetIdentifiers", + "description": "Details specific to attributes that identify the dataset", }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", + "name": Object { + "description": "The name of the dataset within the data product", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", }, }, "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", + "identifiers", ], "type": "object", }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { + "DataSetIdentifiers": Object { + "description": "Details specific to attributes that identify the dataset", "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, + "catalog": Object { + "description": "The catalog of the dataset", + "maxLength": 2048, "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", + "pattern": "^[\\\\w _-]*$", "type": "string", }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, + "database": Object { + "description": "The database where the detaset is located", + "maxLength": 2048, "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "table": Object { + "description": "The name of the table that contains the data of the dataset", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", "type": "string", }, }, - "required": Array [ - "dataProductId", - "domainId", - ], "type": "object", }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", + "DataSets": Object { + "additionalProperties": Object { + "$ref": "#/definitions/DataSet", + }, + "description": "Map of datasets by id", + "type": "object", }, - "DataProductTransform": Object { + "ScriptIdentifier": Object { "description": "Uniquely identifies the script. Used to calculate the script path in s3", "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, "namespace": Object { "description": "The namespace in which the script resides, eg the domain.", "maxLength": 256, @@ -17016,375 +10708,1011 @@ Object { ], "type": "object", }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", + "SouceDetailsSchema": Object { + "type": "object", + }, + "SourceTypeEnum": Object { + "description": "Source type value", + "enum": Array [ + "UPLOAD", + "S3", + "KINESIS", + "GOOGLE_ANALYTICS", + "GOOGLE_BIGQUERY", + "GOOGLE_STORAGE", + "DYNAMODB", + "CLOUDWATCH", + "REDSHIFT", + "MYSQL5", + "POSTGRESQL", + "SQLSERVER", + "ORACLE", + "CLOUDTRAIL", + "MONGODB", + ], + "type": "string", + }, + "Tag": Object { + "properties": Object { + "key": Object { + "maxLength": 128, + "minLength": 1, + "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", + }, + "value": Object { + "maxLength": 256, + "minLength": 0, + "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", + }, + }, + "required": Array [ + "key", + ], + "type": "object", + }, + "Tags": Object { "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", + "$ref": "#/definitions/Tag", }, "type": "array", }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], + }, + "properties": Object { + "childDataProducts": Object { + "description": "Any child data products, ie data products that use this data product as a source for their data", + "items": Object { + "$ref": "#/definitions/DataProductIdentifier", + }, + "type": "array", + }, + "cloudFormationStackId": Object { + "description": "The id of the cloudformation stack for all resources pertaining to this data product", + "maxLength": 2048, + "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", + "type": "string", + }, + "dataImportStateMachineArn": Object { + "description": "The arn of the state machine for importing data product data (if any)", + "type": "string", + }, + "dataProductId": Object { + "description": "The id of the data product", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "dataSets": Object { + "$ref": "#/definitions/DataSets", + "description": "Map of datasets by id", + }, + "dataStatus": Object { + "$ref": "#/definitions/DataProductDataStatus", + "description": "Status of data product data", + }, + "dataStatusDetails": Object { + "description": "Details about the data status of the data product, eg error message if data import failed", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "description": Object { + "description": "A description of the data product", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "domainId": Object { + "description": "The id of the domain to which this data product belongs", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "enableAutomaticPii": Object { + "description": "Whether or not to automatically apply pii detection and redaction", + "type": "boolean", + }, + "enableAutomaticTransforms": Object { + "description": "Whether or not to automatically apply transforms based on the type of data in the data product", + "type": "boolean", + }, + "infrastructureStatus": Object { + "$ref": "#/definitions/DataProductInfrastructureStatus", + "description": "Status of data product infrastructure", + }, + "infrastructureStatusDetails": Object { + "description": "Details about the infrastructure status of the data product, eg error message if creation failed", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "latestDataUpdateTimestamp": Object { + "description": "The time at which the data product data was last updated", + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "type": "string", + }, + "name": Object { + "description": "The name of the data product", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "parentDataProducts": Object { + "description": "Any parent data products, ie data products that are used as a source for data in this data product", + "items": Object { + "$ref": "#/definitions/DataProductIdentifier", + }, + "type": "array", + }, + "sourceDataSets": Object { + "$ref": "#/definitions/DataSets", + "description": "Map of datasets by id", + }, + "sourceDataStatus": Object { + "$ref": "#/definitions/DataProductSourceDataStatus", + "description": "Status of raw source data product data", + }, + "sourceDataStatusDetails": Object { + "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", "type": "string", }, - "DataProductUpdateTrigger": Object { + "sourceDetails": Object { + "$ref": "#/definitions/SouceDetailsSchema", + }, + "sourceType": Object { + "$ref": "#/definitions/SourceTypeEnum", + "description": "Source type value", + }, + "tags": Object { + "$ref": "#/definitions/Tags", + }, + "transforms": Object { + "$ref": "#/definitions/DataProductTransforms", + "description": "Ordered list of transformations applied to data in the data product", + }, + "updateTrigger": Object { + "$ref": "#/definitions/DataProductUpdateTrigger", "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], + "updatedTimestamp": Object { + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", "type": "string", }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, + }, + "required": Array [ + "childDataProducts", + "dataProductId", + "dataSets", + "domainId", + "name", + "parentDataProducts", + "sourceType", + "tags", + "transforms", + "updateTrigger", + ], + "title": "PutDataProductDomainDataProductRequest", + "type": "object", + }, + }, + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdStartDataUpdate04A27BD4": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductDataProductIdA9E5A9CF", + }, + "PathPart": "start-data-update", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileOPTIONSBE56ECDF": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", + "StatusCode": "200", }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdFileA2FE5C8A", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileUpload6E8EDF0F": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdFileA2FE5C8A", + }, + "PathPart": "upload", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileUpload6E8EDF0F", + }, + "PathPart": "{fileName}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadOPTIONSF3817AE6": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "required": Array [ - "identifiers", - ], - "type": "object", + "StatusCode": "200", }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileUpload6E8EDF0F", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETA41C1AA8": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOST90A6EE62", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetSignedUrl9E99B1BD", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "description": "Map of datasets by id", - "type": "object", }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", }, - "SouceDetailsSchema": Object { - "type": "object", + "StatusCode": "403", + }, + ], + "OperationName": "GetDataProductDomainDataProductFileUpload", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + "method.request.path.fileName": true, + "method.request.querystring.contentType": true, + "method.request.querystring.partNumber": false, + "method.request.querystring.uploadId": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductIdFileUploadFileName79232A4A": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetSignedUrl9E99B1BD", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/data-product/domain/*/data-product/*/file/upload/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8GETDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameCAA9EA91": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetSignedUrl9E99B1BD", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/data-product/domain/*/data-product/*/file/upload/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameOPTIONS5664F39A": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOST90A6EE62": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameOPTIONS5664F39A", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "POST", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPostMultipartUpload3DC0ABC3", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "key", - ], - "type": "object", }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", }, + "StatusCode": "404", }, - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", + "StatusCode": "403", + }, + ], + "OperationName": "PostDataProductDomainDataProductFileUpload", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + "method.request.path.fileName": true, + "method.request.querystring.contentType": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOSTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameA7A11020": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPostMultipartUpload3DC0ABC3", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/POST/data-product/domain/*/data-product/*/file/upload/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePOSTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8POSTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameBD89D6F5": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPostMultipartUpload3DC0ABC3", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/POST/data-product/domain/*/data-product/*/file/upload/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePUTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameEC13132E": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutMultipartUploadD8BC0E12", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/data-product/domain/*/data-product/*/file/upload/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePUTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdFileUploadFileNameC133F26E": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutMultipartUploadD8BC0E12", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/data-product/domain/*/data-product/*/file/upload/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePUTBD81A17A": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNameGETA41C1AA8", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "PUT", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutMultipartUploadD8BC0E12", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", + "StatusCode": "403", + }, + ], + "OperationName": "PutDataProductDomainDataProductFileUpload", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadRequestA4FB1C03", + }, + }, + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + "method.request.path.fileName": true, + "method.request.querystring.uploadId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadFileNameC8EBC492", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdfileuploadfileNamePutDataProductDomainDataProductFileUploadRequestA4FB1C03": Object { + "Properties": Object { + "ContentType": "application/json", + "Description": "Details about the uploaded parts", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "Schema": Object { + "$schema": "http://json-schema.org/draft-04/schema#", + "properties": Object { + "parts": Object { "items": Object { - "$ref": "#/definitions/DataProductIdentifier", + "properties": Object { + "etag": Object { + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "partNumber": Object { + "type": "number", + }, + }, + "required": Array [ + "etag", + "partNumber", + ], + "type": "object", }, "type": "array", }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", + }, + "required": Array [ + "parts", + ], + "title": "PutDataProductDomainDataProductFileUploadRequest", + "type": "object", + }, + }, + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdateOPTIONS9802E80E": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdStartDataUpdate04A27BD4", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePUTApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdStartDataUpdate6DA3632A": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutStartDataProductDataUpdateAAFC7A82", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/data-product/domain/*/data-product/*/start-data-update", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePUTApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8PUTDataProductDomainDomainIdDataProductDataProductIdStartDataUpdate2E2F5ABB": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutStartDataProductDataUpdateAAFC7A82", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/data-product/domain/*/data-product/*/start-data-update", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdatePUTDB52F8F3": Object { + "DependsOn": Array [ + "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdstartdataupdateOPTIONS9802E80E", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "PUT", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutStartDataProductDataUpdateAAFC7A82", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, + "StatusCode": "403", }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "title": "PutDataProductDomainDataProductStartDataUpdateResponse", - "type": "object", + ], + "OperationName": "PutDataProductDomainDataProductStartDataUpdate", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductdomaindomainIddataproductdataProductIdStartDataUpdate04A27BD4", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, "ApiRestApiRefdataproductdynamoDBOPTIONS005C091F": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -17438,6 +11766,7 @@ Object { }, "ApiRestApiRefdataproductdynamoDBtableOPTIONS265C80EB": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -17491,6 +11820,7 @@ Object { }, "ApiRestApiRefdataproductdynamoDBtabletableArnOPTIONS04FE8A41": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -17577,11 +11907,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductdynamoDBtabletableArnstreamGetDataProductDynamoDBTableStreamResponse1969E418", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -17683,109 +12009,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductdynamoDBtabletableArnstreamGetDataProductDynamoDBTableStreamResponse1969E418": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Handler for retrieving dynamodb table stream details", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "TableStream": Object { - "properties": Object { - "crossAccount": Object { - "description": "Is the target table a cross account table", - "type": "boolean", - }, - "streamEnabled": Object { - "description": "Is there a data stream enabled on the table", - "type": "boolean", - }, - "streamViewType": Object { - "description": "What type of stream is enabled on the table", - "type": "string", - }, - "tableStreamArn": Object { - "description": "Table stream ARN", - "type": "string", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "crossAccount": Object { - "description": "Is the target table a cross account table", - "type": "boolean", - }, - "streamEnabled": Object { - "description": "Is there a data stream enabled on the table", - "type": "boolean", - }, - "streamViewType": Object { - "description": "What type of stream is enabled on the table", - "type": "string", - }, - "tableStreamArn": Object { - "description": "Table stream ARN", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "title": "GetDataProductDynamoDBTableStreamResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductdynamoDBtabletableArnstreamOPTIONSFF5234DE": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -17918,11 +12144,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductscriptsListDataProductScriptsResponseE715D461", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -17944,142 +12166,13 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductScripts6DEABCCC", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductscriptsListDataProductScriptsResponseE715D461": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all scripts", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "Script": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", - }, - }, - "required": Array [ - "name", - "namespace", - "scriptId", - ], - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "ScriptSource": Object { - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "scripts": Object { - "items": Object { - "$ref": "#/definitions/Script", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "scripts", - ], - "title": "ListDataProductScriptsResponse", - "type": "object", + "Ref": "ApiRestApiRefdataproductScripts6DEABCCC", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, "ApiRestApiRefdataproductscriptsNamespace46C8E3C7": Object { "Properties": Object { @@ -18107,6 +12200,7 @@ Object { }, "ApiRestApiRefdataproductscriptsOPTIONS34DDDA98": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -18160,6 +12254,7 @@ Object { }, "ApiRestApiRefdataproductscriptsnamespaceOPTIONSA3D4D309": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -18201,6 +12296,7 @@ Object { }, "ApiRestApiRefdataproductscriptsnamespacenamespaceOPTIONS747ACF03": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -18242,6 +12338,7 @@ Object { }, "ApiRestApiRefdataproductscriptsnamespacenamespacescriptOPTIONSC8C8083C": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -18328,11 +12425,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdDeleteDataProductScriptsNamespaceScriptResponse7D382CFE", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -18347,291 +12440,93 @@ Object { "ResponseModels": Object { "application/json": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "DeleteDataProductScriptsNamespaceScript", - "RequestParameters": Object { - "method.request.path.namespace": true, - "method.request.path.scriptId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefdataproductscriptsnamespacenamespacescriptScriptIdA5815697", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdDELETEApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductScriptsNamespaceNamespaceScriptScriptIdB34A4AB3": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteScript7A830C95", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/DELETE/data-product/scripts/namespace/*/script/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdDELETEApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductScriptsNamespaceNamespaceScriptScriptId232B8D7A": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteScript7A830C95", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/DELETE/data-product/scripts/namespace/*/script/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdDeleteDataProductScriptsNamespaceScriptResponse7D382CFE": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdPutDataProductScriptsNamespaceScriptResponse18D72510", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The script that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Script": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", - }, - }, - "required": Array [ - "name", - "namespace", - "scriptId", - ], - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "ScriptSource": Object { - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - }, - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", + }, }, + "StatusCode": "404", }, - "required": Array [ - "name", - "namespace", - "scriptId", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "DeleteDataProductScriptsNamespaceScript", + "RequestParameters": Object { + "method.request.path.namespace": true, + "method.request.path.scriptId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefdataproductscriptsnamespacenamespacescriptScriptIdA5815697", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdDELETEApiPermissionAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductScriptsNamespaceNamespaceScriptScriptIdB34A4AB3": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteScript7A830C95", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/DELETE/data-product/scripts/namespace/*/script/*", + ], ], - "title": "DeleteDataProductScriptsNamespaceScriptResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdDELETEApiPermissionTestAdaDataProductServiceApiStackApiRestApiRefD78D41E8DELETEDataProductScriptsNamespaceNamespaceScriptScriptId232B8D7A": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteScript7A830C95", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/data-product/scripts/namespace/*/script/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", }, "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdGET64911C24": Object { "DependsOn": Array [ @@ -18668,11 +12563,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdGetDataProductScriptsNamespaceScriptResponseB9323CDF", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -18773,205 +12664,11 @@ Object { ], }, }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdGetDataProductScriptsNamespaceScriptResponseB9323CDF": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The script with the given id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Script": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", - }, - }, - "required": Array [ - "name", - "namespace", - "scriptId", - ], - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "ScriptSource": Object { - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - }, - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", - }, - }, - "required": Array [ - "name", - "namespace", - "scriptId", - ], - "title": "GetDataProductScriptsNamespaceScriptResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdOPTIONSB4B12B71": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -19104,11 +12801,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdPutDataProductScriptsNamespaceScriptResponse18D72510", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -19151,9 +12844,6 @@ Object { "Type": "AWS::ApiGateway::Method", }, "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdPutDataProductScriptsNamespaceScriptRequest87B8CD61": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdGetDataProductScriptsNamespaceScriptResponseB9323CDF", - ], "Properties": Object { "ContentType": "application/json", "Description": "Details about the new script", @@ -19254,206 +12944,9 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdPutDataProductScriptsNamespaceScriptResponse18D72510": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductscriptsnamespacenamespacescriptscriptIdPutDataProductScriptsNamespaceScriptRequest87B8CD61", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated script", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Script": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", - }, - }, - "required": Array [ - "name", - "namespace", - "scriptId", - ], - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "ScriptSource": Object { - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - }, - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "Description of the script", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "helperText": Object { - "description": "helper text for the script definition", - "type": "string", - }, - "inputSchema": Object { - "description": "input args definition", - }, - "name": Object { - "description": "Name of the script", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "source": Object { - "$ref": "#/definitions/ScriptSource", - "description": "The script content, supplied when creating a script and returned when retrieving an individual script", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "versionId": Object { - "description": "The version of the script", - "type": "string", - }, - }, - "required": Array [ - "name", - "namespace", - "scriptId", - ], - "title": "PutDataProductScriptsNamespaceScriptResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductscriptsvalidateOPTIONSC1123C3E": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -19528,11 +13021,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductscriptsvalidatePostDataProductScriptsValidateResponse80B1927F", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -19654,213 +13143,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefdataproductscriptsvalidatePostDataProductScriptsValidateResponse80B1927F": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductscriptsvalidatePostDataProductScriptsValidateRequestD558E965", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Report containing the vulnerabilities of a script after scanning", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ScriptVulnerabilityLevel": Object { - "description": "Bandit level enum", - "enum": Array [ - "LOW", - "MEDIUM", - "HIGH", - ], - "type": "string", - }, - "ScriptVulnerabilityReport": Object { - "description": "Bandit python vulnerability scan output", - "properties": Object { - "errors": Object { - "items": Object { - "type": "object", - }, - "type": "array", - }, - "generatedAt": Object { - "description": "Timestamp when results were generated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "metrics": Object { - "properties": Object { - "confidence": Object { - "properties": Object { - "HIGH": Object { - "type": "integer", - }, - "LOW": Object { - "type": "integer", - }, - "MEDIUM": Object { - "type": "integer", - }, - }, - "required": Array [ - "LOW", - "MEDIUM", - "HIGH", - ], - "type": "object", - }, - "loc": Object { - "type": "integer", - }, - "nosec": Object { - "type": "integer", - }, - "severity": Object { - "properties": Object { - "HIGH": Object { - "type": "integer", - }, - "LOW": Object { - "type": "integer", - }, - "MEDIUM": Object { - "type": "integer", - }, - }, - "required": Array [ - "LOW", - "MEDIUM", - "HIGH", - ], - "type": "object", - }, - "skippedTests": Object { - "type": "integer", - }, - }, - "required": Array [ - "confidence", - "severity", - "loc", - "nosec", - "skippedtests", - ], - "type": "object", - }, - "passed": Object { - "type": "boolean", - }, - "results": Object { - "items": Object { - "properties": Object { - "code": Object { - "type": "string", - }, - "columnOffset": Object { - "type": "integer", - }, - "cwe": Object { - "properties": Object { - "id": Object { - "type": "integer", - }, - "link": Object { - "type": "string", - }, - }, - "required": Array [ - "id", - "link", - ], - "type": "object", - }, - "filename": Object { - "type": "string", - }, - "issueConfidence": Object { - "$ref": "#/definitions/ScriptVulnerabilityLevel", - "description": "Bandit level enum", - }, - "issueSeverity": Object { - "$ref": "#/definitions/ScriptVulnerabilityLevel", - "description": "Bandit level enum", - }, - "issueText": Object { - "type": "string", - }, - "lineNumber": Object { - "type": "integer", - }, - "lineRange": Object { - "items": Object { - "type": "integer", - }, - "type": "array", - }, - "moreInfo": Object { - "type": "string", - }, - "testId": Object { - "type": "string", - }, - "testName": Object { - "type": "string", - }, - }, - "required": Array [ - "code", - "columnOffset", - "filename", - "issueConfidence", - "issueSeverity", - "issueText", - "cwe", - "lineNumber", - "lineRange", - "moreInfo", - "testId", - "testName", - ], - "type": "object", - }, - "type": "array", - }, - }, - "required": Array [ - "passed", - "errors", - "generatedAt", - "metrics", - "results", - ], - "type": "object", - }, - }, - "properties": Object { - "report": Object { - "$ref": "#/definitions/ScriptVulnerabilityReport", - "description": "Bandit python vulnerability scan output", - }, - "scriptSource": Object { - "description": "The script source that was validated", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptSource", - "report", - ], - "title": "PostDataProductScriptsValidateResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiValidateScriptHandler7D58337D": Object { "DependsOn": Array [ "ApiValidateScriptHandlerServiceRoleFE3F7BFE", diff --git a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/built-in-transformation-statck.test.ts.snap b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/built-in-transformation-statck.test.ts.snap index d72d60c..c721e96 100644 --- a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/built-in-transformation-statck.test.ts.snap +++ b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/built-in-transformation-statck.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-BuiltInTransformationStack) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-BuiltInTransformationStack) - Automated Data Analytics on AWS. Version v1.3.0", "Parameters": Object { "referencetoAdaDataProductServiceApiStackNestedStackApiStackNestedStackResourceC3A35847OutputsAdaDataProductServiceApiStackApiLambdaPutScript8681009BArn": Object { "Type": "String", @@ -25,7 +25,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", diff --git a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/index.test.ts.snap index 9e5e212..30a64c6 100644 --- a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-DataProductService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-DataProductService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaDataProductServiceApiStackNestedStackApiStackNestedStackResourceC3A35847OutputsAdaDataProductServiceApiStackApiLambdaEventBridgeUpdateDataProductE054F2A1Arn": Object { "Value": Object { @@ -234,7 +234,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -438,7 +438,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -498,7 +498,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -1014,7 +1014,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -1229,7 +1229,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { diff --git a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/schema-preview-stack.test.ts.snap b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/schema-preview-stack.test.ts.snap index 8a00a7f..21c1687 100644 --- a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/schema-preview-stack.test.ts.snap +++ b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/schema-preview-stack.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-SchemaPreview) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-SchemaPreview) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "ApiDataProductPreviewUrl95C4A115": Object { "Value": Object { @@ -825,6 +825,7 @@ Object { }, "ApiRestApiRefdataproductpreviewOPTIONS62613BC4": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -878,6 +879,7 @@ Object { }, "ApiRestApiRefdataproductpreviewdomainOPTIONS2E0071CE": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -919,6 +921,7 @@ Object { }, "ApiRestApiRefdataproductpreviewdomaindomainIdOPTIONS2D503ADD": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -972,6 +975,7 @@ Object { }, "ApiRestApiRefdataproductpreviewdomaindomainIddataproductOPTIONS369122F4": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1013,6 +1017,7 @@ Object { }, "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdOPTIONSFF13DD22": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1145,11 +1150,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdPostDataProductPreviewDomainDataProductResponseBDF8403A", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1645,9 +1646,11 @@ Object { "GOOGLE_STORAGE", "DYNAMODB", "CLOUDWATCH", + "REDSHIFT", "MYSQL5", "POSTGRESQL", "SQLSERVER", + "ORACLE", "CLOUDTRAIL", "MONGODB", ], @@ -1809,36 +1812,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdPostDataProductPreviewDomainDataProductResponseBDF8403A": Object { - "DependsOn": Array [ - "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdPostDataProductPreviewDomainDataProductRequest126AAE4A", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "An execution id for tracking the preview of a data product", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "previewId": Object { - "description": "The id of the data product preview", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "previewId", - ], - "title": "PostDataProductPreviewDomainDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdPreviewId56729D3A": Object { "Properties": Object { "ParentId": Object { @@ -1886,11 +1859,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdpreviewIdGetDataProductPreviewDomainDataProductResponse867CB336", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1994,253 +1963,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdpreviewIdGetDataProductPreviewDomainDataProductResponse867CB336": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The data product preview, or just its status if the preview is ongoing", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ApiError": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "cause": Object { - "type": "string", - }, - "details": Object { - "type": "string", - }, - "errorId": Object { - "type": "string", - }, - "message": Object { - "type": "string", - }, - "name": Object { - "type": "string", - }, - }, - "required": Array [ - "message", - ], - "title": "GenericError", - "type": "object", - }, - "DataProductPreviewIdentifier": Object { - "properties": Object { - "previewId": Object { - "description": "The id of the data product preview", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "previewId", - ], - "type": "object", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataSetPreview": Object { - "properties": Object { - "classification": Object { - "description": "The classification of the data stored for this dataset in s3 (if any)", - "type": "string", - }, - "data": Object { - "items": Object { - "type": "object", - }, - "type": "array", - }, - "metadata": Object { - "description": "Any metadata that may have been discovered by the preview", - "type": "object", - }, - "s3Path": Object { - "description": "The path to the data for this dataset in s3 (if any)", - "type": "string", - }, - "s3SamplePath": Object { - "description": "The path to the sample data for this dataset in s3 (if any)", - "type": "string", - }, - "schema": Object { - "$ref": "#/definitions/DataSetPreviewSchema", - }, - }, - "required": Array [ - "schema", - "data", - ], - "type": "object", - }, - "DataSetPreviewNamedSchema": Object { - "properties": Object { - "container": Object { - "$ref": "#/definitions/DataSetPreviewSchema", - }, - "name": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "name", - ], - "type": "object", - }, - "DataSetPreviewSchema": Object { - "properties": Object { - "dataType": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "elementType": Object { - "$ref": "#/definitions/DataSetPreviewSchema", - }, - "fields": Object { - "items": Object { - "$ref": "#/definitions/DataSetPreviewNamedSchema", - }, - "type": "array", - }, - }, - "required": Array [ - "dataType", - ], - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - }, - "properties": Object { - "durationMilliseconds": Object { - "description": "The time taken to complete the preview", - "type": "number", - }, - "error": Object { - "$ref": "#/definitions/ApiError", - }, - "initialDataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSetPreview", - }, - "description": "Data sets discovered from the source data, keyed by dataset id", - "type": "object", - }, - "previewId": Object { - "description": "The id of the data product preview", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "status": Object { - "description": "The status of the preview execution", - "enum": Array [ - "RUNNING", - "SUCCEEDED", - "FAILED", - "TIMED_OUT", - "ABORTED", - ], - "type": "string", - }, - "transformedDataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSetPreview", - }, - "description": "Data set previews after transforms have been applied, keyed by dataset id", - "type": "object", - }, - "transformsApplied": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - }, - "required": Array [ - "previewId", - "status", - ], - "title": "GetDataProductPreviewDomainDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefdataproductpreviewdomaindomainIddataproductdataProductIdpreviewIdOPTIONS2638608A": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -2324,7 +2049,7 @@ Object { ], ], }, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "MemorySize": 128, "Role": Object { "Fn::GetAtt": Array [ @@ -2332,7 +2057,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Timeout": 900, }, "Type": "AWS::Lambda::Function", @@ -3099,6 +2824,14 @@ Object { "Effect": "Allow", "Resource": "*", }, + Object { + "Action": Array [ + "redshift:GetClusterCredentials", + "redshift-serverless:GetCredentials", + ], + "Effect": "Allow", + "Resource": "*", + }, Object { "Action": "glue:*Connection*", "Effect": "Allow", diff --git a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/static-infrastructure-stack.test.ts.snap b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/static-infrastructure-stack.test.ts.snap index 5efe605..cfec088 100644 --- a/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/static-infrastructure-stack.test.ts.snap +++ b/source/packages/@ada/infra/src/services/data-product/stack/__snapshots__/static-infrastructure-stack.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-StaticInfrastructure) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-StaticInfrastructure) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaDataProductServiceStaticInfrastructureDataBucketD9C0AD53Arn": Object { "Value": Object { @@ -190,7 +190,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -1518,6 +1518,11 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, + "Environment": Object { + "Variables": Object { + "AWS_CA_BUNDLE": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", + }, + }, "Handler": "index.handler", "Layers": Array [ Object { @@ -4406,6 +4411,7 @@ Object { "Action": Array [ "ssm:GetParameter", "iam:PassRole", + "sts:AssumeRole", ], "Effect": "Allow", "Resource": Array [ @@ -9862,17 +9868,73 @@ Object { }, "Type": "AWS::IAM::Policy", }, - "ExecuteGovernedQueryStateMachineAthenaExecutionPolicy4FC26084": Object { + "ECSContainersRedshiftECSClusterRedshift296B57BB": Object { + "Properties": Object { + "ClusterSettings": Array [ + Object { + "Name": "containerInsights", + "Value": "enabled", + }, + ], + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::ECS::Cluster", + }, + "ECSContainersRedshiftECSContainerLogGroupRedshift0B30D902": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "KmsKeyId": Object { + "Fn::GetAtt": Array [ + "LogGroupEncryptionKmsKeyE595E4BA", + "Arn", + ], + }, + "RetentionInDays": 731, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "ECSContainersRedshiftECSExecutionRoleRedshift9D976AE1": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "ecs-tasks.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ECSContainersRedshiftECSExecutionRoleredshiftDefaultPolicyD2FF3A11": Object { "Metadata": Object { "cfn_nag": Object { "rules_to_suppress": Array [ Object { "id": "W12", - "reason": "Athena query access requires * resource", - }, - Object { - "id": "W76", - "reason": "SPCM expected to be high for query execution role since it interacts with many resources", + "reason": "* resource required to create log streams", }, ], }, @@ -9882,168 +9944,114 @@ Object { "Statement": Array [ Object { "Action": Array [ - "athena:StartQueryExecution", - "athena:StopQueryExecution", - "athena:GetQueryExecution", - "athena:GetQueryResults", + "logs:PutLogEvents", + "logs:CreateLogStream", ], "Effect": "Allow", "Resource": "*", }, Object { - "Action": Array [ - "glue:GetDatabase", - "glue:GetDatabases", - "glue:CreateTable", - "glue:DeleteTable", - "glue:BatchDeleteTable", - "glue:UpdateTable", - "glue:GetTable", - "glue:GetTables", - "glue:BatchCreatePartition", - "glue:CreatePartition", - "glue:DeletePartition", - "glue:BatchDeletePartition", - "glue:UpdatePartition", - "glue:GetPartition", - "glue:GetPartitions", - "glue:BatchGetPartition", - ], + "Action": "ecr:GetAuthorizationToken", "Effect": "Allow", "Resource": "*", }, Object { "Action": Array [ - "cloudwatch:PutMetricAlarm", - "cloudwatch:DescribeAlarms", - "cloudwatch:DeleteAlarms", + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", ], "Effect": "Allow", - "Resource": "*", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":ecr:ap-southeast-1:1111111111:repository/cdk-hnb659fds-container-assets-1111111111-ap-southeast-1", + ], + ], + }, }, Object { - "Action": "kms:Decrypt", + "Action": Array [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaDataProductServiceGlueEncryptionKey322DD43CArn", + "Fn::GetAtt": Array [ + "ECSContainersRedshiftECSContainerLogGroupRedshift0B30D902", + "Arn", + ], }, }, ], "Version": "2012-10-17", }, - "PolicyName": "ExecuteGovernedQueryStateMachineAthenaExecutionPolicy4FC26084", + "PolicyName": "ECSContainersRedshiftECSExecutionRoleredshiftDefaultPolicyD2FF3A11", "Roles": Array [ Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "/", - Object { - "Fn::Select": Array [ - 5, - Object { - "Fn::Split": Array [ - ":", - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", - }, - ], - }, - ], - }, - ], - }, - ], + "Ref": "ECSContainersRedshiftECSExecutionRoleRedshift9D976AE1", }, ], }, "Type": "AWS::IAM::Policy", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3": Object { - "DependsOn": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleDefaultPolicy2BD6045D", - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280", - ], + "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45": Object { "Properties": Object { - "Architectures": Array [ - "x86_64", - ], - "Code": Object { - "S3Bucket": "cdk-#####", - "S3Key": "cdkhash######.zip", - }, - "Description": "TypescriptFunction Ada/DataProductService/StaticInfrastructure/ExecuteGovernedQueryStateMachine/AthenaQueryExecutorGetCachedQuery of get-cached-query.ts", - "Environment": Object { - "Variables": Object { - "API_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - ".execute-api.ap-southeast-1.amazonaws.com/prod/", - ], - ], - }, - "API_WAF_ALLOW_RULE_SECRET": Object { - "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", - }, - "ATHENA_EXECUTE_QUERY_ROLE_ARN": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", - }, - "ATHENA_OUTPUT_BUCKET_NAME": Object { - "Ref": "DataBucket", - }, - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "CACHED_QUERY_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCachedQueryTableADA4A480Ref", - }, - "COUNTER_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", - }, - "INTERNAL_TOKEN_KMS_KEY": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", - }, - "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", - "LOCK_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + "ContainerDefinitions": Array [ + Object { + "Cpu": 512, + "Essential": true, + "Image": Object { + "Fn::Sub": "1111111111.dkr.ecr.ap-southeast-1.\${AWS::URLSuffix}/cdk-hnb659fds-container-assets-1111111111-ap-southeast-1:###hash64###", }, - "RELATIONSHIP_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + "LogConfiguration": Object { + "LogDriver": "awslogs", + "Options": Object { + "awslogs-group": Object { + "Ref": "ECSContainersRedshiftECSContainerLogGroupRedshift0B30D902", + }, + "awslogs-region": "ap-southeast-1", + "awslogs-stream-prefix": "ecs-redshift", + }, }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Ref": "referencetoAdaLayer6FB4FEF4Ref", + "MemoryReservation": 1024, + "Name": "ECSContainerDef-redshift", }, ], - "MemorySize": 1024, - "Role": Object { + "Cpu": "512", + "ExecutionRoleArn": Object { "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280", + "ECSContainersRedshiftECSExecutionRoleRedshift9D976AE1", "Arn", ], }, - "Runtime": "nodejs16.x", + "Family": "AdaDataProductServiceStaticInfrastructureECSContainersRedshiftECSTaskDefinitionredshift35D44CF2", + "Memory": "1024", + "NetworkMode": "awsvpc", + "RequiresCompatibilities": Array [ + "FARGATE", + ], "Tags": Array [ Object { "Key": "Application", "Value": "Ada", }, ], - "Timeout": 30, - "TracingConfig": Object { - "Mode": "Active", + "TaskRoleArn": Object { + "Fn::GetAtt": Array [ + "ECSContainersRedshiftRoleD20929A5", + "Arn", + ], }, }, - "Type": "AWS::Lambda::Function", + "Type": "AWS::ECS::TaskDefinition", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280": Object { + "ECSContainersRedshiftRoleD20929A5": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -10051,26 +10059,12 @@ Object { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": Object { - "Service": "lambda.amazonaws.com", + "Service": "ecs-tasks.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], "Tags": Array [ Object { "Key": "Application", @@ -10080,60 +10074,57 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleDefaultPolicy2BD6045D": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ + "ECSContainersRedshiftRoleDefaultPolicy54E1796C": Object { + "Metadata": Object { + "cfn_nag": Object { + "rules_to_suppress": Array [ Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", + "id": "W12", + "reason": "* resource required to create log streams", }, Object { - "Action": Array [ - "secretsmanager:GetSecretValue", - "secretsmanager:DescribeSecret", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", - }, + "id": "W76", + "reason": "SPCM expected to be high for ECS Task execution role", }, + ], + }, + }, + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ Object { "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", + "s3:AbortMultipartUpload", + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + "s3:ListBucketMultipartUploads", + "s3:PutObject", ], "Effect": "Allow", "Resource": Array [ Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "DataBucket", + "Arn", + ], + }, + "/*", + ], + ], }, Object { - "Ref": "AWS::NoValue", + "Fn::GetAtt": Array [ + "DataBucket", + "Arn", + ], }, ], }, - Object { - "Action": "kms:Decrypt", - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", - }, - }, Object { "Action": "secretsManager:GetSecretValue", "Effect": "Allow", @@ -10145,24 +10136,38 @@ Object { Object { "Ref": "AWS::Partition", }, - ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", + ":secretsmanager:", + Object { + "Ref": "AWS::Region", + }, + ":", + Object { + "Ref": "AWS::AccountId", + }, + ":secret:DPSecrets*", ], ], }, }, Object { "Action": Array [ + "kms:GenerateDataKey", "kms:Decrypt", - "kms:DescribeKey", "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyBucketKeyDataBucket51FCC54DArn", }, }, + Object { + "Action": Array [ + "redshift:GetClusterCredentials", + "redshift-serverless:GetCredentials", + ], + "Effect": "Allow", + "Resource": "*", + }, Object { "Action": Array [ "dynamodb:BatchGetItem", @@ -10181,129 +10186,140 @@ Object { "Effect": "Allow", "Resource": Array [ Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", + "Fn::GetAtt": Array [ + "LastUpdatedDetail", + "Arn", + ], }, Object { "Ref": "AWS::NoValue", }, ], }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ECSContainersRedshiftRoleDefaultPolicy54E1796C", + "Roles": Array [ + Object { + "Ref": "ECSContainersRedshiftRoleD20929A5", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ExecuteGovernedQueryStateMachineAthenaExecutionPolicy4FC26084": Object { + "Metadata": Object { + "cfn_nag": Object { + "rules_to_suppress": Array [ + Object { + "id": "W12", + "reason": "Athena query access requires * resource", + }, + Object { + "id": "W76", + "reason": "SPCM expected to be high for query execution role since it interacts with many resources", + }, + ], + }, + }, + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ Object { "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", + "athena:StartQueryExecution", + "athena:StopQueryExecution", + "athena:GetQueryExecution", + "athena:GetQueryResults", ], "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", - }, + "Resource": "*", }, Object { "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", + "glue:GetDatabase", + "glue:GetDatabases", + "glue:CreateTable", + "glue:DeleteTable", + "glue:BatchDeleteTable", + "glue:UpdateTable", + "glue:GetTable", + "glue:GetTables", + "glue:BatchCreatePartition", + "glue:CreatePartition", + "glue:DeletePartition", + "glue:BatchDeletePartition", + "glue:UpdatePartition", + "glue:GetPartition", + "glue:GetPartitions", + "glue:BatchGetPartition", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": "*", }, Object { "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", + "cloudwatch:PutMetricAlarm", + "cloudwatch:DescribeAlarms", + "cloudwatch:DeleteAlarms", ], "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableCachedQueryTableFD9290A0Arn", - }, + "Resource": "*", }, Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "Action": "kms:Decrypt", "Effect": "Allow", - "Resource": Array [ - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCachedQueryTableADA4A480Arn", - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": Object { + "Ref": "referencetoAdaDataProductServiceGlueEncryptionKey322DD43CArn", + }, }, ], "Version": "2012-10-17", }, - "PolicyName": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleDefaultPolicy2BD6045D", + "PolicyName": "ExecuteGovernedQueryStateMachineAthenaExecutionPolicy4FC26084", "Roles": Array [ Object { - "Ref": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280", + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "/", + Object { + "Fn::Select": Array [ + 5, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + }, + ], + }, + ], + }, + ], + }, + ], }, ], }, "Type": "AWS::IAM::Policy", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorLogs835F0201": Object { - "DeletionPolicy": "Delete", + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3": Object { + "DependsOn": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleDefaultPolicy2BD6045D", + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280", + ], "Properties": Object { - "KmsKeyId": Object { - "Fn::GetAtt": Array [ - "LogGroupEncryptionKmsKeyE595E4BA", - "Arn", - ], - }, - "LogGroupName": "/aws/vendedlogs/states/ada/ExecuteGovernedQueryStateMachineStateMachineLogs/loggroup-######", - "RetentionInDays": 731, - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330": Object { - "DependsOn": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRoleDefaultPolicy8525FF5B", - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1", - ], - "Properties": Object { - "Architectures": Array [ - "x86_64", + "Architectures": Array [ + "x86_64", ], "Code": Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/DataProductService/StaticInfrastructure/ExecuteGovernedQueryStateMachine/AthenaQueryExecutorPutCachedQuery of put-cached-query.ts", + "Description": "TypescriptFunction Ada/DataProductService/StaticInfrastructure/ExecuteGovernedQueryStateMachine/AthenaQueryExecutorGetCachedQuery of get-cached-query.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -10355,7 +10371,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1", + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280", "Arn", ], }, @@ -10373,7 +10389,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1": Object { + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -10410,7 +10426,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRoleDefaultPolicy8525FF5B": Object { + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleDefaultPolicy2BD6045D": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -10560,9 +10576,6 @@ Object { "Action": Array [ "kms:Decrypt", "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", ], "Effect": "Allow", "Resource": Object { @@ -10578,10 +10591,6 @@ Object { "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", "dynamodb:DescribeTable", ], "Effect": "Allow", @@ -10597,18 +10606,40 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRoleDefaultPolicy8525FF5B", + "PolicyName": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleDefaultPolicy2BD6045D", "Roles": Array [ Object { - "Ref": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1", + "Ref": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQueryServiceRoleCC766280", }, ], }, "Type": "AWS::IAM::Policy", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E": Object { + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorLogs835F0201": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "KmsKeyId": Object { + "Fn::GetAtt": Array [ + "LogGroupEncryptionKmsKeyE595E4BA", + "Arn", + ], + }, + "LogGroupName": "/aws/vendedlogs/states/ada/ExecuteGovernedQueryStateMachineStateMachineLogs/loggroup-######", + "RetentionInDays": 731, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330": Object { "DependsOn": Array [ - "ExecuteGovernedQueryStateMachineQueryExecutionStateMachineExecuteAthenaQueryLambdaRolePolicy4CB17413", + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRoleDefaultPolicy8525FF5B", + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1", ], "Properties": Object { "Architectures": Array [ @@ -10618,7 +10649,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/DataProductService/StaticInfrastructure/ExecuteGovernedQueryStateMachine/AthenaQueryExecutorStartAthenaQueryExecution of start-athena-query-execution.ts", + "Description": "TypescriptFunction Ada/DataProductService/StaticInfrastructure/ExecuteGovernedQueryStateMachine/AthenaQueryExecutorPutCachedQuery of put-cached-query.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -10669,7 +10700,10 @@ Object { ], "MemorySize": 1024, "Role": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1", + "Arn", + ], }, "Runtime": "nodejs16.x", "Tags": Array [ @@ -10685,204 +10719,873 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineC6570B18": Object { - "DeletionPolicy": "Delete", - "DependsOn": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleDefaultPolicy7733C5C3", - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1", - ], + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1": Object { "Properties": Object { - "DefinitionString": Object { - "Fn::Join": Array [ - "", - Array [ - "{\\"StartAt\\":\\"GetCachedQuery\\",\\"States\\":{\\"GetCachedQuery\\":{\\"Next\\":\\"IsItemInCache?\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"", - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3", - "Arn", - ], - }, - "\\",\\"Parameters\\":{\\"Payload.$\\":\\"$\\"}},\\"IsItemInCache?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.expired\\",\\"BooleanEquals\\":false,\\"Next\\":\\"NotifySuccess\\"}],\\"Default\\":\\"RunQueryOnAthena\\"},\\"RunQueryOnAthena\\":{\\"Next\\":\\"Wait1Second\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"Next\\":\\"NotifyError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"", - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E", - "Arn", - ], - }, - "\\",\\"Parameters\\":{\\"Payload.$\\":\\"$\\"}},\\"Wait1Second\\":{\\"Type\\":\\"Wait\\",\\"Seconds\\":1,\\"Next\\":\\"GetAthenaQueryStatus\\"},\\"GetAthenaQueryStatus\\":{\\"Next\\":\\"IsInFinalState?\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"Next\\":\\"NotifyError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.athenaStatus\\",\\"Resource\\":\\"arn:", - Object { - "Ref": "AWS::Partition", - }, - ":states:::athena:getQueryExecution\\",\\"Parameters\\":{\\"QueryExecutionId.$\\":\\"$.queryExecutionId\\"}},\\"IsInFinalState?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.athenaStatus.QueryExecution.Status.State\\",\\"StringEquals\\":\\"SUCCEEDED\\",\\"Next\\":\\"WriteInCache\\"},{\\"Variable\\":\\"$.athenaStatus.QueryExecution.Status.State\\",\\"StringEquals\\":\\"FAILED\\",\\"Next\\":\\"NotifyError\\"},{\\"Variable\\":\\"$.athenaStatus.QueryExecution.Status.State\\",\\"StringEquals\\":\\"CANCELLED\\",\\"Next\\":\\"NotifyError\\"}],\\"Default\\":\\"Wait1Second\\"},\\"WriteInCache\\":{\\"Next\\":\\"NotifySuccess\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"", - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330", - "Arn", - ], - }, - "\\",\\"Parameters\\":{\\"Payload.$\\":\\"$\\"}},\\"NotifySuccess\\":{\\"Type\\":\\"Pass\\",\\"End\\":true},\\"NotifyError\\":{\\"Type\\":\\"Pass\\",\\"End\\":true}}}", - ], - ], - }, - "LoggingConfiguration": Object { - "Destinations": Array [ + "AssumeRolePolicyDocument": Object { + "Statement": Array [ Object { - "CloudWatchLogsLogGroup": Object { - "LogGroupArn": Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorLogs835F0201", - "Arn", - ], - }, + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", }, }, ], - "Level": "ERROR", - }, - "RoleArn": Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1", - "Arn", - ], + "Version": "2012-10-17", }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], "Tags": Array [ Object { "Key": "Application", "Value": "Ada", }, ], - "TracingConfiguration": Object { - "Enabled": true, - }, }, - "Type": "AWS::StepFunctions::StateMachine", - "UpdateReplacePolicy": "Delete", + "Type": "AWS::IAM::Role", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleDefaultPolicy7733C5C3": Object { + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRoleDefaultPolicy8525FF5B": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { "Action": Array [ - "logs:CreateLogDelivery", - "logs:GetLogDelivery", - "logs:UpdateLogDelivery", - "logs:DeleteLogDelivery", - "logs:ListLogDeliveries", - "logs:PutResourcePolicy", - "logs:DescribeResourcePolicies", - "logs:DescribeLogGroups", + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", ], "Effect": "Allow", "Resource": "*", }, Object { "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - "xray:GetSamplingRules", - "xray:GetSamplingTargets", + "secretsmanager:GetSecretValue", + "secretsmanager:DescribeSecret", ], "Effect": "Allow", - "Resource": "*", + "Resource": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, }, Object { - "Action": "lambda:InvokeFunction", + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], "Effect": "Allow", "Resource": Array [ Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3", - "Arn", - ], + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", }, Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3", - "Arn", - ], - }, - ":*", - ], - ], + "Ref": "AWS::NoValue", }, ], }, Object { - "Action": "lambda:InvokeFunction", + "Action": "kms:Decrypt", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E", - "Arn", - ], - }, - ":*", - ], - ], - }, - ], + "Resource": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", + }, }, Object { - "Action": "athena:getQueryExecution", + "Action": "secretsManager:GetSecretValue", "Effect": "Allow", - "Resource": "*", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", + ], + ], + }, }, Object { - "Action": "lambda:InvokeFunction", + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330", - "Arn", - ], - }, + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableCachedQueryTableFD9290A0Arn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCachedQueryTableADA4A480Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRoleDefaultPolicy8525FF5B", + "Roles": Array [ + Object { + "Ref": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQueryServiceRole1F29D3E1", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E": Object { + "DependsOn": Array [ + "ExecuteGovernedQueryStateMachineQueryExecutionStateMachineExecuteAthenaQueryLambdaRolePolicy4CB17413", + ], + "Properties": Object { + "Architectures": Array [ + "x86_64", + ], + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", + }, + "Description": "TypescriptFunction Ada/DataProductService/StaticInfrastructure/ExecuteGovernedQueryStateMachine/AthenaQueryExecutorStartAthenaQueryExecution of start-athena-query-execution.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], + ], + }, + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + "ATHENA_EXECUTE_QUERY_ROLE_ARN": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + }, + "ATHENA_OUTPUT_BUCKET_NAME": Object { + "Ref": "DataBucket", + }, + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "CACHED_QUERY_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCachedQueryTableADA4A480Ref", + }, + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", + }, + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", + }, + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + }, + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + }, + }, + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + }, + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", + }, + }, + "Type": "AWS::Lambda::Function", + }, + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineC6570B18": Object { + "DeletionPolicy": "Delete", + "DependsOn": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleDefaultPolicy7733C5C3", + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1", + ], + "Properties": Object { + "DefinitionString": Object { + "Fn::Join": Array [ + "", + Array [ + "{\\"StartAt\\":\\"GetCachedQuery\\",\\"States\\":{\\"GetCachedQuery\\":{\\"Next\\":\\"IsItemInCache?\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"", + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3", + "Arn", + ], + }, + "\\",\\"Parameters\\":{\\"Payload.$\\":\\"$\\"}},\\"IsItemInCache?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.expired\\",\\"BooleanEquals\\":false,\\"Next\\":\\"NotifySuccess\\"}],\\"Default\\":\\"RunQueryOnAthena\\"},\\"RunQueryOnAthena\\":{\\"Next\\":\\"Wait1Second\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"Next\\":\\"NotifyError\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"", + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E", + "Arn", + ], + }, + "\\",\\"Parameters\\":{\\"Payload.$\\":\\"$\\"}},\\"Wait1Second\\":{\\"Type\\":\\"Wait\\",\\"Seconds\\":1,\\"Next\\":\\"GetAthenaQueryStatus\\"},\\"GetAthenaQueryStatus\\":{\\"Next\\":\\"IsInFinalState?\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"Next\\":\\"NotifyError\\"}],\\"Type\\":\\"Task\\",\\"ResultPath\\":\\"$.athenaStatus\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::athena:getQueryExecution\\",\\"Parameters\\":{\\"QueryExecutionId.$\\":\\"$.queryExecutionId\\"}},\\"IsInFinalState?\\":{\\"Type\\":\\"Choice\\",\\"Choices\\":[{\\"Variable\\":\\"$.athenaStatus.QueryExecution.Status.State\\",\\"StringEquals\\":\\"SUCCEEDED\\",\\"Next\\":\\"WriteInCache\\"},{\\"Variable\\":\\"$.athenaStatus.QueryExecution.Status.State\\",\\"StringEquals\\":\\"FAILED\\",\\"Next\\":\\"NotifyError\\"},{\\"Variable\\":\\"$.athenaStatus.QueryExecution.Status.State\\",\\"StringEquals\\":\\"CANCELLED\\",\\"Next\\":\\"NotifyError\\"}],\\"Default\\":\\"Wait1Second\\"},\\"WriteInCache\\":{\\"Next\\":\\"NotifySuccess\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"", + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330", + "Arn", + ], + }, + "\\",\\"Parameters\\":{\\"Payload.$\\":\\"$\\"}},\\"NotifySuccess\\":{\\"Type\\":\\"Pass\\",\\"End\\":true},\\"NotifyError\\":{\\"Type\\":\\"Pass\\",\\"End\\":true}}}", + ], + ], + }, + "LoggingConfiguration": Object { + "Destinations": Array [ + Object { + "CloudWatchLogsLogGroup": Object { + "LogGroupArn": Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorLogs835F0201", + "Arn", + ], + }, + }, + }, + ], + "Level": "ERROR", + }, + "RoleArn": Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1", + "Arn", + ], + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "TracingConfiguration": Object { + "Enabled": true, + }, + }, + "Type": "AWS::StepFunctions::StateMachine", + "UpdateReplacePolicy": "Delete", + }, + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleDefaultPolicy7733C5C3": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "logs:CreateLogDelivery", + "logs:GetLogDelivery", + "logs:UpdateLogDelivery", + "logs:DeleteLogDelivery", + "logs:ListLogDeliveries", + "logs:PutResourcePolicy", + "logs:DescribeResourcePolicies", + "logs:DescribeLogGroups", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + "xray:GetSamplingRules", + "xray:GetSamplingTargets", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorGetCachedQuery41A955B3", + "Arn", + ], + }, + ":*", + ], + ], + }, + ], + }, + Object { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStartAthenaQueryExecutionEA0E790E", + "Arn", + ], + }, + ":*", + ], + ], + }, + ], + }, + Object { + "Action": "athena:getQueryExecution", + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330", + "Arn", + ], + }, + ":*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleDefaultPolicy7733C5C3", + "Roles": Array [ + Object { + "Ref": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "states.ap-southeast-1.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ExecuteGovernedQueryStateMachineQueryExecutionStateMachineExecuteAthenaQueryLambdaRolePolicy4CB17413": Object { + "Metadata": Object { + "cfn_nag": Object { + "rules_to_suppress": Array [ + Object { + "id": "W12", + "reason": "Athena query access requires * resource", + }, + Object { + "id": "W76", + "reason": "SPCM expected to be high for query execution role since it interacts with many resources", + }, + ], + }, + }, + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "kms:Decrypt", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaDataProductServiceGlueEncryptionKey322DD43CArn", + }, + }, + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "secretsmanager:GetSecretValue", + "secretsmanager:DescribeSecret", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": "kms:Decrypt", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", + }, + }, + Object { + "Action": "secretsManager:GetSecretValue", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", + ], + ], + }, + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "DataBucket", + "Arn", + ], + }, Object { "Fn::Join": Array [ "", Array [ Object { - "Fn::GetAtt": Array [ - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorPutCachedQuery58B2E330", - "Arn", + "Fn::GetAtt": Array [ + "DataBucket", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyBucketKeyDataBucket51FCC54DArn", + }, + }, + Object { + "Action": Array [ + "sts:AssumeRole", + "sts:TagSession", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ExecuteGovernedQueryStateMachineQueryExecutionStateMachineExecuteAthenaQueryLambdaRolePolicy4CB17413", + "Roles": Array [ + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "/", + Object { + "Fn::Select": Array [ + 5, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + }, ], }, - ":*", ], + }, + ], + }, + ], + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "GAImportDataStateMachineBA5D539B": Object { + "DeletionPolicy": "Delete", + "DependsOn": Array [ + "GAImportDataStateMachineRoleDefaultPolicyA7B49870", + "GAImportDataStateMachineRole9EE0538A", + ], + "Properties": Object { + "DefinitionString": Object { + "Fn::Join": Array [ + "", + Array [ + "{\\"StartAt\\":\\"RunECSImportTask\\",\\"States\\":{\\"RunECSImportTask\\":{\\"Next\\":\\"ECSTaskSucceeded\\",\\"Catch\\":[{\\"ErrorEquals\\":[\\"States.ALL\\"],\\"Next\\":\\"ECSTaskFailed\\"}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", + Object { + "Ref": "AWS::Partition", + }, + ":states:::ecs:runTask.sync\\",\\"Parameters\\":{\\"PropagateTags\\":\\"TASK_DEFINITION\\",\\"Cluster\\":\\"", + Object { + "Fn::GetAtt": Array [ + "ECSContainersGoogleAnalyticsECSClusterGoogleAnalytics9381E111", + "Arn", + ], + }, + "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersGoogleAnalyticsECSTaskDefinitiongoogleanalyticsD461B0E9\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", + Object { + "Ref": "DataIngressVpcDataIngressVPCDataIngressPrivateWithNatSubnet1Subnet50E70DA3", + }, + "\\",\\"", + Object { + "Ref": "DataIngressVpcDataIngressVPCDataIngressPrivateWithNatSubnet2Subnet9A761164", + }, + "\\"],\\"SecurityGroups\\":[\\"", + Object { + "Fn::GetAtt": Array [ + "DataIngressVpcECSSecurityGroup61BDCCBA", + "GroupId", + ], + }, + "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-google-analytics\\",\\"Environment\\":[{\\"Name\\":\\"CLIENT_EMAIL\\",\\"Value.$\\":\\"$.clientEmail\\"},{\\"Name\\":\\"CLIENT_ID\\",\\"Value.$\\":\\"$.clientId\\"},{\\"Name\\":\\"PRIVATE_KEY_ID\\",\\"Value.$\\":\\"$.privateKeyId\\"},{\\"Name\\":\\"PRIVATE_KEY_SECRET\\",\\"Value.$\\":\\"$.privateKeySecretName\\"},{\\"Name\\":\\"PROJECT_ID\\",\\"Value.$\\":\\"$.projectId\\"},{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"VIEW_ID\\",\\"Value.$\\":\\"$.viewId\\"},{\\"Name\\":\\"SINCE\\",\\"Value.$\\":\\"$.since\\"},{\\"Name\\":\\"UNTIL\\",\\"Value.$\\":\\"$.until\\"},{\\"Name\\":\\"DIMENSIONS\\",\\"Value.$\\":\\"$.dimensions\\"},{\\"Name\\":\\"METRICS\\",\\"Value.$\\":\\"$.metrics\\"},{\\"Name\\":\\"TRIGGER_TYPE\\",\\"Value.$\\":\\"$.triggerType\\"},{\\"Name\\":\\"SCHEDULE_RATE\\",\\"Value.$\\":\\"$.scheduleRate\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", + ], + ], + }, + "LoggingConfiguration": Object { + "Destinations": Array [ + Object { + "CloudWatchLogsLogGroup": Object { + "LogGroupArn": Object { + "Fn::GetAtt": Array [ + "GAImportDataStateMachineStateMachineLogs7C6A4AA3", + "Arn", ], }, - ], + }, }, ], - "Version": "2012-10-17", + "Level": "ERROR", }, - "PolicyName": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleDefaultPolicy7733C5C3", - "Roles": Array [ + "RoleArn": Object { + "Fn::GetAtt": Array [ + "GAImportDataStateMachineRole9EE0538A", + "Arn", + ], + }, + "Tags": Array [ Object { - "Ref": "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1", + "Key": "Application", + "Value": "Ada", }, ], + "TracingConfiguration": Object { + "Enabled": true, + }, }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::StepFunctions::StateMachine", + "UpdateReplacePolicy": "Delete", }, - "ExecuteGovernedQueryStateMachineAthenaQueryExecutorStateMachineRoleF7B236D1": Object { + "GAImportDataStateMachineRole9EE0538A": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -10905,83 +11608,36 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ExecuteGovernedQueryStateMachineQueryExecutionStateMachineExecuteAthenaQueryLambdaRolePolicy4CB17413": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Athena query access requires * resource", - }, - Object { - "id": "W76", - "reason": "SPCM expected to be high for query execution role since it interacts with many resources", - }, - ], - }, - }, + "GAImportDataStateMachineRoleDefaultPolicyA7B49870": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ - Object { - "Action": "kms:Decrypt", - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaDataProductServiceGlueEncryptionKey322DD43CArn", - }, - }, Object { "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", + "logs:CreateLogDelivery", + "logs:GetLogDelivery", + "logs:UpdateLogDelivery", + "logs:DeleteLogDelivery", + "logs:ListLogDeliveries", + "logs:PutResourcePolicy", + "logs:DescribeResourcePolicies", + "logs:DescribeLogGroups", ], "Effect": "Allow", "Resource": "*", }, Object { "Action": Array [ - "secretsmanager:GetSecretValue", - "secretsmanager:DescribeSecret", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", - }, - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", - }, - Object { - "Ref": "AWS::NoValue", - }, + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + "xray:GetSamplingRules", + "xray:GetSamplingTargets", ], - }, - Object { - "Action": "kms:Decrypt", "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", - }, + "Resource": "*", }, Object { - "Action": "secretsManager:GetSecretValue", + "Action": "ecs:RunTask", "Effect": "Allow", "Resource": Object { "Fn::Join": Array [ @@ -10989,186 +11645,196 @@ Object { Array [ "arn:", Object { - "Ref": "AWS::Partition", + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + }, + ], + }, + ], + }, + ":", + Object { + "Fn::Select": Array [ + 2, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + }, + ], + }, + ], + }, + ":", + Object { + "Fn::Select": Array [ + 3, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + }, + ], + }, + ], + }, + ":", + Object { + "Fn::Select": Array [ + 4, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + }, + ], + }, + ], + }, + ":", + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "/", + Object { + "Fn::Select": Array [ + 5, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + }, + ], + }, + ], + }, + ], + }, + ], + }, + "/", + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "/", + Object { + "Fn::Select": Array [ + 5, + Object { + "Fn::Split": Array [ + ":", + Object { + "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + }, + ], + }, + ], + }, + ], + }, + ], }, - ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", ], ], }, }, Object { "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", - }, - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", - }, - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", + "ecs:StopTask", + "ecs:DescribeTasks", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": "*", }, Object { - "Action": Array [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], + "Action": "iam:PassRole", "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DataBucket", + "ECSContainersGoogleAnalyticsRole6E74F345", "Arn", ], }, Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "DataBucket", - "Arn", - ], - }, - "/*", - ], + "Fn::GetAtt": Array [ + "ECSContainersGoogleAnalyticsECSExecutionRoleGoogleAnalytics0813D8D7", + "Arn", ], }, ], }, Object { "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyBucketKeyDataBucket51FCC54DArn", - }, - }, - Object { - "Action": Array [ - "sts:AssumeRole", - "sts:TagSession", + "events:PutTargets", + "events:PutRule", + "events:DescribeRule", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":events:ap-southeast-1:1111111111:rule/StepFunctionsGetEventsForECSTaskRule", + ], + ], }, }, ], "Version": "2012-10-17", }, - "PolicyName": "ExecuteGovernedQueryStateMachineQueryExecutionStateMachineExecuteAthenaQueryLambdaRolePolicy4CB17413", + "PolicyName": "GAImportDataStateMachineRoleDefaultPolicyA7B49870", "Roles": Array [ Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "/", - Object { - "Fn::Select": Array [ - 5, - Object { - "Fn::Split": Array [ - ":", - Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackExecuteAthenaQueryLambdaRole106600ADArn", - }, - ], - }, - ], - }, - ], - }, - ], + "Ref": "GAImportDataStateMachineRole9EE0538A", }, ], }, "Type": "AWS::IAM::Policy", }, - "GAImportDataStateMachineBA5D539B": Object { + "GAImportDataStateMachineStateMachineLogs7C6A4AA3": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "KmsKeyId": Object { + "Fn::GetAtt": Array [ + "LogGroupEncryptionKmsKeyE595E4BA", + "Arn", + ], + }, + "LogGroupName": "/aws/vendedlogs/states/ada/GAImportDataStateMachineStateMachineLogs/loggroup-######", + "RetentionInDays": 731, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "GCBigQueryImportDataStateMachineA46C9770": Object { "DeletionPolicy": "Delete", "DependsOn": Array [ - "GAImportDataStateMachineRoleDefaultPolicyA7B49870", - "GAImportDataStateMachineRole9EE0538A", + "GCBigQueryImportDataStateMachineRoleDefaultPolicy47F3014C", + "GCBigQueryImportDataStateMachineRole118D47DA", ], "Properties": Object { "DefinitionString": Object { @@ -11182,11 +11848,11 @@ Object { ":states:::ecs:runTask.sync\\",\\"Parameters\\":{\\"PropagateTags\\":\\"TASK_DEFINITION\\",\\"Cluster\\":\\"", Object { "Fn::GetAtt": Array [ - "ECSContainersGoogleAnalyticsECSClusterGoogleAnalytics9381E111", + "ECSContainersGCPBigQueryECSClusterGcpBigQueryF6D8B0BC", "Arn", ], }, - "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersGoogleAnalyticsECSTaskDefinitiongoogleanalyticsD461B0E9\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", + "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersGCPBigQueryECSTaskDefinitiongcpbigquery3D080A68\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", Object { "Ref": "DataIngressVpcDataIngressVPCDataIngressPrivateWithNatSubnet1Subnet50E70DA3", }, @@ -11201,7 +11867,7 @@ Object { "GroupId", ], }, - "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-google-analytics\\",\\"Environment\\":[{\\"Name\\":\\"CLIENT_EMAIL\\",\\"Value.$\\":\\"$.clientEmail\\"},{\\"Name\\":\\"CLIENT_ID\\",\\"Value.$\\":\\"$.clientId\\"},{\\"Name\\":\\"PRIVATE_KEY_ID\\",\\"Value.$\\":\\"$.privateKeyId\\"},{\\"Name\\":\\"PRIVATE_KEY_SECRET\\",\\"Value.$\\":\\"$.privateKeySecretName\\"},{\\"Name\\":\\"PROJECT_ID\\",\\"Value.$\\":\\"$.projectId\\"},{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"VIEW_ID\\",\\"Value.$\\":\\"$.viewId\\"},{\\"Name\\":\\"SINCE\\",\\"Value.$\\":\\"$.since\\"},{\\"Name\\":\\"UNTIL\\",\\"Value.$\\":\\"$.until\\"},{\\"Name\\":\\"DIMENSIONS\\",\\"Value.$\\":\\"$.dimensions\\"},{\\"Name\\":\\"METRICS\\",\\"Value.$\\":\\"$.metrics\\"},{\\"Name\\":\\"TRIGGER_TYPE\\",\\"Value.$\\":\\"$.triggerType\\"},{\\"Name\\":\\"SCHEDULE_RATE\\",\\"Value.$\\":\\"$.scheduleRate\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", + "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-gcp-big-query\\",\\"Environment\\":[{\\"Name\\":\\"CLIENT_EMAIL\\",\\"Value.$\\":\\"$.clientEmail\\"},{\\"Name\\":\\"CLIENT_ID\\",\\"Value.$\\":\\"$.clientId\\"},{\\"Name\\":\\"PRIVATE_KEY_ID\\",\\"Value.$\\":\\"$.privateKeyId\\"},{\\"Name\\":\\"PRIVATE_KEY_SECRET\\",\\"Value.$\\":\\"$.privateKeySecretName\\"},{\\"Name\\":\\"PROJECT_ID\\",\\"Value.$\\":\\"$.projectId\\"},{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"QUERY\\",\\"Value.$\\":\\"$.query\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", ], ], }, @@ -11211,7 +11877,7 @@ Object { "CloudWatchLogsLogGroup": Object { "LogGroupArn": Object { "Fn::GetAtt": Array [ - "GAImportDataStateMachineStateMachineLogs7C6A4AA3", + "GCBigQueryImportDataStateMachineStateMachineLogs247758BC", "Arn", ], }, @@ -11222,7 +11888,7 @@ Object { }, "RoleArn": Object { "Fn::GetAtt": Array [ - "GAImportDataStateMachineRole9EE0538A", + "GCBigQueryImportDataStateMachineRole118D47DA", "Arn", ], }, @@ -11239,7 +11905,7 @@ Object { "Type": "AWS::StepFunctions::StateMachine", "UpdateReplacePolicy": "Delete", }, - "GAImportDataStateMachineRole9EE0538A": Object { + "GCBigQueryImportDataStateMachineRole118D47DA": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -11262,7 +11928,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "GAImportDataStateMachineRoleDefaultPolicyA7B49870": Object { + "GCBigQueryImportDataStateMachineRoleDefaultPolicy47F3014C": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -11305,7 +11971,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", }, ], }, @@ -11319,7 +11985,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", }, ], }, @@ -11333,7 +11999,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", }, ], }, @@ -11347,7 +12013,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", }, ], }, @@ -11367,7 +12033,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", }, ], }, @@ -11391,7 +12057,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGoogleAnalyticsECSTaskDefinitionGoogleAnalytics92B07651", + "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", }, ], }, @@ -11419,13 +12085,13 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "ECSContainersGoogleAnalyticsRole6E74F345", + "ECSContainersGCPBigQueryRole46A6C643", "Arn", ], }, Object { "Fn::GetAtt": Array [ - "ECSContainersGoogleAnalyticsECSExecutionRoleGoogleAnalytics0813D8D7", + "ECSContainersGCPBigQueryECSExecutionRoleGcpBigQuery403267BD", "Arn", ], }, @@ -11454,16 +12120,16 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "GAImportDataStateMachineRoleDefaultPolicyA7B49870", + "PolicyName": "GCBigQueryImportDataStateMachineRoleDefaultPolicy47F3014C", "Roles": Array [ Object { - "Ref": "GAImportDataStateMachineRole9EE0538A", + "Ref": "GCBigQueryImportDataStateMachineRole118D47DA", }, ], }, "Type": "AWS::IAM::Policy", }, - "GAImportDataStateMachineStateMachineLogs7C6A4AA3": Object { + "GCBigQueryImportDataStateMachineStateMachineLogs247758BC": Object { "DeletionPolicy": "Delete", "Properties": Object { "KmsKeyId": Object { @@ -11472,7 +12138,7 @@ Object { "Arn", ], }, - "LogGroupName": "/aws/vendedlogs/states/ada/GAImportDataStateMachineStateMachineLogs/loggroup-######", + "LogGroupName": "/aws/vendedlogs/states/ada/GCBigQueryImportDataStateMachineStateMachineLogs/loggroup-######", "RetentionInDays": 731, "Tags": Array [ Object { @@ -11484,11 +12150,11 @@ Object { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", }, - "GCBigQueryImportDataStateMachineA46C9770": Object { + "GCPImportDataStateMachine193D1733": Object { "DeletionPolicy": "Delete", "DependsOn": Array [ - "GCBigQueryImportDataStateMachineRoleDefaultPolicy47F3014C", - "GCBigQueryImportDataStateMachineRole118D47DA", + "GCPImportDataStateMachineRoleDefaultPolicyBFDD71A5", + "GCPImportDataStateMachineRoleF825A342", ], "Properties": Object { "DefinitionString": Object { @@ -11502,11 +12168,11 @@ Object { ":states:::ecs:runTask.sync\\",\\"Parameters\\":{\\"PropagateTags\\":\\"TASK_DEFINITION\\",\\"Cluster\\":\\"", Object { "Fn::GetAtt": Array [ - "ECSContainersGCPBigQueryECSClusterGcpBigQueryF6D8B0BC", + "ECSContainersGCPStorageECSClusterGcpStorageB2D8638A", "Arn", ], }, - "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersGCPBigQueryECSTaskDefinitiongcpbigquery3D080A68\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", + "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersGCPStorageECSTaskDefinitiongcpstorageE5F3AEE6\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", Object { "Ref": "DataIngressVpcDataIngressVPCDataIngressPrivateWithNatSubnet1Subnet50E70DA3", }, @@ -11521,7 +12187,7 @@ Object { "GroupId", ], }, - "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-gcp-big-query\\",\\"Environment\\":[{\\"Name\\":\\"CLIENT_EMAIL\\",\\"Value.$\\":\\"$.clientEmail\\"},{\\"Name\\":\\"CLIENT_ID\\",\\"Value.$\\":\\"$.clientId\\"},{\\"Name\\":\\"PRIVATE_KEY_ID\\",\\"Value.$\\":\\"$.privateKeyId\\"},{\\"Name\\":\\"PRIVATE_KEY_SECRET\\",\\"Value.$\\":\\"$.privateKeySecretName\\"},{\\"Name\\":\\"PROJECT_ID\\",\\"Value.$\\":\\"$.projectId\\"},{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"QUERY\\",\\"Value.$\\":\\"$.query\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", + "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-gcp-storage\\",\\"Environment\\":[{\\"Name\\":\\"CLIENT_EMAIL\\",\\"Value.$\\":\\"$.clientEmail\\"},{\\"Name\\":\\"CLIENT_ID\\",\\"Value.$\\":\\"$.clientId\\"},{\\"Name\\":\\"PRIVATE_KEY_ID\\",\\"Value.$\\":\\"$.privateKeyId\\"},{\\"Name\\":\\"PRIVATE_KEY_SECRET\\",\\"Value.$\\":\\"$.privateKeySecretName\\"},{\\"Name\\":\\"PROJECT_ID\\",\\"Value.$\\":\\"$.projectId\\"},{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"GS_INPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.gcpStorageInputPath\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", ], ], }, @@ -11531,7 +12197,7 @@ Object { "CloudWatchLogsLogGroup": Object { "LogGroupArn": Object { "Fn::GetAtt": Array [ - "GCBigQueryImportDataStateMachineStateMachineLogs247758BC", + "GCPImportDataStateMachineStateMachineLogs2958506C", "Arn", ], }, @@ -11542,7 +12208,7 @@ Object { }, "RoleArn": Object { "Fn::GetAtt": Array [ - "GCBigQueryImportDataStateMachineRole118D47DA", + "GCPImportDataStateMachineRoleF825A342", "Arn", ], }, @@ -11559,30 +12225,7 @@ Object { "Type": "AWS::StepFunctions::StateMachine", "UpdateReplacePolicy": "Delete", }, - "GCBigQueryImportDataStateMachineRole118D47DA": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "states.ap-southeast-1.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "GCBigQueryImportDataStateMachineRoleDefaultPolicy47F3014C": Object { + "GCPImportDataStateMachineRoleDefaultPolicyBFDD71A5": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -11625,7 +12268,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", + "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", }, ], }, @@ -11639,7 +12282,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", + "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", }, ], }, @@ -11653,7 +12296,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", + "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", }, ], }, @@ -11667,7 +12310,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", + "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", }, ], }, @@ -11687,7 +12330,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", + "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", }, ], }, @@ -11711,7 +12354,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPBigQueryECSTaskDefinitionGcpBigQuery1AB7422F", + "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", }, ], }, @@ -11739,13 +12382,13 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "ECSContainersGCPBigQueryRole46A6C643", + "ECSContainersGCPStorageRole6FF649D7", "Arn", ], }, Object { "Fn::GetAtt": Array [ - "ECSContainersGCPBigQueryECSExecutionRoleGcpBigQuery403267BD", + "ECSContainersGCPStorageECSExecutionRoleGcpStorageD8DBE133", "Arn", ], }, @@ -11774,16 +12417,39 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "GCBigQueryImportDataStateMachineRoleDefaultPolicy47F3014C", + "PolicyName": "GCPImportDataStateMachineRoleDefaultPolicyBFDD71A5", "Roles": Array [ Object { - "Ref": "GCBigQueryImportDataStateMachineRole118D47DA", + "Ref": "GCPImportDataStateMachineRoleF825A342", }, ], }, "Type": "AWS::IAM::Policy", }, - "GCBigQueryImportDataStateMachineStateMachineLogs247758BC": Object { + "GCPImportDataStateMachineRoleF825A342": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "states.ap-southeast-1.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "GCPImportDataStateMachineStateMachineLogs2958506C": Object { "DeletionPolicy": "Delete", "Properties": Object { "KmsKeyId": Object { @@ -11792,7 +12458,7 @@ Object { "Arn", ], }, - "LogGroupName": "/aws/vendedlogs/states/ada/GCBigQueryImportDataStateMachineStateMachineLogs/loggroup-######", + "LogGroupName": "/aws/vendedlogs/states/ada/GCPImportDataStateMachineStateMachineLogs/loggroup-######", "RetentionInDays": 731, "Tags": Array [ Object { @@ -11804,11 +12470,157 @@ Object { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", }, - "GCPImportDataStateMachine193D1733": Object { + "GlueSecurityConfiguration9540CFAA": Object { + "Properties": Object { + "EncryptionConfiguration": Object { + "JobBookmarksEncryption": Object { + "JobBookmarksEncryptionMode": "CSE-KMS", + "KmsKeyArn": Object { + "Ref": "referencetoAdaDataProductServiceGlueEncryptionKey322DD43CArn", + }, + }, + "S3Encryptions": Array [ + Object { + "S3EncryptionMode": "SSE-S3", + }, + ], + }, + "Name": "GlueSecurityConfig1436ghashx", + }, + "Type": "AWS::Glue::SecurityConfiguration", + }, + "LastUpdatedDetail": Object { + "DeletionPolicy": "Delete", + "Metadata": Object { + "cfn_nag": Object { + "rules_to_suppress": Array [ + Object { + "id": "W74", + "reason": "Table with no sensitive data and using AWS_MANAGED encryption", + }, + ], + }, + }, + "Properties": Object { + "AttributeDefinitions": Array [ + Object { + "AttributeName": "dataProductId", + "AttributeType": "S", + }, + Object { + "AttributeName": "domainId", + "AttributeType": "S", + }, + ], + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": Array [ + Object { + "AttributeName": "dataProductId", + "KeyType": "HASH", + }, + Object { + "AttributeName": "domainId", + "KeyType": "RANGE", + }, + ], + "PointInTimeRecoverySpecification": Object { + "PointInTimeRecoveryEnabled": true, + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::DynamoDB::Table", + "UpdateReplacePolicy": "Delete", + }, + "LogGroupEncryptionKmsKeyAliasB77DA9CE": Object { + "Properties": Object { + "AliasName": "alias/ada/loggroup/stack/StaticInfrastructure/ghashx", + "TargetKeyId": Object { + "Fn::GetAtt": Array [ + "LogGroupEncryptionKmsKeyE595E4BA", + "Arn", + ], + }, + }, + "Type": "AWS::KMS::Alias", + }, + "LogGroupEncryptionKmsKeyE595E4BA": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "EnableKeyRotation": true, + "KeyPolicy": Object { + "Statement": Array [ + Object { + "Action": "kms:*", + "Effect": "Allow", + "Principal": Object { + "AWS": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::1111111111:root", + ], + ], + }, + }, + "Resource": "*", + }, + Object { + "Action": Array [ + "kms:Encrypt*", + "kms:Decrypt*", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + "kms:Describe*", + ], + "Condition": Object { + "ArnLike": Object { + "kms:EncryptionContext:aws:logs:arn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":logs:ap-southeast-1:1111111111:*", + ], + ], + }, + }, + }, + "Effect": "Allow", + "Principal": Object { + "Service": "logs.ap-southeast-1.amazonaws.com", + }, + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::KMS::Key", + "UpdateReplacePolicy": "Delete", + }, + "MongoDBImportDataStateMachine0B9D316C": Object { "DeletionPolicy": "Delete", "DependsOn": Array [ - "GCPImportDataStateMachineRoleDefaultPolicyBFDD71A5", - "GCPImportDataStateMachineRoleF825A342", + "MongoDBImportDataStateMachineRoleDefaultPolicy836F0D11", + "MongoDBImportDataStateMachineRole176CEE22", ], "Properties": Object { "DefinitionString": Object { @@ -11822,11 +12634,11 @@ Object { ":states:::ecs:runTask.sync\\",\\"Parameters\\":{\\"PropagateTags\\":\\"TASK_DEFINITION\\",\\"Cluster\\":\\"", Object { "Fn::GetAtt": Array [ - "ECSContainersGCPStorageECSClusterGcpStorageB2D8638A", + "ECSContainersMongoDBECSClusterMongoDBBE2DCF05", "Arn", ], }, - "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersGCPStorageECSTaskDefinitiongcpstorageE5F3AEE6\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", + "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersMongoDBECSTaskDefinitionmongoDBCC6D776A\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", Object { "Ref": "DataIngressVpcDataIngressVPCDataIngressPrivateWithNatSubnet1Subnet50E70DA3", }, @@ -11841,7 +12653,7 @@ Object { "GroupId", ], }, - "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-gcp-storage\\",\\"Environment\\":[{\\"Name\\":\\"CLIENT_EMAIL\\",\\"Value.$\\":\\"$.clientEmail\\"},{\\"Name\\":\\"CLIENT_ID\\",\\"Value.$\\":\\"$.clientId\\"},{\\"Name\\":\\"PRIVATE_KEY_ID\\",\\"Value.$\\":\\"$.privateKeyId\\"},{\\"Name\\":\\"PRIVATE_KEY_SECRET\\",\\"Value.$\\":\\"$.privateKeySecretName\\"},{\\"Name\\":\\"PROJECT_ID\\",\\"Value.$\\":\\"$.projectId\\"},{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"GS_INPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.gcpStorageInputPath\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", + "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-mongoDB\\",\\"Environment\\":[{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"TRIGGER_TYPE\\",\\"Value.$\\":\\"$.triggerType\\"},{\\"Name\\":\\"SCHEDULE_RATE\\",\\"Value.$\\":\\"$.scheduleRate\\"},{\\"Name\\":\\"DB_ENDPOINT\\",\\"Value.$\\":\\"$.databaseEndpoint\\"},{\\"Name\\":\\"DB_PORT\\",\\"Value.$\\":\\"$.databasePort\\"},{\\"Name\\":\\"DB_NAME\\",\\"Value.$\\":\\"$.databaseName\\"},{\\"Name\\":\\"COLLECTION_NAME\\",\\"Value.$\\":\\"$.collectionName\\"},{\\"Name\\":\\"USERNAME\\",\\"Value.$\\":\\"$.username\\"},{\\"Name\\":\\"PASSWORD\\",\\"Value.$\\":\\"$.password\\"},{\\"Name\\":\\"TABLE_NAME\\",\\"Value.$\\":\\"$.tableName\\"},{\\"Name\\":\\"DOMAIN_ID\\",\\"Value.$\\":\\"$.domainId\\"},{\\"Name\\":\\"DATA_PRODUCT_ID\\",\\"Value.$\\":\\"$.dataProductId\\"},{\\"Name\\":\\"TLS\\",\\"Value.$\\":\\"$.tls\\"},{\\"Name\\":\\"TLS_CA_ID\\",\\"Value.$\\":\\"$.tlsCA\\"},{\\"Name\\":\\"TLS_CLIENT_CERT_ID\\",\\"Value.$\\":\\"$.tlsClientCert\\"},{\\"Name\\":\\"EXTRA_PARAMS\\",\\"Value.$\\":\\"$.extraParams\\"},{\\"Name\\":\\"BOOKMARK_FIELD\\",\\"Value.$\\":\\"$.bookmarkField\\"},{\\"Name\\":\\"BOOKMARK_FIELD_TYPE\\",\\"Value.$\\":\\"$.bookmarkFieldType\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", ], ], }, @@ -11851,7 +12663,7 @@ Object { "CloudWatchLogsLogGroup": Object { "LogGroupArn": Object { "Fn::GetAtt": Array [ - "GCPImportDataStateMachineStateMachineLogs2958506C", + "MongoDBImportDataStateMachineStateMachineLogsB8CB4F13", "Arn", ], }, @@ -11862,7 +12674,7 @@ Object { }, "RoleArn": Object { "Fn::GetAtt": Array [ - "GCPImportDataStateMachineRoleF825A342", + "MongoDBImportDataStateMachineRole176CEE22", "Arn", ], }, @@ -11879,7 +12691,30 @@ Object { "Type": "AWS::StepFunctions::StateMachine", "UpdateReplacePolicy": "Delete", }, - "GCPImportDataStateMachineRoleDefaultPolicyBFDD71A5": Object { + "MongoDBImportDataStateMachineRole176CEE22": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "states.ap-southeast-1.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "MongoDBImportDataStateMachineRoleDefaultPolicy836F0D11": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -11922,7 +12757,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", + "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", }, ], }, @@ -11936,7 +12771,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", + "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", }, ], }, @@ -11950,7 +12785,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", + "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", }, ], }, @@ -11964,7 +12799,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", + "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", }, ], }, @@ -11984,7 +12819,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", + "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", }, ], }, @@ -12008,7 +12843,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersGCPStorageECSTaskDefinitionGcpStorageC48FDC5D", + "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", }, ], }, @@ -12036,13 +12871,13 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "ECSContainersGCPStorageRole6FF649D7", + "ECSContainersMongoDBRole00E0730A", "Arn", ], }, Object { "Fn::GetAtt": Array [ - "ECSContainersGCPStorageECSExecutionRoleGcpStorageD8DBE133", + "ECSContainersMongoDBECSExecutionRoleMongoDBED825C38", "Arn", ], }, @@ -12071,39 +12906,16 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "GCPImportDataStateMachineRoleDefaultPolicyBFDD71A5", + "PolicyName": "MongoDBImportDataStateMachineRoleDefaultPolicy836F0D11", "Roles": Array [ Object { - "Ref": "GCPImportDataStateMachineRoleF825A342", + "Ref": "MongoDBImportDataStateMachineRole176CEE22", }, ], }, "Type": "AWS::IAM::Policy", }, - "GCPImportDataStateMachineRoleF825A342": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "states.ap-southeast-1.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "GCPImportDataStateMachineStateMachineLogs2958506C": Object { + "MongoDBImportDataStateMachineStateMachineLogsB8CB4F13": Object { "DeletionPolicy": "Delete", "Properties": Object { "KmsKeyId": Object { @@ -12112,7 +12924,7 @@ Object { "Arn", ], }, - "LogGroupName": "/aws/vendedlogs/states/ada/GCPImportDataStateMachineStateMachineLogs/loggroup-######", + "LogGroupName": "/aws/vendedlogs/states/ada/MongoDBImportDataStateMachineStateMachineLogs/loggroup-######", "RetentionInDays": 731, "Tags": Array [ Object { @@ -12124,157 +12936,11 @@ Object { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", }, - "GlueSecurityConfiguration9540CFAA": Object { - "Properties": Object { - "EncryptionConfiguration": Object { - "JobBookmarksEncryption": Object { - "JobBookmarksEncryptionMode": "CSE-KMS", - "KmsKeyArn": Object { - "Ref": "referencetoAdaDataProductServiceGlueEncryptionKey322DD43CArn", - }, - }, - "S3Encryptions": Array [ - Object { - "S3EncryptionMode": "SSE-S3", - }, - ], - }, - "Name": "GlueSecurityConfig1436ghashx", - }, - "Type": "AWS::Glue::SecurityConfiguration", - }, - "LastUpdatedDetail": Object { - "DeletionPolicy": "Delete", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W74", - "reason": "Table with no sensitive data and using AWS_MANAGED encryption", - }, - ], - }, - }, - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "dataProductId", - "AttributeType": "S", - }, - Object { - "AttributeName": "domainId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "dataProductId", - "KeyType": "HASH", - }, - Object { - "AttributeName": "domainId", - "KeyType": "RANGE", - }, - ], - "PointInTimeRecoverySpecification": Object { - "PointInTimeRecoveryEnabled": true, - }, - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Delete", - }, - "LogGroupEncryptionKmsKeyAliasB77DA9CE": Object { - "Properties": Object { - "AliasName": "alias/ada/loggroup/stack/StaticInfrastructure/ghashx", - "TargetKeyId": Object { - "Fn::GetAtt": Array [ - "LogGroupEncryptionKmsKeyE595E4BA", - "Arn", - ], - }, - }, - "Type": "AWS::KMS::Alias", - }, - "LogGroupEncryptionKmsKeyE595E4BA": Object { - "DeletionPolicy": "Delete", - "Properties": Object { - "EnableKeyRotation": true, - "KeyPolicy": Object { - "Statement": Array [ - Object { - "Action": "kms:*", - "Effect": "Allow", - "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::1111111111:root", - ], - ], - }, - }, - "Resource": "*", - }, - Object { - "Action": Array [ - "kms:Encrypt*", - "kms:Decrypt*", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Describe*", - ], - "Condition": Object { - "ArnLike": Object { - "kms:EncryptionContext:aws:logs:arn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:ap-southeast-1:1111111111:*", - ], - ], - }, - }, - }, - "Effect": "Allow", - "Principal": Object { - "Service": "logs.ap-southeast-1.amazonaws.com", - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "MongoDBImportDataStateMachine0B9D316C": Object { + "RedshiftDataImportStateMachine825B2A54": Object { "DeletionPolicy": "Delete", "DependsOn": Array [ - "MongoDBImportDataStateMachineRoleDefaultPolicy836F0D11", - "MongoDBImportDataStateMachineRole176CEE22", + "RedshiftDataImportStateMachineRoleDefaultPolicy9ADB259E", + "RedshiftDataImportStateMachineRole9D25A379", ], "Properties": Object { "DefinitionString": Object { @@ -12288,11 +12954,11 @@ Object { ":states:::ecs:runTask.sync\\",\\"Parameters\\":{\\"PropagateTags\\":\\"TASK_DEFINITION\\",\\"Cluster\\":\\"", Object { "Fn::GetAtt": Array [ - "ECSContainersMongoDBECSClusterMongoDBBE2DCF05", + "ECSContainersRedshiftECSClusterRedshift296B57BB", "Arn", ], }, - "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersMongoDBECSTaskDefinitionmongoDBCC6D776A\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", + "\\",\\"TaskDefinition\\":\\"AdaDataProductServiceStaticInfrastructureECSContainersRedshiftECSTaskDefinitionredshift35D44CF2\\",\\"NetworkConfiguration\\":{\\"AwsvpcConfiguration\\":{\\"Subnets\\":[\\"", Object { "Ref": "DataIngressVpcDataIngressVPCDataIngressPrivateWithNatSubnet1Subnet50E70DA3", }, @@ -12307,7 +12973,7 @@ Object { "GroupId", ], }, - "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-mongoDB\\",\\"Environment\\":[{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"TRIGGER_TYPE\\",\\"Value.$\\":\\"$.triggerType\\"},{\\"Name\\":\\"SCHEDULE_RATE\\",\\"Value.$\\":\\"$.scheduleRate\\"},{\\"Name\\":\\"DB_ENDPOINT\\",\\"Value.$\\":\\"$.databaseEndpoint\\"},{\\"Name\\":\\"DB_PORT\\",\\"Value.$\\":\\"$.databasePort\\"},{\\"Name\\":\\"DB_NAME\\",\\"Value.$\\":\\"$.databaseName\\"},{\\"Name\\":\\"COLLECTION_NAME\\",\\"Value.$\\":\\"$.collectionName\\"},{\\"Name\\":\\"USERNAME\\",\\"Value.$\\":\\"$.username\\"},{\\"Name\\":\\"PASSWORD\\",\\"Value.$\\":\\"$.password\\"},{\\"Name\\":\\"TABLE_NAME\\",\\"Value.$\\":\\"$.tableName\\"},{\\"Name\\":\\"DOMAIN_ID\\",\\"Value.$\\":\\"$.domainId\\"},{\\"Name\\":\\"DATA_PRODUCT_ID\\",\\"Value.$\\":\\"$.dataProductId\\"},{\\"Name\\":\\"TLS\\",\\"Value.$\\":\\"$.tls\\"},{\\"Name\\":\\"TLS_CA_ID\\",\\"Value.$\\":\\"$.tlsCA\\"},{\\"Name\\":\\"TLS_CLIENT_CERT_ID\\",\\"Value.$\\":\\"$.tlsClientCert\\"},{\\"Name\\":\\"EXTRA_PARAMS\\",\\"Value.$\\":\\"$.extraParams\\"},{\\"Name\\":\\"BOOKMARK_FIELD\\",\\"Value.$\\":\\"$.bookmarkField\\"},{\\"Name\\":\\"BOOKMARK_FIELD_TYPE\\",\\"Value.$\\":\\"$.bookmarkFieldType\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", + "\\"]}},\\"Overrides\\":{\\"ContainerOverrides\\":[{\\"Name\\":\\"ECSContainerDef-redshift\\",\\"Environment\\":[{\\"Name\\":\\"S3_OUTPUT_BUCKET_URI\\",\\"Value.$\\":\\"$.s3OutputPath\\"},{\\"Name\\":\\"TRIGGER_TYPE\\",\\"Value.$\\":\\"$.triggerType\\"},{\\"Name\\":\\"SCHEDULE_RATE\\",\\"Value.$\\":\\"$.scheduleRate\\"},{\\"Name\\":\\"DATABASE_ENDPOINT\\",\\"Value.$\\":\\"$.databaseEndpoint\\"},{\\"Name\\":\\"DATABASE_PORT\\",\\"Value.$\\":\\"$.databasePort\\"},{\\"Name\\":\\"DATABASE_NAME\\",\\"Value.$\\":\\"$.databaseName\\"},{\\"Name\\":\\"DATABASE_TABLE\\",\\"Value.$\\":\\"$.databaseTable\\"},{\\"Name\\":\\"DATABASE_TYPE\\",\\"Value.$\\":\\"$.databaseType\\"},{\\"Name\\":\\"WORKGROUP\\",\\"Value.$\\":\\"$.workgroup\\"},{\\"Name\\":\\"DATABASE_USERNAME\\",\\"Value.$\\":\\"$.databaseUsername\\"},{\\"Name\\":\\"CLUSTER_IDENTIFIER\\",\\"Value.$\\":\\"$.clusterIdentifier\\"},{\\"Name\\":\\"TABLE_NAME\\",\\"Value.$\\":\\"$.tableName\\"},{\\"Name\\":\\"DOMAIN_ID\\",\\"Value.$\\":\\"$.domainId\\"},{\\"Name\\":\\"DATA_PRODUCT_ID\\",\\"Value.$\\":\\"$.dataProductId\\"},{\\"Name\\":\\"CROSS_ACCOUNT_ACCESS_ROLE\\",\\"Value.$\\":\\"$.crossAccountRoleArn\\"}]}]},\\"LaunchType\\":\\"FARGATE\\",\\"PlatformVersion\\":\\"LATEST\\"}},\\"ECSTaskSucceeded\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"status\\":\\"SUCCEEDED\\"},\\"End\\":true},\\"ECSTaskFailed\\":{\\"Type\\":\\"Pass\\",\\"Parameters\\":{\\"details.$\\":\\"$\\",\\"error\\":\\"Import failed in the ECS container, verify the logs\\",\\"status\\":\\"FAILED\\"},\\"End\\":true}},\\"TimeoutSeconds\\":172800}", ], ], }, @@ -12317,7 +12983,7 @@ Object { "CloudWatchLogsLogGroup": Object { "LogGroupArn": Object { "Fn::GetAtt": Array [ - "MongoDBImportDataStateMachineStateMachineLogsB8CB4F13", + "RedshiftDataImportStateMachineStateMachineLogs522BF2E4", "Arn", ], }, @@ -12328,7 +12994,7 @@ Object { }, "RoleArn": Object { "Fn::GetAtt": Array [ - "MongoDBImportDataStateMachineRole176CEE22", + "RedshiftDataImportStateMachineRole9D25A379", "Arn", ], }, @@ -12345,7 +13011,7 @@ Object { "Type": "AWS::StepFunctions::StateMachine", "UpdateReplacePolicy": "Delete", }, - "MongoDBImportDataStateMachineRole176CEE22": Object { + "RedshiftDataImportStateMachineRole9D25A379": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -12368,7 +13034,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MongoDBImportDataStateMachineRoleDefaultPolicy836F0D11": Object { + "RedshiftDataImportStateMachineRoleDefaultPolicy9ADB259E": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -12411,7 +13077,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", + "Ref": "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45", }, ], }, @@ -12425,7 +13091,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", + "Ref": "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45", }, ], }, @@ -12439,7 +13105,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", + "Ref": "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45", }, ], }, @@ -12453,7 +13119,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", + "Ref": "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45", }, ], }, @@ -12473,7 +13139,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", + "Ref": "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45", }, ], }, @@ -12497,7 +13163,7 @@ Object { "Fn::Split": Array [ ":", Object { - "Ref": "ECSContainersMongoDBECSTaskDefinitionMongoDB36D2EB5D", + "Ref": "ECSContainersRedshiftECSTaskDefinitionRedshiftDD79CD45", }, ], }, @@ -12525,13 +13191,13 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "ECSContainersMongoDBRole00E0730A", + "ECSContainersRedshiftRoleD20929A5", "Arn", ], }, Object { "Fn::GetAtt": Array [ - "ECSContainersMongoDBECSExecutionRoleMongoDBED825C38", + "ECSContainersRedshiftECSExecutionRoleRedshift9D976AE1", "Arn", ], }, @@ -12560,16 +13226,16 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "MongoDBImportDataStateMachineRoleDefaultPolicy836F0D11", + "PolicyName": "RedshiftDataImportStateMachineRoleDefaultPolicy9ADB259E", "Roles": Array [ Object { - "Ref": "MongoDBImportDataStateMachineRole176CEE22", + "Ref": "RedshiftDataImportStateMachineRole9D25A379", }, ], }, "Type": "AWS::IAM::Policy", }, - "MongoDBImportDataStateMachineStateMachineLogsB8CB4F13": Object { + "RedshiftDataImportStateMachineStateMachineLogs522BF2E4": Object { "DeletionPolicy": "Delete", "Properties": Object { "KmsKeyId": Object { @@ -12578,7 +13244,7 @@ Object { "Arn", ], }, - "LogGroupName": "/aws/vendedlogs/states/ada/MongoDBImportDataStateMachineStateMachineLogs/loggroup-######", + "LogGroupName": "/aws/vendedlogs/states/ada/RedshiftDataImportStateMachineStateMachineLogs/loggroup-######", "RetentionInDays": 731, "Tags": Array [ Object { @@ -12869,6 +13535,21 @@ Object { "Arn", ], }, + "\\"}},\\"redshiftConnector\\":{\\"importDataStateMachineArn\\":\\"", + Object { + "Ref": "RedshiftDataImportStateMachine825B2A54", + }, + "\\",\\"lastUpdatedDetailTableName\\":\\"", + Object { + "Ref": "LastUpdatedDetail", + }, + "\\",\\"otherArns\\":{\\"ecsTaskRole\\":\\"", + Object { + "Fn::GetAtt": Array [ + "ECSContainersRedshiftRoleD20929A5", + "Arn", + ], + }, "\\"}},\\"cloudTrailConnector\\":{\\"importDataStateMachineArn\\":\\"", Object { "Ref": "CloudTrailImportDataStateMachine74CDCD1C", diff --git a/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-policy-store.ts b/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-policy-store.ts index fd105c8..b510cdc 100644 --- a/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-policy-store.ts +++ b/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-policy-store.ts @@ -2,11 +2,12 @@ SPDX-License-Identifier: Apache-2.0 */ import { AttributePolicy, AttributePolicyIdentifier, CreateAndUpdateDetails, LensEnum } from '@ada/api'; import { AwsDynamoDBDocumentClient, DynamoDB } from '@ada/aws-sdk'; -import { GenericDynamodbStore } from '@ada/microservice-common'; +import { GenericDynamodbStore, fetchPageWithQueryForHashKeyEquals } from '@ada/microservice-common'; import { buildNamespaceAndAttributeId } from '@ada/common'; // Table names are passed as environment variables defined in the CDK infrastructure const ATTRIBUTE_POLICY_TABLE_NAME = process.env.ATTRIBUTE_POLICY_TABLE_NAME ?? ''; +const ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME= process.env.ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME ?? ''; export type AttributePolicyWithCreateUpdateDetails = AttributePolicy & CreateAndUpdateDetails; @@ -25,12 +26,13 @@ export class AttributePolicyStore { AttributePolicyStore.instance || new AttributePolicyStore(AwsDynamoDBDocumentClient()); private readonly store: GenericDynamodbStore; - + private readonly ddb: DynamoDB.DocumentClient; /** * Create an instance of the attribute policy store * @param ddb dynamodb document client */ private constructor(ddb: DynamoDB.DocumentClient) { + this.ddb = ddb; this.store = new GenericDynamodbStore( ddb, ATTRIBUTE_POLICY_TABLE_NAME, @@ -53,6 +55,27 @@ export class AttributePolicyStore { }); }; + /** + * Return attribute policies that has the namespaceAndAttributeId provided as input + * @param ontologyNamespace the ontologyNamespace value + * @param attributeId the attributeId value + * @returns attribute policies for that namespaceAndAttributeId + */ + public getAttributePoliciesByAttributeId = async (ontologyNamespace: string, + attributeId: string, + ): Promise => { + const res = await fetchPageWithQueryForHashKeyEquals('namespaceAndAttributeId', buildNamespaceAndAttributeId(ontologyNamespace, attributeId), { + indexName: ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME, + })({ + ddb: this.ddb, + limit: 1000, + tableName: ATTRIBUTE_POLICY_TABLE_NAME ?? '', + }); + + // the clientId is the partition key of the GSI, we are expecting only one item + return res.Items || []; + }; + /** * Create or update an attribute policy * @param attributeId the id of the attribute to which the policy applies diff --git a/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-value-policy-store.ts b/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-value-policy-store.ts index 072184b..443f10b 100644 --- a/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-value-policy-store.ts +++ b/source/packages/@ada/infra/src/services/governance/api/components/ddb/attribute-value-policy-store.ts @@ -3,11 +3,12 @@ SPDX-License-Identifier: Apache-2.0 */ import { AttributePolicyIdentifier, AttributeValuePolicy, CreateAndUpdateDetails } from '@ada/api'; import { AwsDynamoDBDocumentClient, DynamoDB } from '@ada/aws-sdk'; -import { GenericDynamodbStore } from '@ada/microservice-common'; +import { GenericDynamodbStore, fetchPageWithQueryForHashKeyEquals } from '@ada/microservice-common'; import { buildNamespaceAndAttributeId } from '@ada/common'; // Table names are passed as environment variables defined in the CDK infrastructure const ATTRIBUTE_VALUE_POLICY_TABLE_NAME = process.env.ATTRIBUTE_VALUE_POLICY_TABLE_NAME ?? ''; +const ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME = process.env.ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME ?? ''; export type AttributeValuePolicyWithCreateUpdateDetails = AttributeValuePolicy & CreateAndUpdateDetails; @@ -17,6 +18,7 @@ export type AttributeValuePolicyWithCreateUpdateDetails = AttributeValuePolicy & export class AttributeValuePolicyStore { // Singleton instance of the policy store private static instance: AttributeValuePolicyStore | undefined; + private readonly ddb: DynamoDB.DocumentClient; /** * Get an instance of the attribute value policy store. Creates the instance with any default dependencies. @@ -32,6 +34,7 @@ export class AttributeValuePolicyStore { * @param ddb dynamodb document client */ private constructor(ddb: DynamoDB.DocumentClient) { + this.ddb = ddb; this.store = new GenericDynamodbStore( ddb, ATTRIBUTE_VALUE_POLICY_TABLE_NAME, @@ -110,6 +113,38 @@ export class AttributeValuePolicyStore { }); }; + /** + * Delete a batch of attribute value policies + * @param attributeValuePolicyIdentifiers the attribute policies to delete + */ + public batchDeleteAttributeValuePolicy = ( + attributeValuePolicyIdentifiers: AttributePolicyIdentifier[], + ): Promise<(AttributeValuePolicyWithCreateUpdateDetails | undefined)[]> => { + return this.store.batchDeleteIfExists(attributeValuePolicyIdentifiers); + }; + + /** + * Return attribute value policies that has the namespaceAndAttributeId provided as input + * @param ontologyNamespace the ontologyNamespace value + * @param attributeId the attributeId value + * @returns attribute value policies for that namespaceAndAttributeId + */ + public getAttributeValuePoliciesByAttributeId = async (ontologyNamespace: string, + attributeId: string, + ): Promise => { + const res = await fetchPageWithQueryForHashKeyEquals('namespaceAndAttributeId', buildNamespaceAndAttributeId(ontologyNamespace, attributeId), { + indexName: ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME, + })({ + ddb: this.ddb, + limit: 1000, + tableName: ATTRIBUTE_VALUE_POLICY_TABLE_NAME ?? '', + }); + + // the clientId is the partition key of the GSI, we are expecting only one item + return res.Items || []; + }; + + /** * Get the sql clause that should be applied for each given attribute for the given group * @param namespaceAndAttributeIds the attribute ids to retrieve diff --git a/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/delete-attribute-value-policy-batch.test.ts b/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/delete-attribute-value-policy-batch.test.ts new file mode 100644 index 0000000..8ec95f9 --- /dev/null +++ b/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/delete-attribute-value-policy-batch.test.ts @@ -0,0 +1,116 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import 'jest-extended'; +import { APIGatewayProxyResult } from 'aws-lambda'; +import { AttributeValuePolicy, AttributePolicyIdentifier } from '@ada/api'; +import { AttributeValuePolicyStore } from '../../components/ddb/attribute-value-policy-store'; +import { buildUniqOntology } from '@ada/common'; +import { apiGatewayEvent, getLocalDynamoDocumentClient, recreateAllTables } from '@ada/microservice-test-common'; +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { handler } from '../delete-attribute-value-policy-batch'; + +// Mock the store to point to our local dynamodb +const testAttributeValuePolicyStore = new (AttributeValuePolicyStore as any)(getLocalDynamoDocumentClient()); +AttributeValuePolicyStore.getInstance = jest.fn(() => testAttributeValuePolicyStore); + +describe('delete-attribute-value-policy-batch', () => { + const putPolicy = (policy: AttributeValuePolicy) => { + const { ontologyNamespace, ontologyId } = buildUniqOntology(policy.namespaceAndAttributeId); + return testAttributeValuePolicyStore.putAttributeValuePolicy( + ontologyNamespace, + ontologyId, + policy.group, + 'test-user', + policy, + ); + }; + + beforeEach(async () => { + // @ts-ignore + await recreateAllTables(global.__JEST_DYNAMODB_TABLES); + + await Promise.all([ + putPolicy({ + group: 'jedi', + namespaceAndAttributeId: 'ontologyNamespace.death-star-plans', + sqlClause: 'death-star-plans > 0', + }), + putPolicy({ + group: 'sith', + namespaceAndAttributeId: 'ontologyNamespace.death-star-plans', + sqlClause: 'death-star-plans < 0', + }), + putPolicy({ + group: 'jedi', + namespaceAndAttributeId: 'ontologyNamespace.rebel-base-location', + sqlClause: "rebel-base-location = 'a'", + }), + putPolicy({ + group: 'sith', + namespaceAndAttributeId: 'ontologyNamespace.rebel-base-location', + sqlClause: "rebel-base-location = 'b'", + }), + ]); + }); + + // Helper method for calling the handler + const deleteAttributeValuePolicyBatchHandler = (policies: AttributePolicyIdentifier[]): Promise => + handler( + apiGatewayEvent({ + body: JSON.stringify({ policies }), + }), + null, + ); + + it('should delete multiple attribute policies', async () => { + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'jedi'), + ).toBeDefined(); + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'sith'), + ).toBeDefined(); + + const response = await deleteAttributeValuePolicyBatchHandler([ + { group: 'jedi', namespaceAndAttributeId: 'ontologyNamespace.death-star-plans' }, + { group: 'sith', namespaceAndAttributeId: 'ontologyNamespace.death-star-plans' }, + ]); + expect(response.statusCode).toBe(200); + expect(JSON.parse(response.body).policies).toHaveLength(2); + + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'jedi'), + ).toBeUndefined(); + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'sith'), + ).toBeUndefined(); + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'rebel-base-location', 'sith'), + ).toBeDefined(); + }); + + it('should skip missing attribute policies', async () => { + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'jedi'), + ).toBeDefined(); + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'sith'), + ).toBeDefined(); + + const response = await deleteAttributeValuePolicyBatchHandler([ + { group: 'jedi', namespaceAndAttributeId: 'ontologyNamespace.death-star-plans' }, + { group: 'sith', namespaceAndAttributeId: 'ontologyNamespace.does-not-exist' }, + ]); + expect(response.statusCode).toBe(200); + expect(JSON.parse(response.body).policies).toHaveLength(1); + + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'jedi'), + ).toBeUndefined(); + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'death-star-plans', 'sith'), + ).toBeDefined(); + expect( + await testAttributeValuePolicyStore.getAttributeValuePolicy('ontologyNamespace', 'rebel-base-location', 'sith'), + ).toBeDefined(); + }); +}); diff --git a/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-policies-for-attribute.test.ts b/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-policies-for-attribute.test.ts new file mode 100644 index 0000000..06b8963 --- /dev/null +++ b/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-policies-for-attribute.test.ts @@ -0,0 +1,60 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import 'jest-extended'; +import { APIGatewayProxyResult } from 'aws-lambda'; +import { AttributePolicy } from '@ada/api'; +import { AttributePolicyStore } from '../../components/ddb/attribute-policy-store'; +import { LensIds, buildUniqAttribute } from '@ada/common'; +import { apiGatewayEvent, getLocalDynamoDocumentClient, recreateAllTables } from '@ada/microservice-test-common'; +import { handler } from '../get-attribute-policies-for-attribute'; + +// Mock the store to point to our local dynamodb +const testAttributePolicyStore = new (AttributePolicyStore as any)(getLocalDynamoDocumentClient()); +AttributePolicyStore.getInstance = jest.fn(() => testAttributePolicyStore); + +describe('get-attribute-policies-for-attribute', () => { + const namespaceAndAttributeId = 'ontologyNamespace.email'; + const group1 = 'admin'; + const group2 = 'default'; + + const policy1: AttributePolicy = { + namespaceAndAttributeId, + group: group1, + lensId: LensIds.HASHED, + }; + + const policy2: AttributePolicy = { + namespaceAndAttributeId, + group: group2, + lensId: LensIds.HIDDEN, + }; + + const { ontologyNamespace, attributeId } = buildUniqAttribute(namespaceAndAttributeId!); + beforeEach(async () => { + // @ts-ignore + await recreateAllTables(global.__JEST_DYNAMODB_TABLES); + + await testAttributePolicyStore.putAttributePolicy(ontologyNamespace, attributeId, group1, 'test-user', policy1); + await testAttributePolicyStore.putAttributePolicy(ontologyNamespace, attributeId, group2, 'test-user', policy2); + }); + + // Helper method for calling the handler + const getAttributePoliciesForAttributeHandler = ( + ontologyNamespace: string, + attributeId: string, + ): Promise => + handler( + apiGatewayEvent({ + pathParameters: { attributeId, ontologyNamespace }, + }), + null, + ); + + it('should get an attribute policy', async () => { + const response = await getAttributePoliciesForAttributeHandler(ontologyNamespace, attributeId); + expect(response.statusCode).toBe(200); + expect(JSON.parse(response.body)).toEqual({ + policies: [expect.objectContaining(policy1), expect.objectContaining(policy2)] + }); + }); +}); diff --git a/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-value-policies-for-attribute.test.ts b/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-value-policies-for-attribute.test.ts new file mode 100644 index 0000000..0bb2b5f --- /dev/null +++ b/source/packages/@ada/infra/src/services/governance/api/handlers/__tests__/get-attribute-value-policies-for-attribute.test.ts @@ -0,0 +1,90 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import 'jest-extended'; +import { APIGatewayProxyResult } from 'aws-lambda'; +import { AttributeValuePolicy } from '@ada/api'; +import { AttributeValuePolicyStore } from '../../components/ddb/attribute-value-policy-store'; +import { apiGatewayEvent, getLocalDynamoDocumentClient, recreateAllTables } from '@ada/microservice-test-common'; +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { buildUniqOntology } from '@ada/common'; +import { handler } from '../get-attribute-value-policies-for-attribute'; + +// Mock the store to point to our local dynamodb +const testAttributeValuePolicyStore = new (AttributeValuePolicyStore as any)(getLocalDynamoDocumentClient()); +AttributeValuePolicyStore.getInstance = jest.fn(() => testAttributeValuePolicyStore); + +describe('get-attribute-value-policies-for-attribute', () => { + beforeEach(async () => { + // @ts-ignore + await recreateAllTables(global.__JEST_DYNAMODB_TABLES); + }); + + // Helper method for calling the handler + const getAttributeValuePoliciesHandler = ( + ontologyNamespace: string, + attributeId: string, + ): Promise => + handler( + apiGatewayEvent({ + pathParameters: { attributeId, ontologyNamespace }, + }), + null, + ); + + const putPolicy = (policy: AttributeValuePolicy) => { + const { ontologyNamespace, ontologyId } = buildUniqOntology(policy.namespaceAndAttributeId); + return testAttributeValuePolicyStore.putAttributeValuePolicy( + ontologyNamespace, + ontologyId, + policy.group, + 'test-user', + policy, + ); + }; + + const policy1 = { + group: 'jedi', + namespaceAndAttributeId: 'ontologyNamespace.death-star-plans', + sqlClause: 'ontologyNamespace.death-star-plans == "no"', + }; + + const policy2 = { + group: 'sith', + namespaceAndAttributeId: 'ontologyNamespace.death-star-plans', + sqlClause: 'ontologyNamespace.death-star-plans != "secret"', + } + + const policy3 = { + group: 'jedi', + namespaceAndAttributeId: 'ontologyNamespace.rebel-base-location', + sqlClause: 'ontologyNamespace.rebel-base-location < 3', + } + + const policy4 = { + group: 'sith', + namespaceAndAttributeId: 'ontologyNamespace.rebel-base-location', + sqlClause: 'ontologyNamespace.rebel-base-location < 1', + } + + it('should get the attribute value policies for the given group and attributes', async () => { + await Promise.all([ + putPolicy(policy1), + putPolicy(policy2), + putPolicy(policy3), + putPolicy(policy4), + ]); + + let response = await getAttributeValuePoliciesHandler( + 'ontologyNamespace', + 'death-star-plans', + ); + expect(response.statusCode).toBe(200); + expect(JSON.parse(response.body).policies).toHaveLength(2); + expect(JSON.parse(response.body)).toEqual({ + policies: expect.arrayContaining([ + expect.objectContaining(policy1), + expect.objectContaining(policy2) + ]), + }); + }); +}); diff --git a/source/packages/@ada/infra/src/services/governance/api/handlers/delete-attribute-value-policy-batch.ts b/source/packages/@ada/infra/src/services/governance/api/handlers/delete-attribute-value-policy-batch.ts new file mode 100644 index 0000000..6dba325 --- /dev/null +++ b/source/packages/@ada/infra/src/services/governance/api/handlers/delete-attribute-value-policy-batch.ts @@ -0,0 +1,38 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; +import { AttributeValuePolicyEntity } from '@ada/api-client'; +import { AttributeValuePolicyStore } from '../components/ddb/attribute-value-policy-store'; +import { entityIdentifier } from '@ada/api-client/types'; + +/** + * Handler for creating/updating a batch of attribute policies + * @param event api gateway request + * @param context lambda context + */ +export const handler = ApiLambdaHandler.for( + 'deleteGovernancePolicyAttributeValues', + async ({ body: { policies } }, _callingUser, _event, { lockClient, relationshipClient }) => { + // NB: Ontology attribute value policy deletion is governed by api access policies + // ie. Anyone with permissions to manage governance may delete any attribute policy + + // Lock the policies to delete + const policyEntities = policies.map((policy) => entityIdentifier('GovernancePolicyAttributeValuesGroup', policy)); + const locks = await lockClient.acquire(...policyEntities); + + // Delete the policies + const deletedPolicies = (await AttributeValuePolicyStore.getInstance().batchDeleteAttributeValuePolicy(policies)) + .filter( + (policy) => policy, + ) as AttributeValuePolicyEntity[]; + + // Remove all relationships for the policy + await Promise.all(policyEntities.map((policyEntity) => relationshipClient.removeAllRelationships(policyEntity))); + + // Release the locks on the deleted policies + await lockClient.release(...locks); + + return ApiResponse.success({ policies: deletedPolicies }); + }, + ApiLambdaHandler.doNotLockPrimaryEntity, +); diff --git a/source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-policies-for-attribute.ts b/source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-policies-for-attribute.ts new file mode 100644 index 0000000..9292888 --- /dev/null +++ b/source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-policies-for-attribute.ts @@ -0,0 +1,32 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; +import { AttributePolicyStore } from '../components/ddb/attribute-policy-store'; +import VError from 'verror'; + +/** + * Handler for getting the attribute policy for a given attribute and group + * @param event api gateway request + * @param context lambda context + */ +export const handler = ApiLambdaHandler.for('getGovernancePolicyAttributesAttribute', async ({ requestParameters }) => { + const { attributeId, ontologyNamespace } = requestParameters; + + try { + console.log(`Query attrite values for ${ontologyNamespace}/${attributeId}`); + const policies = await AttributePolicyStore.getInstance().getAttributePoliciesByAttributeId( + ontologyNamespace, + attributeId, + ); + return ApiResponse.success({ + policies + }); + } catch (e: any) { + return ApiResponse.badRequest( + new VError( + { name: 'GetAttributePoliciesForAttributeError', cause: e }, + `Error retrieving attribute policy for attributeId ${ontologyNamespace}.${attributeId}`, + ), + ); + } +}); diff --git a/source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-value-policies-for-attribute.ts b/source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-value-policies-for-attribute.ts new file mode 100644 index 0000000..4f74aa4 --- /dev/null +++ b/source/packages/@ada/infra/src/services/governance/api/handlers/get-attribute-value-policies-for-attribute.ts @@ -0,0 +1,32 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; +import { AttributeValuePolicyStore } from '../components/ddb/attribute-value-policy-store'; +import VError from 'verror'; + +/** + * Handler for getting the attribute policy for a given attribute and group + * @param event api gateway request + * @param context lambda context + */ +export const handler = ApiLambdaHandler.for('getGovernancePolicyAttributeValuesAttribute', async ({ requestParameters }) => { + const { attributeId, ontologyNamespace } = requestParameters; + + try { + console.log(`Query attrite values for ${ontologyNamespace}/${attributeId}`); + const policies = await AttributeValuePolicyStore.getInstance().getAttributeValuePoliciesByAttributeId( + ontologyNamespace, + attributeId, + ); + return ApiResponse.success({ + policies + }); + } catch (e: any) { + return ApiResponse.badRequest( + new VError( + { name: 'GetAttributePoliciesForAttributeError', cause: e }, + `Error retrieving attribute policy for attributeId ${ontologyNamespace}.${attributeId}`, + ), + ); + } +}); diff --git a/source/packages/@ada/infra/src/services/governance/api/index.ts b/source/packages/@ada/infra/src/services/governance/api/index.ts index e2e40a7..92b778d 100644 --- a/source/packages/@ada/infra/src/services/governance/api/index.ts +++ b/source/packages/@ada/infra/src/services/governance/api/index.ts @@ -10,7 +10,7 @@ import { DataProductPolicy, DefaultLensPolicy, } from './types'; -import { AttributeType, Table } from 'aws-cdk-lib/aws-dynamodb'; +import { AttributeType, ProjectionType, Table } from 'aws-cdk-lib/aws-dynamodb'; import { Construct } from 'constructs'; import { CountedTable } from '../../../common/constructs/dynamodb/counted-table'; import { CounterTable } from '../../../common/constructs/dynamodb/counter-table'; @@ -21,6 +21,7 @@ import { LensProperty, asEntity, asInput } from '../../../common/constructs/api' import { MicroserviceApi, MicroserviceApiProps } from '../../../common/services'; import { StatusCodes } from 'http-status-codes/build/cjs'; import { TypescriptFunction } from '@ada/infra-common'; +import { getUniqueName } from '@ada/cdk-core'; export interface GovernanceServiceApiProps extends MicroserviceApiProps { counterTable: CounterTable; @@ -36,14 +37,17 @@ export interface BuiltLambdaFunctions { putAttributePolicyLambda: TypescriptFunction; batchPutAttributePolicyLambda: TypescriptFunction; getAttributePolicyLambda: TypescriptFunction; + getAttributePoliciesForAttribute: TypescriptFunction; getAttributePoliciesForGroup: TypescriptFunction; deleteAttributePolicyLambda: TypescriptFunction; batchDeleteAttributePolicyLambda: TypescriptFunction; putAttributeValuePolicyLambda: TypescriptFunction; batchPutAttributeValuePolicyLambda: TypescriptFunction; getAttributeValuePolicyLambda: TypescriptFunction; + getAttributeValuePoliciesForAttribute: TypescriptFunction; getAttributeValuePoliciesForGroup: TypescriptFunction; deleteAttributeValuePolicyLambda: TypescriptFunction; + batchDeleteAttributeValuePolicyLambda: TypescriptFunction; putDefaultLensPolicyLambda: TypescriptFunction; getDefaultLensPolicyLambda: TypescriptFunction; deleteDefaultLensPolicyLambda: TypescriptFunction; @@ -60,6 +64,9 @@ export default class GovernanceApi extends MicroserviceApi { private readonly attributeValuePolicyTable: Table; private readonly defaultLensPolicyTable: Table; + private readonly attributePolicyTableNamespaceAndAttributeIdIndexName: string; + private readonly attributeValuePolicyTableNamespaceAndAttributeIdIndexName: string; + constructor(scope: Construct, id: string, props: GovernanceServiceApiProps) { super(scope, id, props); @@ -91,6 +98,14 @@ export default class GovernanceApi extends MicroserviceApi { counterTable, }); + this.attributePolicyTableNamespaceAndAttributeIdIndexName = getUniqueName(this, 'AttributesPolicyTable-NamespaceAndAttributeId'); + + this.attributePolicyTable.addGlobalSecondaryIndex({ + indexName: this.attributePolicyTableNamespaceAndAttributeIdIndexName, + partitionKey: { name: 'namespaceAndAttributeId', type: AttributeType.STRING }, + projectionType: ProjectionType.ALL, + }); + this.attributeValuePolicyTable = new CountedTable(this, 'AttributesValuePolicyTable', { pointInTimeRecovery: true, partitionKey: { @@ -104,6 +119,14 @@ export default class GovernanceApi extends MicroserviceApi { counterTable, }); + this.attributeValuePolicyTableNamespaceAndAttributeIdIndexName = getUniqueName(this, 'AttributeValuePolicyTable-NamespaceAndAttributeId'); + + this.attributeValuePolicyTable.addGlobalSecondaryIndex({ + indexName: this.attributeValuePolicyTableNamespaceAndAttributeIdIndexName, + partitionKey: { name: 'namespaceAndAttributeId', type: AttributeType.STRING }, + projectionType: ProjectionType.ALL, + }); + this.defaultLensPolicyTable = new CountedTable(this, 'DefaultLensPolicyTable', { pointInTimeRecovery: true, partitionKey: { @@ -126,6 +149,10 @@ export default class GovernanceApi extends MicroserviceApi { ATTRIBUTE_POLICY_TABLE_NAME: this.attributePolicyTable.tableName, ATTRIBUTE_VALUE_POLICY_TABLE_NAME: this.attributeValuePolicyTable.tableName, DEFAULT_LENS_POLICY_TABLE_NAME: this.defaultLensPolicyTable.tableName, + ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME: + this.attributePolicyTableNamespaceAndAttributeIdIndexName, + ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME: + this.attributeValuePolicyTableNamespaceAndAttributeIdIndexName, }, apiLayer: { endpoint: federatedApi.url, @@ -171,8 +198,14 @@ export default class GovernanceApi extends MicroserviceApi { this.attributeValuePolicyTable.grantReadData(getAttributeValuePolicyLambda); const getAttributeValuePoliciesForGroup = buildLambda('get-attribute-value-policies-for-group'); this.attributeValuePolicyTable.grantReadData(getAttributeValuePoliciesForGroup); + const getAttributeValuePoliciesForAttribute = buildLambda('get-attribute-value-policies-for-attribute'); + this.attributeValuePolicyTable.grantReadData(getAttributeValuePoliciesForAttribute); + const getAttributePoliciesForAttribute = buildLambda('get-attribute-policies-for-attribute'); + this.attributePolicyTable.grantReadData(getAttributePoliciesForAttribute); const deleteAttributeValuePolicyLambda = buildLambda('delete-attribute-value-policy'); this.attributeValuePolicyTable.grantReadWriteData(deleteAttributeValuePolicyLambda); + const batchDeleteAttributeValuePolicyLambda = buildLambda('delete-attribute-value-policy-batch'); + this.attributeValuePolicyTable.grantReadWriteData(batchDeleteAttributeValuePolicyLambda); const putDefaultLensPolicyLambda = buildLambda('put-default-lens-policy'); this.defaultLensPolicyTable.grantReadWriteData(putDefaultLensPolicyLambda); @@ -193,13 +226,16 @@ export default class GovernanceApi extends MicroserviceApi { batchPutAttributePolicyLambda, getAttributePolicyLambda, getAttributePoliciesForGroup, + getAttributePoliciesForAttribute, deleteAttributePolicyLambda, batchDeleteAttributePolicyLambda, putAttributeValuePolicyLambda, batchPutAttributeValuePolicyLambda, getAttributeValuePolicyLambda, + getAttributeValuePoliciesForAttribute, getAttributeValuePoliciesForGroup, deleteAttributeValuePolicyLambda, + batchDeleteAttributeValuePolicyLambda, putDefaultLensPolicyLambda, getDefaultLensPolicyLambda, deleteDefaultLensPolicyLambda, @@ -342,9 +378,21 @@ export default class GovernanceApi extends MicroserviceApi { paths: { '/{ontologyNamespace}': { paths: { - // /governance/policy/attributes/{ontologyNamespace}/{attributeId} '/{attributeId}': { + // GET /governance/policy/attributes/{ontologyNamespace}/{attributeId} paths: { + // + 'attribute': { + GET: { + integration: new LambdaIntegration(this.functions.getAttributePoliciesForAttribute), + response: { + name: 'AttributePoliciesForAttributeOutput', + description: 'A list of attributes for the given attributes', + schema: AttributePolicyList, + errorStatusCodes: [StatusCodes.BAD_REQUEST, StatusCodes.NOT_FOUND, StatusCodes.FORBIDDEN], + }, + }, + }, // /governance/policy/attributes/{ontologyNamespace}/{attributeId}/group '/group': { paths: { @@ -448,12 +496,38 @@ export default class GovernanceApi extends MicroserviceApi { errorStatusCodes: [StatusCodes.BAD_REQUEST, StatusCodes.FORBIDDEN], }, }, + DELETE: { + integration: new LambdaIntegration(this.functions.batchDeleteAttributeValuePolicyLambda), + request: { + name: 'BatchDeleteAttributeValuePolicyInput', + description: 'List of attribute value policies to delete', + schema: AttributePolicyIdentifierList, + }, + response: { + name: 'BatchDeleteAttributeValuePolicyOutput', + description: 'The deleted attribute value policies', + schema: AttributeValuePolicyList, + errorStatusCodes: [StatusCodes.BAD_REQUEST, StatusCodes.FORBIDDEN], + }, + }, paths: { '/{ontologyNamespace}': { paths: { // /governance/policy/attribute-values/{ontologyNamespace}/{attributeId} '/{attributeId}': { paths: { + // /governance/policy/attribute-values/{ontologyNamespace}/{attributeId}/attribute + 'attribute': { + GET: { + integration: new LambdaIntegration(this.functions.getAttributeValuePoliciesForAttribute), + response: { + name: 'AttributeValuePoliciesForAttributeOutput', + description: 'A list of attribute values for the given attribute', + schema: AttributeValuePolicyList, + errorStatusCodes: [StatusCodes.BAD_REQUEST, StatusCodes.NOT_FOUND, StatusCodes.FORBIDDEN], + }, + }, + }, // /governance/policy/attribute-values/{ontologyNamespace}/{attributeId}/group '/group': { paths: { diff --git a/source/packages/@ada/infra/src/services/governance/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/governance/stack/__snapshots__/index.test.ts.snap index e149ac7..160e734 100644 --- a/source/packages/@ada/infra/src/services/governance/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/governance/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-GovernanceService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-GovernanceService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaGovernanceServiceApiLambdaGetAttributePolicy49F83004Ref": Object { "Value": Object { @@ -126,7 +126,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -432,9 +432,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -518,9 +520,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -790,7 +794,18 @@ Object { ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, @@ -1026,7 +1041,18 @@ Object { ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, @@ -1076,9 +1102,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -1128,7 +1156,95 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaDeleteAttributeValuePolicyServiceRole109B3B99": Object { + "ApiLambdaDeleteAttributeValuePolicyBatchE30F0F90": Object { + "DependsOn": Array [ + "ApiLambdaDeleteAttributeValuePolicyBatchServiceRoleDefaultPolicy1B30B901", + "ApiLambdaDeleteAttributeValuePolicyBatchServiceRole2CE50D00", + ], + "Properties": Object { + "Architectures": Array [ + "x86_64", + ], + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", + }, + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaDeleteAttributeValuePolicyBatch of delete-attribute-value-policy-batch.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], + ], + }, + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + "ATTRIBUTE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesPolicyTable", + }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesValuePolicyTable", + }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", + }, + "DATA_PRODUCT_POLICY_TABLE_NAME": Object { + "Ref": "DataProductPolicyTable", + }, + "DEFAULT_LENS_POLICY_TABLE_NAME": Object { + "Ref": "DefaultLensPolicyTable", + }, + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", + }, + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + }, + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + }, + }, + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteAttributeValuePolicyBatchServiceRole2CE50D00", + "Arn", + ], + }, + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", + }, + }, + "Type": "AWS::Lambda::Function", + }, + "ApiLambdaDeleteAttributeValuePolicyBatchServiceRole2CE50D00": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -1165,7 +1281,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaDeleteAttributeValuePolicyServiceRoleDefaultPolicy2B5508DD": Object { + "ApiLambdaDeleteAttributeValuePolicyBatchServiceRoleDefaultPolicy1B30B901": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -1348,109 +1464,34 @@ Object { ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaDeleteAttributeValuePolicyServiceRoleDefaultPolicy2B5508DD", + "PolicyName": "ApiLambdaDeleteAttributeValuePolicyBatchServiceRoleDefaultPolicy1B30B901", "Roles": Array [ Object { - "Ref": "ApiLambdaDeleteAttributeValuePolicyServiceRole109B3B99", + "Ref": "ApiLambdaDeleteAttributeValuePolicyBatchServiceRole2CE50D00", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaDeleteDataProductPolicy3C243F15": Object { - "DependsOn": Array [ - "ApiLambdaDeleteDataProductPolicyServiceRoleDefaultPolicyC51EFEBE", - "ApiLambdaDeleteDataProductPolicyServiceRole87072753", - ], - "Properties": Object { - "Architectures": Array [ - "x86_64", - ], - "Code": Object { - "S3Bucket": "cdk-#####", - "S3Key": "cdkhash######.zip", - }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaDeleteDataProductPolicy of delete-data-product-policy.ts", - "Environment": Object { - "Variables": Object { - "API_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - ".execute-api.ap-southeast-1.amazonaws.com/prod/", - ], - ], - }, - "API_WAF_ALLOW_RULE_SECRET": Object { - "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", - }, - "ATTRIBUTE_POLICY_TABLE_NAME": Object { - "Ref": "AttributesPolicyTable", - }, - "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { - "Ref": "AttributesValuePolicyTable", - }, - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "COUNTER_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", - }, - "DATA_PRODUCT_POLICY_TABLE_NAME": Object { - "Ref": "DataProductPolicyTable", - }, - "DEFAULT_LENS_POLICY_TABLE_NAME": Object { - "Ref": "DefaultLensPolicyTable", - }, - "INTERNAL_TOKEN_KMS_KEY": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", - }, - "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", - "LOCK_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", - }, - "RELATIONSHIP_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", - }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Ref": "referencetoAdaLayer6FB4FEF4Ref", - }, - ], - "MemorySize": 1024, - "Role": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductPolicyServiceRole87072753", - "Arn", - ], - }, - "Runtime": "nodejs16.x", - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - "Timeout": 30, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "ApiLambdaDeleteDataProductPolicyServiceRole87072753": Object { + "ApiLambdaDeleteAttributeValuePolicyServiceRole109B3B99": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -1487,7 +1528,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaDeleteDataProductPolicyServiceRoleDefaultPolicyC51EFEBE": Object { + "ApiLambdaDeleteAttributeValuePolicyServiceRoleDefaultPolicy2B5508DD": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -1643,7 +1684,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", }, }, Object { @@ -1665,31 +1706,42 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DataProductPolicyTable", + "AttributesValuePolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaDeleteDataProductPolicyServiceRoleDefaultPolicyC51EFEBE", + "PolicyName": "ApiLambdaDeleteAttributeValuePolicyServiceRoleDefaultPolicy2B5508DD", "Roles": Array [ Object { - "Ref": "ApiLambdaDeleteDataProductPolicyServiceRole87072753", + "Ref": "ApiLambdaDeleteAttributeValuePolicyServiceRole109B3B99", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaDeleteDefaultLensPolicy60932C04": Object { + "ApiLambdaDeleteDataProductPolicy3C243F15": Object { "DependsOn": Array [ - "ApiLambdaDeleteDefaultLensPolicyServiceRoleDefaultPolicyF446C729", - "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A", + "ApiLambdaDeleteDataProductPolicyServiceRoleDefaultPolicyC51EFEBE", + "ApiLambdaDeleteDataProductPolicyServiceRole87072753", ], "Properties": Object { "Architectures": Array [ @@ -1699,7 +1751,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaDeleteDefaultLensPolicy of delete-default-lens-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaDeleteDataProductPolicy of delete-data-product-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -1720,9 +1772,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -1754,7 +1808,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A", + "ApiLambdaDeleteDataProductPolicyServiceRole87072753", "Arn", ], }, @@ -1772,7 +1826,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A": Object { + "ApiLambdaDeleteDataProductPolicyServiceRole87072753": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -1809,7 +1863,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaDeleteDefaultLensPolicyServiceRoleDefaultPolicyF446C729": Object { + "ApiLambdaDeleteDataProductPolicyServiceRoleDefaultPolicyC51EFEBE": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -1965,7 +2019,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDefaultLensPolicyTable4B30BF12Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", }, }, Object { @@ -1984,40 +2038,6 @@ Object { "dynamodb:DescribeTable", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "DefaultLensPolicyTable", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", - }, - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ @@ -2033,19 +2053,19 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaDeleteDefaultLensPolicyServiceRoleDefaultPolicyF446C729", + "PolicyName": "ApiLambdaDeleteDataProductPolicyServiceRoleDefaultPolicyC51EFEBE", "Roles": Array [ Object { - "Ref": "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A", + "Ref": "ApiLambdaDeleteDataProductPolicyServiceRole87072753", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetAttributePoliciesForGroup83EB294E": Object { + "ApiLambdaDeleteDefaultLensPolicy60932C04": Object { "DependsOn": Array [ - "ApiLambdaGetAttributePoliciesForGroupServiceRoleDefaultPolicy2E28E3BB", - "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083", + "ApiLambdaDeleteDefaultLensPolicyServiceRoleDefaultPolicyF446C729", + "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A", ], "Properties": Object { "Architectures": Array [ @@ -2055,7 +2075,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributePoliciesForGroup of get-attribute-policies-for-group.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaDeleteDefaultLensPolicy of delete-default-lens-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -2076,9 +2096,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -2110,7 +2132,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083", + "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A", "Arn", ], }, @@ -2128,7 +2150,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083": Object { + "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -2165,7 +2187,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaGetAttributePoliciesForGroupServiceRoleDefaultPolicy2E28E3BB": Object { + "ApiLambdaDeleteDefaultLensPolicyServiceRoleDefaultPolicyF446C729": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -2315,10 +2337,13 @@ Object { "Action": Array [ "kms:Decrypt", "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDefaultLensPolicyTable4B30BF12Arn", }, }, Object { @@ -2330,13 +2355,51 @@ Object { "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", "dynamodb:DescribeTable", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesPolicyTable", + "DefaultLensPolicyTable", + "Arn", + ], + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "DataProductPolicyTable", "Arn", ], }, @@ -2348,19 +2411,19 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetAttributePoliciesForGroupServiceRoleDefaultPolicy2E28E3BB", + "PolicyName": "ApiLambdaDeleteDefaultLensPolicyServiceRoleDefaultPolicyF446C729", "Roles": Array [ Object { - "Ref": "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083", + "Ref": "ApiLambdaDeleteDefaultLensPolicyServiceRole7793357A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetAttributePolicyA18B2511": Object { + "ApiLambdaGetAttributePoliciesForAttribute118A85C2": Object { "DependsOn": Array [ - "ApiLambdaGetAttributePolicyServiceRoleDefaultPolicyBCDF6252", - "ApiLambdaGetAttributePolicyServiceRoleB13667A6", + "ApiLambdaGetAttributePoliciesForAttributeServiceRoleDefaultPolicy840E295B", + "ApiLambdaGetAttributePoliciesForAttributeServiceRole260C099E", ], "Properties": Object { "Architectures": Array [ @@ -2370,7 +2433,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributePolicy of get-attribute-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributePoliciesForAttribute of get-attribute-policies-for-attribute.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -2391,9 +2454,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -2425,7 +2490,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePolicyServiceRoleB13667A6", + "ApiLambdaGetAttributePoliciesForAttributeServiceRole260C099E", "Arn", ], }, @@ -2443,7 +2508,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaGetAttributePolicyServiceRoleB13667A6": Object { + "ApiLambdaGetAttributePoliciesForAttributeServiceRole260C099E": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -2480,7 +2545,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaGetAttributePolicyServiceRoleDefaultPolicyBCDF6252": Object { + "ApiLambdaGetAttributePoliciesForAttributeServiceRoleDefaultPolicy840E295B": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -2656,26 +2721,37 @@ Object { ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetAttributePolicyServiceRoleDefaultPolicyBCDF6252", + "PolicyName": "ApiLambdaGetAttributePoliciesForAttributeServiceRoleDefaultPolicy840E295B", "Roles": Array [ Object { - "Ref": "ApiLambdaGetAttributePolicyServiceRoleB13667A6", + "Ref": "ApiLambdaGetAttributePoliciesForAttributeServiceRole260C099E", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5": Object { + "ApiLambdaGetAttributePoliciesForGroup83EB294E": Object { "DependsOn": Array [ - "ApiLambdaGetAttributeValuePoliciesForGroupServiceRoleDefaultPolicy5C6E892D", - "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D", + "ApiLambdaGetAttributePoliciesForGroupServiceRoleDefaultPolicy2E28E3BB", + "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083", ], "Properties": Object { "Architectures": Array [ @@ -2685,7 +2761,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributeValuePoliciesForGroup of get-attribute-value-policies-for-group.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributePoliciesForGroup of get-attribute-policies-for-group.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -2706,9 +2782,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -2740,7 +2818,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D", + "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083", "Arn", ], }, @@ -2758,7 +2836,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D": Object { + "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -2795,7 +2873,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaGetAttributeValuePoliciesForGroupServiceRoleDefaultPolicy5C6E892D": Object { + "ApiLambdaGetAttributePoliciesForGroupServiceRoleDefaultPolicy2E28E3BB": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -2948,7 +3026,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", }, }, Object { @@ -2966,31 +3044,42 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesValuePolicyTable", + "AttributesPolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetAttributeValuePoliciesForGroupServiceRoleDefaultPolicy5C6E892D", + "PolicyName": "ApiLambdaGetAttributePoliciesForGroupServiceRoleDefaultPolicy2E28E3BB", "Roles": Array [ Object { - "Ref": "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D", + "Ref": "ApiLambdaGetAttributePoliciesForGroupServiceRoleB33EC083", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetAttributeValuePolicy4B6B1E42": Object { + "ApiLambdaGetAttributePolicyA18B2511": Object { "DependsOn": Array [ - "ApiLambdaGetAttributeValuePolicyServiceRoleDefaultPolicy929AC171", - "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658", + "ApiLambdaGetAttributePolicyServiceRoleDefaultPolicyBCDF6252", + "ApiLambdaGetAttributePolicyServiceRoleB13667A6", ], "Properties": Object { "Architectures": Array [ @@ -3000,7 +3089,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributeValuePolicy of get-attribute-value-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributePolicy of get-attribute-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -3021,9 +3110,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -3055,7 +3146,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658", + "ApiLambdaGetAttributePolicyServiceRoleB13667A6", "Arn", ], }, @@ -3073,7 +3164,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658": Object { + "ApiLambdaGetAttributePolicyServiceRoleB13667A6": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -3110,7 +3201,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaGetAttributeValuePolicyServiceRoleDefaultPolicy929AC171": Object { + "ApiLambdaGetAttributePolicyServiceRoleDefaultPolicyBCDF6252": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -3263,7 +3354,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", }, }, Object { @@ -3281,117 +3372,42 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesValuePolicyTable", + "AttributesPolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetAttributeValuePolicyServiceRoleDefaultPolicy929AC171", + "PolicyName": "ApiLambdaGetAttributePolicyServiceRoleDefaultPolicyBCDF6252", "Roles": Array [ Object { - "Ref": "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658", + "Ref": "ApiLambdaGetAttributePolicyServiceRoleB13667A6", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetDataProductPolicy0BA8B2AD": Object { - "DependsOn": Array [ - "ApiLambdaGetDataProductPolicyServiceRoleDefaultPolicy98AA299F", - "ApiLambdaGetDataProductPolicyServiceRole3182D5DD", - ], - "Properties": Object { - "Architectures": Array [ - "x86_64", - ], - "Code": Object { - "S3Bucket": "cdk-#####", - "S3Key": "cdkhash######.zip", - }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetDataProductPolicy of get-data-product-policy.ts", - "Environment": Object { - "Variables": Object { - "API_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - ".execute-api.ap-southeast-1.amazonaws.com/prod/", - ], - ], - }, - "API_WAF_ALLOW_RULE_SECRET": Object { - "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", - }, - "ATTRIBUTE_POLICY_TABLE_NAME": Object { - "Ref": "AttributesPolicyTable", - }, - "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { - "Ref": "AttributesValuePolicyTable", - }, - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "COUNTER_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", - }, - "DATA_PRODUCT_POLICY_TABLE_NAME": Object { - "Ref": "DataProductPolicyTable", - }, - "DEFAULT_LENS_POLICY_TABLE_NAME": Object { - "Ref": "DefaultLensPolicyTable", - }, - "INTERNAL_TOKEN_KMS_KEY": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", - }, - "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", - "LOCK_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", - }, - "RELATIONSHIP_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", - }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Ref": "referencetoAdaLayer6FB4FEF4Ref", - }, - ], - "MemorySize": 1024, - "Role": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductPolicyServiceRole3182D5DD", - "Arn", - ], - }, - "Runtime": "nodejs16.x", - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - "Timeout": 30, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "ApiLambdaGetDataProductPolicyPermissionsB3A4FAA6": Object { + "ApiLambdaGetAttributeValuePoliciesForAttributeCD3C9635": Object { "DependsOn": Array [ - "ApiLambdaGetDataProductPolicyPermissionsServiceRoleDefaultPolicy7B9F9356", - "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48", + "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRoleDefaultPolicyFD503C51", + "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRole96733041", ], "Properties": Object { "Architectures": Array [ @@ -3401,7 +3417,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetDataProductPolicyPermissions of get-data-product-policy-permissions.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributeValuePoliciesForAttribute of get-attribute-value-policies-for-attribute.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -3422,9 +3438,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -3456,7 +3474,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48", + "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRole96733041", "Arn", ], }, @@ -3474,7 +3492,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48": Object { + "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRole96733041": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -3511,7 +3529,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaGetDataProductPolicyPermissionsServiceRoleDefaultPolicy7B9F9356": Object { + "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRoleDefaultPolicyFD503C51": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -3664,7 +3682,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", }, }, Object { @@ -3682,66 +3700,165 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DataProductPolicyTable", + "AttributesValuePolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetDataProductPolicyPermissionsServiceRoleDefaultPolicy7B9F9356", + "PolicyName": "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRoleDefaultPolicyFD503C51", "Roles": Array [ Object { - "Ref": "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48", + "Ref": "ApiLambdaGetAttributeValuePoliciesForAttributeServiceRole96733041", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetDataProductPolicyServiceRole3182D5DD": Object { + "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5": Object { + "DependsOn": Array [ + "ApiLambdaGetAttributeValuePoliciesForGroupServiceRoleDefaultPolicy5C6E892D", + "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D", + ], "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, + "Architectures": Array [ + "x86_64", ], - }, - "Type": "AWS::IAM::Role", - }, - "ApiLambdaGetDataProductPolicyServiceRoleDefaultPolicy98AA299F": Object { - "Properties": Object { + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", + }, + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributeValuePoliciesForGroup of get-attribute-value-policies-for-group.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], + ], + }, + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + "ATTRIBUTE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesPolicyTable", + }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesValuePolicyTable", + }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", + }, + "DATA_PRODUCT_POLICY_TABLE_NAME": Object { + "Ref": "DataProductPolicyTable", + }, + "DEFAULT_LENS_POLICY_TABLE_NAME": Object { + "Ref": "DefaultLensPolicyTable", + }, + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", + }, + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + }, + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + }, + }, + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D", + "Arn", + ], + }, + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", + }, + }, + "Type": "AWS::Lambda::Function", + }, + "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ApiLambdaGetAttributeValuePoliciesForGroupServiceRoleDefaultPolicy5C6E892D": Object { + "Properties": Object { "PolicyDocument": Object { "Statement": Array [ Object { @@ -3893,7 +4010,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", }, }, Object { @@ -3911,31 +4028,42 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DataProductPolicyTable", + "AttributesValuePolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetDataProductPolicyServiceRoleDefaultPolicy98AA299F", + "PolicyName": "ApiLambdaGetAttributeValuePoliciesForGroupServiceRoleDefaultPolicy5C6E892D", "Roles": Array [ Object { - "Ref": "ApiLambdaGetDataProductPolicyServiceRole3182D5DD", + "Ref": "ApiLambdaGetAttributeValuePoliciesForGroupServiceRole3116D91D", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaGetDefaultLensPolicyF26C06AD": Object { + "ApiLambdaGetAttributeValuePolicy4B6B1E42": Object { "DependsOn": Array [ - "ApiLambdaGetDefaultLensPolicyServiceRoleDefaultPolicy86AA6A47", - "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973", + "ApiLambdaGetAttributeValuePolicyServiceRoleDefaultPolicy929AC171", + "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658", ], "Properties": Object { "Architectures": Array [ @@ -3945,7 +4073,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetDefaultLensPolicy of get-default-lens-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetAttributeValuePolicy of get-attribute-value-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -3966,9 +4094,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -4000,7 +4130,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973", + "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658", "Arn", ], }, @@ -4018,7 +4148,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973": Object { + "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -4055,7 +4185,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaGetDefaultLensPolicyServiceRoleDefaultPolicy86AA6A47": Object { + "ApiLambdaGetAttributeValuePolicyServiceRoleDefaultPolicy929AC171": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -4208,7 +4338,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDefaultLensPolicyTable4B30BF12Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", }, }, Object { @@ -4226,65 +4356,42 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DefaultLensPolicyTable", + "AttributesValuePolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", - }, - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "DataProductPolicyTable", - "Arn", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], ], }, - Object { - "Ref": "AWS::NoValue", - }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaGetDefaultLensPolicyServiceRoleDefaultPolicy86AA6A47", + "PolicyName": "ApiLambdaGetAttributeValuePolicyServiceRoleDefaultPolicy929AC171", "Roles": Array [ Object { - "Ref": "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973", + "Ref": "ApiLambdaGetAttributeValuePolicyServiceRoleB74C8658", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaPutAttributePolicy31A30817": Object { + "ApiLambdaGetDataProductPolicy0BA8B2AD": Object { "DependsOn": Array [ - "ApiLambdaPutAttributePolicyServiceRoleDefaultPolicyDE432632", - "ApiLambdaPutAttributePolicyServiceRole9C8CAC70", + "ApiLambdaGetDataProductPolicyServiceRoleDefaultPolicy98AA299F", + "ApiLambdaGetDataProductPolicyServiceRole3182D5DD", ], "Properties": Object { "Architectures": Array [ @@ -4294,7 +4401,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributePolicy of put-attribute-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetDataProductPolicy of get-data-product-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -4315,9 +4422,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -4349,7 +4458,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicyServiceRole9C8CAC70", + "ApiLambdaGetDataProductPolicyServiceRole3182D5DD", "Arn", ], }, @@ -4367,10 +4476,10 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaPutAttributePolicyBatchE3773651": Object { + "ApiLambdaGetDataProductPolicyPermissionsB3A4FAA6": Object { "DependsOn": Array [ - "ApiLambdaPutAttributePolicyBatchServiceRoleDefaultPolicy03470C0B", - "ApiLambdaPutAttributePolicyBatchServiceRole931C4765", + "ApiLambdaGetDataProductPolicyPermissionsServiceRoleDefaultPolicy7B9F9356", + "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48", ], "Properties": Object { "Architectures": Array [ @@ -4380,7 +4489,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributePolicyBatch of put-attribute-policy-batch.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetDataProductPolicyPermissions of get-data-product-policy-permissions.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -4401,9 +4510,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -4435,7 +4546,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicyBatchServiceRole931C4765", + "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48", "Arn", ], }, @@ -4453,7 +4564,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaPutAttributePolicyBatchServiceRole931C4765": Object { + "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -4490,7 +4601,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaPutAttributePolicyBatchServiceRoleDefaultPolicy03470C0B": Object { + "ApiLambdaGetDataProductPolicyPermissionsServiceRoleDefaultPolicy7B9F9356": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -4640,13 +4751,10 @@ Object { "Action": Array [ "kms:Decrypt", "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", }, }, Object { @@ -4658,17 +4766,13 @@ Object { "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", "dynamodb:DescribeTable", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesPolicyTable", + "DataProductPolicyTable", "Arn", ], }, @@ -4680,16 +4784,16 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaPutAttributePolicyBatchServiceRoleDefaultPolicy03470C0B", + "PolicyName": "ApiLambdaGetDataProductPolicyPermissionsServiceRoleDefaultPolicy7B9F9356", "Roles": Array [ Object { - "Ref": "ApiLambdaPutAttributePolicyBatchServiceRole931C4765", + "Ref": "ApiLambdaGetDataProductPolicyPermissionsServiceRole2B1CBC48", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaPutAttributePolicyServiceRole9C8CAC70": Object { + "ApiLambdaGetDataProductPolicyServiceRole3182D5DD": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -4726,7 +4830,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaPutAttributePolicyServiceRoleDefaultPolicyDE432632": Object { + "ApiLambdaGetDataProductPolicyServiceRoleDefaultPolicy98AA299F": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -4876,13 +4980,10 @@ Object { "Action": Array [ "kms:Decrypt", "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", }, }, Object { @@ -4894,17 +4995,13 @@ Object { "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", "dynamodb:DescribeTable", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesPolicyTable", + "DataProductPolicyTable", "Arn", ], }, @@ -4916,19 +5013,19 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaPutAttributePolicyServiceRoleDefaultPolicyDE432632", + "PolicyName": "ApiLambdaGetDataProductPolicyServiceRoleDefaultPolicy98AA299F", "Roles": Array [ Object { - "Ref": "ApiLambdaPutAttributePolicyServiceRole9C8CAC70", + "Ref": "ApiLambdaGetDataProductPolicyServiceRole3182D5DD", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28": Object { + "ApiLambdaGetDefaultLensPolicyF26C06AD": Object { "DependsOn": Array [ - "ApiLambdaPutAttributeValuePolicyBatchServiceRoleDefaultPolicy6373045E", - "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4", + "ApiLambdaGetDefaultLensPolicyServiceRoleDefaultPolicy86AA6A47", + "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973", ], "Properties": Object { "Architectures": Array [ @@ -4938,7 +5035,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributeValuePolicyBatch of put-attribute-value-policy-batch.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaGetDefaultLensPolicy of get-default-lens-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -4959,9 +5056,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -4993,7 +5092,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4", + "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973", "Arn", ], }, @@ -5011,7 +5110,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4": Object { + "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -5048,7 +5147,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaPutAttributeValuePolicyBatchServiceRoleDefaultPolicy6373045E": Object { + "ApiLambdaGetDefaultLensPolicyServiceRoleDefaultPolicy86AA6A47": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -5198,13 +5297,10 @@ Object { "Action": Array [ "kms:Decrypt", "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDefaultLensPolicyTable4B30BF12Arn", }, }, Object { @@ -5216,17 +5312,47 @@ Object { "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", "dynamodb:DescribeTable", ], "Effect": "Allow", "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesValuePolicyTable", + "DefaultLensPolicyTable", + "Arn", + ], + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "DataProductPolicyTable", "Arn", ], }, @@ -5238,19 +5364,19 @@ Object { ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaPutAttributeValuePolicyBatchServiceRoleDefaultPolicy6373045E", + "PolicyName": "ApiLambdaGetDefaultLensPolicyServiceRoleDefaultPolicy86AA6A47", "Roles": Array [ Object { - "Ref": "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4", + "Ref": "ApiLambdaGetDefaultLensPolicyServiceRole39CFF973", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaPutAttributeValuePolicyCB248150": Object { + "ApiLambdaPutAttributePolicy31A30817": Object { "DependsOn": Array [ - "ApiLambdaPutAttributeValuePolicyServiceRoleDefaultPolicy366161EC", - "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A", + "ApiLambdaPutAttributePolicyServiceRoleDefaultPolicyDE432632", + "ApiLambdaPutAttributePolicyServiceRole9C8CAC70", ], "Properties": Object { "Architectures": Array [ @@ -5260,7 +5386,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributeValuePolicy of put-attribute-value-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributePolicy of put-attribute-policy.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -5281,9 +5407,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -5315,7 +5443,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A", + "ApiLambdaPutAttributePolicyServiceRole9C8CAC70", "Arn", ], }, @@ -5333,7 +5461,95 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A": Object { + "ApiLambdaPutAttributePolicyBatchE3773651": Object { + "DependsOn": Array [ + "ApiLambdaPutAttributePolicyBatchServiceRoleDefaultPolicy03470C0B", + "ApiLambdaPutAttributePolicyBatchServiceRole931C4765", + ], + "Properties": Object { + "Architectures": Array [ + "x86_64", + ], + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", + }, + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributePolicyBatch of put-attribute-policy-batch.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], + ], + }, + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + "ATTRIBUTE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesPolicyTable", + }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesValuePolicyTable", + }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", + }, + "DATA_PRODUCT_POLICY_TABLE_NAME": Object { + "Ref": "DataProductPolicyTable", + }, + "DEFAULT_LENS_POLICY_TABLE_NAME": Object { + "Ref": "DefaultLensPolicyTable", + }, + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", + }, + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + }, + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + }, + }, + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutAttributePolicyBatchServiceRole931C4765", + "Arn", + ], + }, + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", + }, + }, + "Type": "AWS::Lambda::Function", + }, + "ApiLambdaPutAttributePolicyBatchServiceRole931C4765": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -5370,7 +5586,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaPutAttributeValuePolicyServiceRoleDefaultPolicy366161EC": Object { + "ApiLambdaPutAttributePolicyBatchServiceRoleDefaultPolicy03470C0B": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -5526,7 +5742,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", }, }, Object { @@ -5548,114 +5764,76 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "AttributesValuePolicyTable", + "AttributesPolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaPutAttributeValuePolicyServiceRoleDefaultPolicy366161EC", + "PolicyName": "ApiLambdaPutAttributePolicyBatchServiceRoleDefaultPolicy03470C0B", "Roles": Array [ Object { - "Ref": "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A", + "Ref": "ApiLambdaPutAttributePolicyBatchServiceRole931C4765", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaPutDataProductPolicyAF626632": Object { - "DependsOn": Array [ - "ApiLambdaPutDataProductPolicyServiceRoleDefaultPolicy47D5599E", - "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA", - ], + "ApiLambdaPutAttributePolicyServiceRole9C8CAC70": Object { "Properties": Object { - "Architectures": Array [ - "x86_64", - ], - "Code": Object { - "S3Bucket": "cdk-#####", - "S3Key": "cdkhash######.zip", - }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutDataProductPolicy of put-data-product-policy.ts", - "Environment": Object { - "Variables": Object { - "API_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - ".execute-api.ap-southeast-1.amazonaws.com/prod/", - ], - ], - }, - "API_WAF_ALLOW_RULE_SECRET": Object { - "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", - }, - "ATTRIBUTE_POLICY_TABLE_NAME": Object { - "Ref": "AttributesPolicyTable", - }, - "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { - "Ref": "AttributesValuePolicyTable", - }, - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "COUNTER_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", - }, - "DATA_PRODUCT_POLICY_TABLE_NAME": Object { - "Ref": "DataProductPolicyTable", - }, - "DEFAULT_LENS_POLICY_TABLE_NAME": Object { - "Ref": "DefaultLensPolicyTable", - }, - "INTERNAL_TOKEN_KMS_KEY": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", - }, - "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", - "LOCK_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", - }, - "RELATIONSHIP_TABLE_NAME": Object { - "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, }, - }, + ], + "Version": "2012-10-17", }, - "Handler": "index.handler", - "Layers": Array [ + "ManagedPolicyArns": Array [ Object { - "Ref": "referencetoAdaLayer6FB4FEF4Ref", + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], }, ], - "MemorySize": 1024, - "Role": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA", - "Arn", - ], - }, - "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "Application", "Value": "Ada", }, ], - "Timeout": 30, - "TracingConfig": Object { - "Mode": "Active", - }, }, - "Type": "AWS::Lambda::Function", + "Type": "AWS::IAM::Role", }, - "ApiLambdaPutDataProductPolicyServiceRoleDefaultPolicy47D5599E": Object { + "ApiLambdaPutAttributePolicyServiceRoleDefaultPolicyDE432632": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -5811,7 +5989,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesPolicyTable2BE20275Arn", }, }, Object { @@ -5833,68 +6011,42 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DataProductPolicyTable", + "AttributesPolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesPolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], }, ], }, ], "Version": "2012-10-17", }, - "PolicyName": "ApiLambdaPutDataProductPolicyServiceRoleDefaultPolicy47D5599E", + "PolicyName": "ApiLambdaPutAttributePolicyServiceRoleDefaultPolicyDE432632", "Roles": Array [ Object { - "Ref": "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA", + "Ref": "ApiLambdaPutAttributePolicyServiceRole9C8CAC70", }, ], }, "Type": "AWS::IAM::Policy", }, - "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - "Tags": Array [ - Object { - "Key": "Application", - "Value": "Ada", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ApiLambdaPutDefaultLensPolicy75B66676": Object { + "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28": Object { "DependsOn": Array [ - "ApiLambdaPutDefaultLensPolicyServiceRoleDefaultPolicyA3B7CD79", - "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903", + "ApiLambdaPutAttributeValuePolicyBatchServiceRoleDefaultPolicy6373045E", + "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4", ], "Properties": Object { "Architectures": Array [ @@ -5904,7 +6056,7 @@ Object { "S3Bucket": "cdk-#####", "S3Key": "cdkhash######.zip", }, - "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutDefaultLensPolicy of put-default-lens-policy.ts", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributeValuePolicyBatch of put-attribute-value-policy-batch.ts", "Environment": Object { "Variables": Object { "API_ENDPOINT": Object { @@ -5925,9 +6077,11 @@ Object { "ATTRIBUTE_POLICY_TABLE_NAME": Object { "Ref": "AttributesPolicyTable", }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { "Ref": "AttributesValuePolicyTable", }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", @@ -5959,7 +6113,7 @@ Object { "MemorySize": 1024, "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903", + "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4", "Arn", ], }, @@ -5977,7 +6131,7 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903": Object { + "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4": Object { "Properties": Object { "AssumeRolePolicyDocument": Object { "Statement": Array [ @@ -6014,7 +6168,7 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ApiLambdaPutDefaultLensPolicyServiceRoleDefaultPolicyA3B7CD79": Object { + "ApiLambdaPutAttributeValuePolicyBatchServiceRoleDefaultPolicy6373045E": Object { "Properties": Object { "PolicyDocument": Object { "Statement": Array [ @@ -6170,7 +6324,7 @@ Object { ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDefaultLensPolicyTable4B30BF12Arn", + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", }, }, Object { @@ -6192,26 +6346,183 @@ Object { "Resource": Array [ Object { "Fn::GetAtt": Array [ - "DefaultLensPolicyTable", + "AttributesValuePolicyTable", "Arn", ], }, Object { - "Ref": "AWS::NoValue", + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ApiLambdaPutAttributeValuePolicyBatchServiceRoleDefaultPolicy6373045E", + "Roles": Array [ + Object { + "Ref": "ApiLambdaPutAttributeValuePolicyBatchServiceRole791548B4", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ApiLambdaPutAttributeValuePolicyCB248150": Object { + "DependsOn": Array [ + "ApiLambdaPutAttributeValuePolicyServiceRoleDefaultPolicy366161EC", + "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A", + ], + "Properties": Object { + "Architectures": Array [ + "x86_64", + ], + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", + }, + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutAttributeValuePolicy of put-attribute-value-policy.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], + ], + }, + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + "ATTRIBUTE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesPolicyTable", + }, + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesValuePolicyTable", + }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", + }, + "DATA_PRODUCT_POLICY_TABLE_NAME": Object { + "Ref": "DataProductPolicyTable", + }, + "DEFAULT_LENS_POLICY_TABLE_NAME": Object { + "Ref": "DefaultLensPolicyTable", + }, + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", + }, + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + }, + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", + }, + }, + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A", + "Arn", + ], + }, + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", + }, + }, + "Type": "AWS::Lambda::Function", + }, + "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ApiLambdaPutAttributeValuePolicyServiceRoleDefaultPolicy366161EC": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", ], + "Effect": "Allow", + "Resource": "*", }, Object { "Action": Array [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", + "secretsmanager:GetSecretValue", + "secretsmanager:DescribeSecret", ], "Effect": "Allow", "Resource": Object { - "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", }, }, Object { @@ -6232,1233 +6543,479 @@ Object { "Effect": "Allow", "Resource": Array [ Object { - "Fn::GetAtt": Array [ - "DataProductPolicyTable", - "Arn", - ], + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", }, Object { "Ref": "AWS::NoValue", }, ], }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ApiLambdaPutDefaultLensPolicyServiceRoleDefaultPolicyA3B7CD79", - "Roles": Array [ - Object { - "Ref": "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ApiRestApiRefGovernance4C74C8F6": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5RootResourceId", - }, - "PathPart": "governance", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernanceOPTIONSB8D89C55": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", + "Action": "kms:Decrypt", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefGovernance4C74C8F6", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancePolicy79343398": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefGovernance4C74C8F6", - }, - "PathPart": "policy", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancePolicy79343398", - }, - "PathPart": "attribute-values", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyAttributes0C80171D": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancePolicy79343398", - }, - "PathPart": "attributes", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyDefaultLensAAFC7054": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancePolicy79343398", - }, - "PathPart": "default-lens", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyDomain52264973": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancePolicy79343398", - }, - "PathPart": "domain", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyOPTIONS6CD05D13": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancePolicy79343398", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesDELETE7AC8F3D5": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesPUTAD510925", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "DELETE", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributePolicyBatch9C25CBD4", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesResponse96091EF1", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "DeleteGovernancePolicyAttributes", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesRequest0650B62E", - }, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributes24E358F9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributePolicyBatch9C25CBD4", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/DELETE/governance/policy/attributes", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributes09FE467D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributePolicyBatch9C25CBD4", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/DELETE/governance/policy/attributes", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesRequest0650B62E": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesResponseC322986C", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "List of attribute policies to delete", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", - }, - }, - "properties": Object { - "policies": Object { - "items": Object { - "$ref": "#/definitions/AttributePolicyIdentifier", - }, - "type": "array", - }, - }, - "required": Array [ - "policies", - ], - "title": "DeleteGovernancePolicyAttributesRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesResponse96091EF1": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesRequest0650B62E", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The deleted attribute policies", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicy": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", - ], - "type": "object", - }, - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - }, - "properties": Object { - "policies": Object { - "items": Object { - "$ref": "#/definitions/AttributePolicy", - }, - "type": "array", - }, - }, - "required": Array [ - "policies", - ], - "title": "DeleteGovernancePolicyAttributesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicyattributesGET322E4FC7": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesOPTIONS19FABCFB", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePoliciesForGroup83EB294E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesGetGovernancePolicyAttributesResponseD3778B4F", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "GetGovernancePolicyAttributes", - "RequestParameters": Object { - "method.request.querystring.group": true, - "method.request.querystring.namespaceAndAttributeIds": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesB806A7F8": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePoliciesForGroup83EB294E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/governance/policy/attributes", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesC5D8A419": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePoliciesForGroup83EB294E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/governance/policy/attributes", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesGetGovernancePolicyAttributesResponseD3778B4F": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "A map of attribute id to the lens id that applies for the given group and attributes", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - }, - "properties": Object { - "attributeIdToLensId": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", + "Action": "secretsManager:GetSecretValue", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", + ], + ], }, - "type": "object", }, - }, - "required": Array [ - "attributeIdToLensId", - ], - "title": "GetGovernancePolicyAttributesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicyattributesOPTIONS19FABCFB": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesOntologyNamespace042C5055": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", - }, - "PathPart": "{ontologyNamespace}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyattributesPUTAD510925": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesGET322E4FC7", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ Object { - "Ref": "AWS::Partition", + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicyBatchE3773651", - "Arn", - ], + "Ref": "AWS::NoValue", }, - "/invocations", ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesResponseC322986C", - }, }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", }, }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], }, - "StatusCode": "403", - }, - ], - "OperationName": "PutGovernancePolicyAttributes", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesRequest5EA0F219", - }, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributes6F2F7BB2": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicyBatchE3773651", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/governance/policy/attributes", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributesBE81288F": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicyBatchE3773651", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableAttributesValuePolicyTable0A88FC7CArn", }, - "/test-invoke-stage/PUT/governance/policy/attributes", - ], + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "AttributesValuePolicyTable", + "Arn", + ], + }, + "/index/*", + ], + ], + }, + ], + }, ], + "Version": "2012-10-17", }, + "PolicyName": "ApiLambdaPutAttributeValuePolicyServiceRoleDefaultPolicy366161EC", + "Roles": Array [ + Object { + "Ref": "ApiLambdaPutAttributeValuePolicyServiceRole38250F8A", + }, + ], }, - "Type": "AWS::Lambda::Permission", + "Type": "AWS::IAM::Policy", }, - "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesRequest5EA0F219": Object { + "ApiLambdaPutDataProductPolicyAF626632": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesGetGovernancePolicyAttributesResponseD3778B4F", + "ApiLambdaPutDataProductPolicyServiceRoleDefaultPolicy47D5599E", + "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA", ], "Properties": Object { - "ContentType": "application/json", - "Description": "List of attribute policies to write", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Architectures": Array [ + "x86_64", + ], + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicy": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutDataProductPolicy of put-data-product-policy.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], ], - "type": "object", }, - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", + "ATTRIBUTE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesPolicyTable", }, - }, - "properties": Object { - "policies": Object { - "items": Object { - "$ref": "#/definitions/AttributePolicy", - }, - "type": "array", + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesValuePolicyTable", + }, + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", + }, + "DATA_PRODUCT_POLICY_TABLE_NAME": Object { + "Ref": "DataProductPolicyTable", + }, + "DEFAULT_LENS_POLICY_TABLE_NAME": Object { + "Ref": "DefaultLensPolicyTable", + }, + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", + }, + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", + }, + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", }, }, - "required": Array [ - "policies", + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA", + "Arn", ], - "title": "PutGovernancePolicyAttributesRequest", - "type": "object", + }, + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Function", }, - "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesResponseC322986C": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesRequest5EA0F219", - ], + "ApiLambdaPutDataProductPolicyServiceRoleDefaultPolicy47D5599E": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The written attribute policies", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicy": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "secretsmanager:GetSecretValue", + "secretsmanager:DescribeSecret", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", + }, + Object { + "Ref": "AWS::NoValue", }, + ], + }, + Object { + "Action": "kms:Decrypt", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", + }, + Object { + "Action": "secretsManager:GetSecretValue", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", + ], + ], + }, + }, + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", ], - "type": "object", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", + }, }, - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + Object { + "Ref": "AWS::NoValue", }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", ], - "type": "object", }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", ], - "type": "string", - }, - }, - "properties": Object { - "policies": Object { - "items": Object { - "$ref": "#/definitions/AttributePolicy", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", }, - "type": "array", }, - }, - "required": Array [ - "policies", - ], - "title": "PutGovernancePolicyAttributesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesOntologyNamespace042C5055", - }, - "PathPart": "{attributeId}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceOPTIONS61BE92EC": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesOntologyNamespace042C5055", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroup737BA1C6": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0", - }, - "PathPart": "group", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroup737BA1C6", - }, - "PathPart": "{group}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdOPTIONS5A60D49E": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", }, - "StatusCode": "200", + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "DataProductPolicyTable", + "Arn", + ], + }, + Object { + "Ref": "AWS::NoValue", + }, + ], }, ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", + "Version": "2012-10-17", }, - "MethodResponses": Array [ + "PolicyName": "ApiLambdaPutDataProductPolicyServiceRoleDefaultPolicy47D5599E", + "Roles": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", + "Ref": "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA", }, ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::IAM::Policy", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupOPTIONS542A87CE": Object { + "ApiLambdaPutDataProductPolicyServiceRoleF0105AAA": Object { "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ + "AssumeRolePolicyDocument": Object { + "Statement": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", }, - "StatusCode": "200", }, ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", + "Version": "2012-10-17", }, - "MethodResponses": Array [ + "ManagedPolicyArns": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroup737BA1C6", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroup2F06C131": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributePolicyBA184D70", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/DELETE/governance/policy/attributes/*/*/group/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroup8E90485A": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributePolicyBA184D70", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/DELETE/governance/policy/attributes/*/*/group/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDELETEFCFD71D9": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUT02DE4676", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "DELETE", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { "Fn::Join": Array [ "", Array [ @@ -7466,279 +7023,124 @@ Object { Object { "Ref": "AWS::Partition", }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributePolicyBA184D70", - "Arn", - ], - }, - "/invocations", + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", ], ], }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDeleteGovernancePolicyAttributesGroupResponseBC35C5A1", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, + ], + "Tags": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", + "Key": "Application", + "Value": "Ada", }, ], - "OperationName": "DeleteGovernancePolicyAttributesGroup", - "RequestParameters": Object { - "method.request.path.attributeId": true, - "method.request.path.group": true, - "method.request.path.ontologyNamespace": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::IAM::Role", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDeleteGovernancePolicyAttributesGroupResponseBC35C5A1": Object { + "ApiLambdaPutDefaultLensPolicy75B66676": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupResponseB4AE55AB", + "ApiLambdaPutDefaultLensPolicyServiceRoleDefaultPolicyA3B7CD79", + "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903", ], "Properties": Object { - "ContentType": "application/json", - "Description": "The attribute policy that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicy": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", - ], - "type": "object", - }, - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", + "Architectures": Array [ + "x86_64", + ], + "Code": Object { + "S3Bucket": "cdk-#####", + "S3Key": "cdkhash######.zip", + }, + "Description": "TypescriptFunction Ada/GovernanceService/Api/LambdaPutDefaultLensPolicy of put-default-lens-policy.ts", + "Environment": Object { + "Variables": Object { + "API_ENDPOINT": Object { + "Fn::Join": Array [ + "", + Array [ + "https://", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + ".execute-api.ap-southeast-1.amazonaws.com/prod/", + ], ], - "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", + "API_WAF_ALLOW_RULE_SECRET": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", + "ATTRIBUTE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesPolicyTable", }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "ATTRIBUTE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAME": Object { + "Ref": "AttributesValuePolicyTable", }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "ATTRIBUTE_VALUE_POLICY_TABLE_NAMESPACEANDATTRIBUTE_ID_INDEX_NAME": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "COUNTER_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + "DATA_PRODUCT_POLICY_TABLE_NAME": Object { + "Ref": "DataProductPolicyTable", }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", + "DEFAULT_LENS_POLICY_TABLE_NAME": Object { + "Ref": "DefaultLensPolicyTable", }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + "INTERNAL_TOKEN_KMS_KEY": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550ERef", }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "INTERNAL_TOKEN_SECRET_NAME": "sign-internal-token2855ghashx", + "LOCK_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Ref", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "RELATIONSHIP_TABLE_NAME": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Ref", }, }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", - ], - "title": "DeleteGovernancePolicyAttributesGroupResponse", - "type": "object", }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroup35A72836": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "referencetoAdaLayer6FB4FEF4Ref", + }, + ], + "MemorySize": 1024, + "Role": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePolicyA18B2511", + "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/governance/policy/attributes/*/*/group/*", - ], - ], + "Runtime": "nodejs16.x", + "Tags": Array [ + Object { + "Key": "Application", + "Value": "Ada", + }, + ], + "Timeout": 30, + "TracingConfig": Object { + "Mode": "Active", }, }, - "Type": "AWS::Lambda::Permission", + "Type": "AWS::Lambda::Function", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroupA3D0F10A": Object { + "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903": Object { "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePolicyA18B2511", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", }, - "/test-invoke-stage/GET/governance/policy/attributes/*/*/group/*", - ], + }, ], + "Version": "2012-10-17", }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETF267FFAE": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupOPTIONS290C4255", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { + "ManagedPolicyArns": Array [ + Object { "Fn::Join": Array [ "", Array [ @@ -7746,206 +7148,275 @@ Object { Object { "Ref": "AWS::Partition", }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetAttributePolicyA18B2511", - "Arn", - ], - }, - "/invocations", + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", ], ], }, - }, - "MethodResponses": Array [ + ], + "Tags": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGetGovernancePolicyAttributesGroupResponseF428638E", + "Key": "Application", + "Value": "Ada", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ApiLambdaPutDefaultLensPolicyServiceRoleDefaultPolicyA3B7CD79": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "secretsmanager:GetSecretValue", + "secretsmanager:DescribeSecret", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaApiWafDeploymentSecretCA25FA9ARef", + }, + }, + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Arn", + }, + Object { + "Ref": "AWS::NoValue", + }, + ], + }, + Object { + "Action": "kms:Decrypt", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackKeyInternalTokenE7D6550EArn", }, }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + Object { + "Action": "secretsManager:GetSecretValue", + "Effect": "Allow", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":secretsmanager:ap-southeast-1:1111111111:secret:sign-internal-token2855ghashx*", + ], + ], }, }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableLocks696688D7Arn", }, }, - "StatusCode": "403", - }, - ], - "OperationName": "GetGovernancePolicyAttributesGroup", - "RequestParameters": Object { - "method.request.path.attributeId": true, - "method.request.path.group": true, - "method.request.path.ontologyNamespace": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGetGovernancePolicyAttributesGroupResponseF428638E": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The attribute policy for the given group and attribute id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicy": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesLocksC922FC29Arn", }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + Object { + "Ref": "AWS::NoValue", }, - }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", ], - "type": "object", }, - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", ], - "type": "object", + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableRelationships0CDF4443Arn", + }, }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackEntityManagementTablesRelationshipsAA870878Arn", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + Object { + "Ref": "AWS::NoValue", }, - }, - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", ], - "type": "string", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDefaultLensPolicyTable4B30BF12Arn", + }, }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "DefaultLensPolicyTable", + "Arn", + ], + }, + Object { + "Ref": "AWS::NoValue", + }, + ], }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + Object { + "Action": Array [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": Object { + "Ref": "referencetoAdaKMSStackNestedStackKMSStackNestedStackResourceA6F3CE60OutputsAdaKMSStackKeyTableDataProductPolicyTableD600EA3AArn", + }, }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + Object { + "Action": Array [ + "dynamodb:BatchGetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:Query", + "dynamodb:GetItem", + "dynamodb:Scan", + "dynamodb:ConditionCheckItem", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem", + "dynamodb:DescribeTable", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "DataProductPolicyTable", + "Arn", + ], + }, + Object { + "Ref": "AWS::NoValue", + }, + ], }, - }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", ], - "title": "GetGovernancePolicyAttributesGroupResponse", - "type": "object", + "Version": "2012-10-17", + }, + "PolicyName": "ApiLambdaPutDefaultLensPolicyServiceRoleDefaultPolicyA3B7CD79", + "Roles": Array [ + Object { + "Ref": "ApiLambdaPutDefaultLensPolicyServiceRoleD6F51903", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ApiRestApiRefGovernance4C74C8F6": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5RootResourceId", + }, + "PathPart": "governance", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupOPTIONS290C4255": Object { + "ApiRestApiRefgovernanceOPTIONSB8D89C55": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -7977,7 +7448,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", + "Ref": "ApiRestApiRefGovernance4C74C8F6", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -7985,382 +7456,211 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUT02DE4676": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETF267FFAE", - ], + "ApiRestApiRefgovernancePolicy79343398": Object { "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicy31A30817", - "Arn", - ], - }, - "/invocations", - ], - ], - }, + "ParentId": Object { + "Ref": "ApiRestApiRefGovernance4C74C8F6", }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupResponseB4AE55AB", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "PutGovernancePolicyAttributesGroup", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupRequest5DF031BC", - }, + "PathPart": "policy", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "RequestParameters": Object { - "method.request.path.attributeId": true, - "method.request.path.group": true, - "method.request.path.ontologyNamespace": true, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancePolicy79343398", }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + "PathPart": "attribute-values", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicyAttributes0C80171D": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancePolicy79343398", }, + "PathPart": "attributes", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroupEF86ED30": Object { + "ApiRestApiRefgovernancepolicyAttributesontologyNamespaceAttributeIdAttributeD7967C66": Object { "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicy31A30817", - "Arn", - ], + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0", }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/governance/policy/attributes/*/*/group/*", - ], - ], + "PathPart": "attribute", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::Lambda::Permission", + "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroupCECB1729": Object { + "ApiRestApiRefgovernancepolicyAttributevaluesontologyNamespaceAttributeIdAttributeB511D436": Object { "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributePolicy31A30817", - "Arn", - ], + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1", }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/governance/policy/attributes/*/*/group/*", - ], - ], + "PathPart": "attribute", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::Lambda::Permission", + "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupRequest5DF031BC": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGetGovernancePolicyAttributesGroupResponseF428638E", - ], + "ApiRestApiRefgovernancepolicyDefaultLensAAFC7054": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "Details of new Attribute Policy", + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancePolicy79343398", + }, + "PathPart": "default-lens", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicyDomain52264973": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancePolicy79343398", + }, + "PathPart": "domain", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicyOPTIONS6CD05D13": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", + "StatusCode": "200", }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", }, - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, + "StatusCode": "200", }, - "required": Array [ - "lensId", - ], - "title": "PutGovernancePolicyAttributesGroupRequest", - "type": "object", + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancePolicy79343398", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupResponseB4AE55AB": Object { + "ApiRestApiRefgovernancepolicyattributesDELETE7AC8F3D5": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupRequest5DF031BC", + "ApiRestApiRefgovernancepolicyattributesPUTAD510925", ], "Properties": Object { - "ContentType": "application/json", - "Description": "Create or update new attribute policy", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicy": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteAttributePolicyBatch9C25CBD4", + "Arn", + ], }, - }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", + "/invocations", ], - "type": "object", - }, - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", }, + "StatusCode": "403", }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "lensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + ], + "OperationName": "DeleteGovernancePolicyAttributes", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesRequest0650B62E", }, - "required": Array [ - "group", - "lensId", - "namespaceAndAttributeId", - ], - "title": "PutGovernancePolicyAttributesGroupResponse", - "type": "object", + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesCF164E58": Object { + "ApiRestApiRefgovernancepolicyattributesDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributes24E358F9": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5", + "ApiLambdaDeleteAttributePolicyBatch9C25CBD4", "Arn", ], }, @@ -8377,19 +7677,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/governance/policy/attribute-values", + "/prod/DELETE/governance/policy/attributes", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValues58ABC4DD": Object { + "ApiRestApiRefgovernancepolicyattributesDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributes09FE467D": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5", + "ApiLambdaDeleteAttributePolicyBatch9C25CBD4", "Arn", ], }, @@ -8406,16 +7706,68 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/governance/policy/attribute-values", + "/test-invoke-stage/DELETE/governance/policy/attributes", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesGETF4B90BD3": Object { + "ApiRestApiRefgovernancepolicyattributesDeleteGovernancePolicyAttributesRequest0650B62E": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesOPTIONS2CD33AC5", + "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesRequest5EA0F219", + ], + "Properties": Object { + "ContentType": "application/json", + "Description": "List of attribute policies to delete", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "Schema": Object { + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": Object { + "AttributePolicyIdentifier": Object { + "properties": Object { + "group": Object { + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "namespaceAndAttributeId": Object { + "maxLength": 512, + "minLength": 5, + "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", + "type": "string", + }, + }, + "required": Array [ + "namespaceAndAttributeId", + "group", + ], + "type": "object", + }, + }, + "properties": Object { + "policies": Object { + "items": Object { + "$ref": "#/definitions/AttributePolicyIdentifier", + }, + "type": "array", + }, + }, + "required": Array [ + "policies", + ], + "title": "DeleteGovernancePolicyAttributesRequest", + "type": "object", + }, + }, + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefgovernancepolicyattributesGET322E4FC7": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributesOPTIONS19FABCFB", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -8437,7 +7789,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5", + "ApiLambdaGetAttributePoliciesForGroup83EB294E", "Arn", ], }, @@ -8448,11 +7800,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesGetGovernancePolicyAttributeValuesResponse64245D8E", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -8480,7 +7828,7 @@ Object { "StatusCode": "403", }, ], - "OperationName": "GetGovernancePolicyAttributeValues", + "OperationName": "GetGovernancePolicyAttributes", "RequestParameters": Object { "method.request.querystring.group": true, "method.request.querystring.namespaceAndAttributeIds": true, @@ -8489,7 +7837,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", + "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -8497,35 +7845,67 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesGetGovernancePolicyAttributeValuesResponse64245D8E": Object { + "ApiRestApiRefgovernancepolicyattributesGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesB806A7F8": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The attribute value policies discovered from the given attributesId and group", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePoliciesForGroup83EB294E", + "Arn", + ], }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "attributeIdToSqlClause": Object { - "additionalProperties": Object { - "description": "The sql clause to apply for the attribute", - "type": "string", + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "object", - }, - }, - "required": Array [ - "attributeIdToSqlClause", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/governance/policy/attributes", + ], ], - "title": "GetGovernancePolicyAttributeValuesResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesOPTIONS2CD33AC5": Object { + "ApiRestApiRefgovernancepolicyattributesGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesC5D8A419": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePoliciesForGroup83EB294E", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/governance/policy/attributes", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesOPTIONS19FABCFB": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -8557,7 +7937,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", + "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -8565,10 +7945,10 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesOntologyNamespaceBCC53F7C": Object { + "ApiRestApiRefgovernancepolicyattributesOntologyNamespace042C5055": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", + "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", }, "PathPart": "{ontologyNamespace}", "RestApiId": Object { @@ -8577,9 +7957,9 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributevaluesPUT6A83F14C": Object { + "ApiRestApiRefgovernancepolicyattributesPUTAD510925": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesGETF4B90BD3", + "ApiRestApiRefgovernancepolicyattributesGET322E4FC7", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -8601,7 +7981,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28", + "ApiLambdaPutAttributePolicyBatchE3773651", "Arn", ], }, @@ -8612,11 +7992,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesResponse6375A9BF", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -8636,17 +8012,17 @@ Object { "StatusCode": "403", }, ], - "OperationName": "PutGovernancePolicyAttributeValues", + "OperationName": "PutGovernancePolicyAttributes", "RequestModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesRequestBBD34FE4", + "Ref": "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesRequest5EA0F219", }, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", + "Ref": "ApiRestApiRefgovernancepolicyAttributes0C80171D", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -8654,41 +8030,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesCD5BFBF1": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/governance/policy/attribute-values", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefgovernancepolicyattributevaluesPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesCD2AF7F2": Object { + "ApiRestApiRefgovernancepolicyattributesPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributes6F2F7BB2": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28", + "ApiLambdaPutAttributePolicyBatchE3773651", "Arn", ], }, @@ -8705,112 +8052,53 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/PUT/governance/policy/attribute-values", + "/prod/PUT/governance/policy/attributes", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesRequestBBD34FE4": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesGetGovernancePolicyAttributeValuesResponse64245D8E", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "List of attribute value policies to write", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", - }, - "AttributeValuePolicy": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, + "ApiRestApiRefgovernancepolicyattributesPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributesBE81288F": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutAttributePolicyBatchE3773651", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", - ], - "type": "object", - }, - }, - "properties": Object { - "policies": Object { - "items": Object { - "$ref": "#/definitions/AttributeValuePolicy", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "type": "array", - }, - }, - "required": Array [ - "policies", + "/test-invoke-stage/PUT/governance/policy/attributes", + ], ], - "title": "PutGovernancePolicyAttributeValuesRequest", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesResponse6375A9BF": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesRequestBBD34FE4", - ], + "ApiRestApiRefgovernancepolicyattributesPutGovernancePolicyAttributesRequest5EA0F219": Object { "Properties": Object { "ContentType": "application/json", - "Description": "The written attribute value policies", + "Description": "List of attribute policies to write", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", "definitions": Object { - "AttributePolicyIdentifier": Object { + "AttributePolicy": Object { "properties": Object { "group": Object { "maxLength": 256, @@ -8818,6 +8106,10 @@ Object { "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, + "lensId": Object { + "$ref": "#/definitions/LensEnum", + "description": "Lens value", + }, "namespaceAndAttributeId": Object { "maxLength": 512, "minLength": 5, @@ -8826,18 +8118,14 @@ Object { }, }, "required": Array [ - "namespaceAndAttributeId", "group", + "lensId", + "namespaceAndAttributeId", ], "type": "object", }, - "AttributeValuePolicy": Object { + "AttributePolicyIdentifier": Object { "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, "group": Object { "maxLength": 256, "minLength": 2, @@ -8850,25 +8138,28 @@ Object { "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", "type": "string", }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, }, "required": Array [ - "group", "namespaceAndAttributeId", - "sqlClause", + "group", ], "type": "object", }, + "LensEnum": Object { + "description": "Lens value", + "enum": Array [ + "clear", + "hidden", + "hashed", + "ada_detect_pii_types", + ], + "type": "string", + }, }, "properties": Object { "policies": Object { "items": Object { - "$ref": "#/definitions/AttributeValuePolicy", + "$ref": "#/definitions/AttributePolicy", }, "type": "array", }, @@ -8876,16 +8167,16 @@ Object { "required": Array [ "policies", ], - "title": "PutGovernancePolicyAttributeValuesResponse", + "title": "PutGovernancePolicyAttributesRequest", "type": "object", }, }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesOntologyNamespaceBCC53F7C", + "Ref": "ApiRestApiRefgovernancepolicyattributesOntologyNamespace042C5055", }, "PathPart": "{attributeId}", "RestApiId": Object { @@ -8894,8 +8185,9 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceOPTIONS9D2DEFFB": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceOPTIONS61BE92EC": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -8927,7 +8219,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesOntologyNamespaceBCC53F7C", + "Ref": "ApiRestApiRefgovernancepolicyattributesOntologyNamespace042C5055", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -8935,10 +8227,10 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroup1E0707D4": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroup737BA1C6": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1", + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0", }, "PathPart": "group", "RestApiId": Object { @@ -8947,20 +8239,201 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroup1E0707D4", + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroup737BA1C6", }, "PathPart": "{group}", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Resource", + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdOPTIONS5A60D49E": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceAttributeIdA14471C0", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdattributeGET0C1C1070": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdattributeOPTIONSD04D109F", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePoliciesForAttribute118A85C2", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "GetGovernancePolicyAttributesAttribute", + "RequestParameters": Object { + "method.request.path.attributeId": true, + "method.request.path.ontologyNamespace": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyAttributesontologyNamespaceAttributeIdAttributeD7967C66", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdattributeGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesOntologyNamespaceAttributeIdAttribute0CF69652": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePoliciesForAttribute118A85C2", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/governance/policy/attributes/*/*/attribute", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdattributeGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesOntologyNamespaceAttributeIdAttribute4365B3B1": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePoliciesForAttribute118A85C2", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/governance/policy/attributes/*/*/attribute", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdOPTIONS99070B70": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdattributeOPTIONSD04D109F": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -8992,7 +8465,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1", + "Ref": "ApiRestApiRefgovernancepolicyAttributesontologyNamespaceAttributeIdAttributeD7967C66", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9000,8 +8473,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupOPTIONSA51F65D2": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupOPTIONS542A87CE": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -9033,7 +8507,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroup1E0707D4", + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroup737BA1C6", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9041,12 +8515,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupD240E4A7": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroup2F06C131": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributeValuePolicy47E7261D", + "ApiLambdaDeleteAttributePolicyBA184D70", "Arn", ], }, @@ -9063,52 +8537,298 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/DELETE/governance/policy/attribute-values/*/*/group/*", + "/prod/DELETE/governance/policy/attributes/*/*/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroup8E90485A": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteAttributePolicyBA184D70", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/governance/policy/attributes/*/*/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupDELETEFCFD71D9": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUT02DE4676", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteAttributePolicyBA184D70", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "DeleteGovernancePolicyAttributesGroup", + "RequestParameters": Object { + "method.request.path.attributeId": true, + "method.request.path.group": true, + "method.request.path.ontologyNamespace": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroup35A72836": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePolicyA18B2511", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/governance/policy/attributes/*/*/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroupA3D0F10A": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePolicyA18B2511", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/governance/policy/attributes/*/*/group/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupAF382522": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETF267FFAE": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupOPTIONS290C4255", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributePolicyA18B2511", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "GetGovernancePolicyAttributesGroup", + "RequestParameters": Object { + "method.request.path.attributeId": true, + "method.request.path.group": true, + "method.request.path.ontologyNamespace": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupOPTIONS290C4255": Object { "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributeValuePolicy47E7261D", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "/test-invoke-stage/DELETE/governance/policy/attribute-values/*/*/group/*", - ], + "StatusCode": "200", + }, ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::Lambda::Permission", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDELETECA43334F": Object { + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUT02DE4676": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUT03240958", + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupGETF267FFAE", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "DELETE", + "HttpMethod": "PUT", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -9123,7 +8843,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteAttributeValuePolicy47E7261D", + "ApiLambdaPutAttributePolicy31A30817", "Arn", ], }, @@ -9133,13 +8853,17 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDeleteGovernancePolicyAttributeValuesGroupResponse5A12D13A", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "200", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -9147,7 +8871,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "400", + "StatusCode": "404", }, Object { "ResponseModels": Object { @@ -9158,7 +8882,12 @@ Object { "StatusCode": "403", }, ], - "OperationName": "DeleteGovernancePolicyAttributeValuesGroup", + "OperationName": "PutGovernancePolicyAttributesGroup", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupRequest5DF031BC", + }, + }, "RequestParameters": Object { "method.request.path.attributeId": true, "method.request.path.group": true, @@ -9168,7 +8897,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", + "Ref": "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdGroupGroupEEDAF57D", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9176,13 +8905,68 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDeleteGovernancePolicyAttributeValuesGroupResponse5A12D13A": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupResponse1998B888", - ], + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroupEF86ED30": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutAttributePolicy31A30817", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/governance/policy/attributes/*/*/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributesOntologyNamespaceAttributeIdGroupGroupCECB1729": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutAttributePolicy31A30817", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/governance/policy/attributes/*/*/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributesGroupRequest5DF031BC": Object { "Properties": Object { "ContentType": "application/json", - "Description": "The attribute policy that was deleted", + "Description": "Details of new Attribute Policy", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, @@ -9210,104 +8994,34 @@ Object { ], "type": "object", }, - "AttributeValuePolicy": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", + "LensEnum": Object { + "description": "Lens value", + "enum": Array [ + "clear", + "hidden", + "hashed", + "ada_detect_pii_types", ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", + "type": "string", }, }, "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, "group": Object { "maxLength": 256, "minLength": 2, "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, + "lensId": Object { + "$ref": "#/definitions/LensEnum", + "description": "Lens value", + }, "namespaceAndAttributeId": Object { "maxLength": 512, "minLength": 5, "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", "type": "string", }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, "updatedTimestamp": Object { "maxLength": 64, "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", @@ -9315,26 +9029,82 @@ Object { }, }, "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", + "lensId", + ], + "title": "PutGovernancePolicyAttributesGroupRequest", + "type": "object", + }, + }, + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefgovernancepolicyattributevaluesDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributeValues8805EB74": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteAttributeValuePolicyBatchE30F0F90", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/DELETE/governance/policy/attribute-values", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributevaluesDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributeValues05F458A6": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteAttributeValuePolicyBatchE30F0F90", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/governance/policy/attribute-values", + ], ], - "title": "DeleteGovernancePolicyAttributeValuesGroupResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGET36166C0A": Object { + "ApiRestApiRefgovernancepolicyattributevaluesDELETEE49883C0": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupOPTIONS81610F5D", + "ApiRestApiRefgovernancepolicyattributevaluesPUT6A83F14C", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "GET", + "HttpMethod": "DELETE", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -9349,7 +9119,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePolicy4B6B1E42", + "ApiLambdaDeleteAttributeValuePolicyBatchE30F0F90", "Arn", ], }, @@ -9360,11 +9130,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGetGovernancePolicyAttributeValuesGroupResponse8B7CF1D5", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -9384,17 +9150,17 @@ Object { "StatusCode": "403", }, ], - "OperationName": "GetGovernancePolicyAttributeValuesGroup", - "RequestParameters": Object { - "method.request.path.attributeId": true, - "method.request.path.group": true, - "method.request.path.ontologyNamespace": true, + "OperationName": "DeleteGovernancePolicyAttributeValues", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesDeleteGovernancePolicyAttributeValuesRequest5F717546", + }, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", + "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9402,12 +9168,64 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroup2CBA4950": Object { + "ApiRestApiRefgovernancepolicyattributevaluesDeleteGovernancePolicyAttributeValuesRequest5F717546": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesRequestBBD34FE4", + ], + "Properties": Object { + "ContentType": "application/json", + "Description": "List of attribute value policies to delete", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "Schema": Object { + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": Object { + "AttributePolicyIdentifier": Object { + "properties": Object { + "group": Object { + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "namespaceAndAttributeId": Object { + "maxLength": 512, + "minLength": 5, + "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", + "type": "string", + }, + }, + "required": Array [ + "namespaceAndAttributeId", + "group", + ], + "type": "object", + }, + }, + "properties": Object { + "policies": Object { + "items": Object { + "$ref": "#/definitions/AttributePolicyIdentifier", + }, + "type": "array", + }, + }, + "required": Array [ + "policies", + ], + "title": "DeleteGovernancePolicyAttributeValuesRequest", + "type": "object", + }, + }, + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefgovernancepolicyattributevaluesGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesCF164E58": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePolicy4B6B1E42", + "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5", "Arn", ], }, @@ -9424,19 +9242,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/governance/policy/attribute-values/*/*/group/*", + "/prod/GET/governance/policy/attribute-values", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupCF8D131F": Object { + "ApiRestApiRefgovernancepolicyattributevaluesGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValues58ABC4DD": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetAttributeValuePolicy4B6B1E42", + "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5", "Arn", ], }, @@ -9453,161 +9271,96 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/governance/policy/attribute-values/*/*/group/*", + "/test-invoke-stage/GET/governance/policy/attribute-values", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGetGovernancePolicyAttributeValuesGroupResponse8B7CF1D5": Object { + "ApiRestApiRefgovernancepolicyattributevaluesGETF4B90BD3": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributevaluesOPTIONS2CD33AC5", + ], "Properties": Object { - "ContentType": "application/json", - "Description": "The attribute value policy for the given attribute id and group", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", - }, - "AttributeValuePolicy": Object { - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributeValuePoliciesForGroupC74086F5", + "Arn", + ], }, - }, - "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", + "/invocations", ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, + "StatusCode": "400", }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, + "StatusCode": "403", }, - "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", - ], - "title": "GetGovernancePolicyAttributeValuesGroupResponse", - "type": "object", + ], + "OperationName": "GetGovernancePolicyAttributeValues", + "RequestParameters": Object { + "method.request.querystring.group": true, + "method.request.querystring.namespaceAndAttributeIds": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupOPTIONS81610F5D": Object { + "ApiRestApiRefgovernancepolicyattributevaluesOPTIONS2CD33AC5": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -9639,7 +9392,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", + "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9647,9 +9400,21 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUT03240958": Object { + "ApiRestApiRefgovernancepolicyattributevaluesOntologyNamespaceBCC53F7C": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", + }, + "PathPart": "{ontologyNamespace}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicyattributevaluesPUT6A83F14C": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGET36166C0A", + "ApiRestApiRefgovernancepolicyattributevaluesGETF4B90BD3", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -9671,7 +9436,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyCB248150", + "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28", "Arn", ], }, @@ -9682,11 +9447,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupResponse1998B888", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -9697,14 +9458,6 @@ Object { }, "StatusCode": "400", }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, Object { "ResponseModels": Object { "application/json": Object { @@ -9714,22 +9467,17 @@ Object { "StatusCode": "403", }, ], - "OperationName": "PutGovernancePolicyAttributeValuesGroup", + "OperationName": "PutGovernancePolicyAttributeValues", "RequestModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupRequestC2FFBCF2", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesRequestBBD34FE4", }, }, - "RequestParameters": Object { - "method.request.path.attributeId": true, - "method.request.path.group": true, - "method.request.path.ontologyNamespace": true, - }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", + "Ref": "ApiRestApiRefgovernancepolicyAttributeValues7403B6B3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9737,12 +9485,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroup5CE27305": Object { + "ApiRestApiRefgovernancepolicyattributevaluesPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesCD5BFBF1": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyCB248150", + "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28", "Arn", ], }, @@ -9759,19 +9507,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/PUT/governance/policy/attribute-values/*/*/group/*", + "/prod/PUT/governance/policy/attribute-values", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupD25A4A21": Object { + "ApiRestApiRefgovernancepolicyattributevaluesPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesCD2AF7F2": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutAttributeValuePolicyCB248150", + "ApiLambdaPutAttributeValuePolicyBatchE9BBDF28", "Arn", ], }, @@ -9788,94 +9536,17 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/PUT/governance/policy/attribute-values/*/*/group/*", + "/test-invoke-stage/PUT/governance/policy/attribute-values", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupRequestC2FFBCF2": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGetGovernancePolicyAttributeValuesGroupResponse8B7CF1D5", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details of new Attribute Value Policy", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AttributePolicyIdentifier": Object { - "properties": Object { - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespaceAndAttributeId", - "group", - ], - "type": "object", - }, - }, - "properties": Object { - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "sqlClause", - ], - "title": "PutGovernancePolicyAttributeValuesGroupRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupResponse1998B888": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupRequestC2FFBCF2", - ], + "ApiRestApiRefgovernancepolicyattributevaluesPutGovernancePolicyAttributeValuesRequestBBD34FE4": Object { "Properties": Object { "ContentType": "application/json", - "Description": "Create or update new attribute value policy", + "Description": "List of attribute value policies to write", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, @@ -9930,161 +9601,45 @@ Object { }, }, "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", - ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "group": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "namespaceAndAttributeId": Object { - "maxLength": 512, - "minLength": 5, - "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", - "type": "string", - }, - "sqlClause": Object { - "description": "An SQL WHERE clause for row level governance on the attribute", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "group", - "namespaceAndAttributeId", - "sqlClause", - ], - "title": "PutGovernancePolicyAttributeValuesGroupResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicydefaultlensDomainD086C50C": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyDefaultLensAAFC7054", - }, - "PathPart": "domain", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefgovernancepolicydefaultlensOPTIONS69B692E3": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", + "group", + "namespaceAndAttributeId", + "sqlClause", + ], + "type": "object", }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, + "properties": Object { + "policies": Object { + "items": Object { + "$ref": "#/definitions/AttributeValuePolicy", + }, + "type": "array", }, - "StatusCode": "200", }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyDefaultLensAAFC7054", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "required": Array [ + "policies", + ], + "title": "PutGovernancePolicyAttributeValuesRequest", + "type": "object", }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefgovernancepolicydefaultlensdomainDomainId3A7B17FF": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensDomainD086C50C", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesOntologyNamespaceBCC53F7C", }, - "PathPart": "{domainId}", + "PathPart": "{attributeId}", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicydefaultlensdomainOPTIONS3811C253": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceOPTIONS9D2DEFFB": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -10116,7 +9671,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensDomainD086C50C", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesOntologyNamespaceBCC53F7C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -10124,73 +9679,33 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdDataProduct5452CF4F": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroup1E0707D4": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomainDomainId3A7B17FF", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1", }, - "PathPart": "data-product", + "PathPart": "group", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdOPTIONSBB32C8BC": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomainDomainId3A7B17FF", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdDataProduct5452CF4F", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroup1E0707D4", }, - "PathPart": "{dataProductId}", + "PathPart": "{group}", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductOPTIONS9A40B55F": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdOPTIONS99070B70": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -10222,7 +9737,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdDataProduct5452CF4F", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceAttributeId31276EF1", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -10230,16 +9745,16 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDELETE7E79913B": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdattributeGET0194A024": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUT37188344", + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdattributeOPTIONS7B4C1FE3", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "DELETE", + "HttpMethod": "GET", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -10254,7 +9769,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDefaultLensPolicy60932C04", + "ApiLambdaGetAttributeValuePoliciesForAttributeCD3C9635", "Arn", ], }, @@ -10265,11 +9780,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDeleteGovernancePolicyDefaultLensDomainDataProductResponse4D0150F1", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10297,16 +9808,16 @@ Object { "StatusCode": "403", }, ], - "OperationName": "DeleteGovernancePolicyDefaultLensDomainDataProduct", + "OperationName": "GetGovernancePolicyAttributeValuesAttribute", "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, + "method.request.path.attributeId": true, + "method.request.path.ontologyNamespace": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + "Ref": "ApiRestApiRefgovernancepolicyAttributevaluesontologyNamespaceAttributeIdAttributeB511D436", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -10314,12 +9825,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId5213679F": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdattributeGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdAttribute0705385E": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDefaultLensPolicy60932C04", + "ApiLambdaGetAttributeValuePoliciesForAttributeCD3C9635", "Arn", ], }, @@ -10336,19 +9847,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/DELETE/governance/policy/default-lens/domain/*/data-product/*", + "/prod/GET/governance/policy/attribute-values/*/*/attribute", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId70604DDB": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdattributeGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdAttributeB65DDC77": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDefaultLensPolicy60932C04", + "ApiLambdaGetAttributeValuePoliciesForAttributeCD3C9635", "Arn", ], }, @@ -10365,186 +9876,103 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/DELETE/governance/policy/default-lens/domain/*/data-product/*", + "/test-invoke-stage/GET/governance/policy/attribute-values/*/*/attribute", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDeleteGovernancePolicyDefaultLensDomainDataProductResponse4D0150F1": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductResponseF62200B0", - ], + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdattributeOPTIONS7B4C1FE3": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "Delete default lens policy by data product id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DefaultLensPolicy": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "required": Array [ - "dataProductId", - "defaultLensId", - "defaultLensOverrides", - "domainId", - ], - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", + "StatusCode": "200", }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyAttributevaluesontologyNamespaceAttributeIdAttributeB511D436", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupOPTIONSA51F65D2": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, + "StatusCode": "200", }, - "required": Array [ - "dataProductId", - "defaultLensId", - "defaultLensOverrides", - "domainId", - ], - "title": "DeleteGovernancePolicyDefaultLensDomainDataProductResponse", - "type": "object", + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroup1E0707D4", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductIdB95EE25B": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupD240E4A7": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDefaultLensPolicyF26C06AD", + "ApiLambdaDeleteAttributeValuePolicy47E7261D", "Arn", ], }, @@ -10561,19 +9989,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/governance/policy/default-lens/domain/*/data-product/*", + "/prod/DELETE/governance/policy/attribute-values/*/*/group/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId118CA8D9": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupAF382522": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDefaultLensPolicyF26C06AD", + "ApiLambdaDeleteAttributeValuePolicy47E7261D", "Arn", ], }, @@ -10590,23 +10018,23 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/governance/policy/default-lens/domain/*/data-product/*", + "/test-invoke-stage/DELETE/governance/policy/attribute-values/*/*/group/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETCF285BA6": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupDELETECA43334F": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdOPTIONS02528619", + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUT03240958", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "GET", + "HttpMethod": "DELETE", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -10621,7 +10049,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDefaultLensPolicyF26C06AD", + "ApiLambdaDeleteAttributeValuePolicy47E7261D", "Arn", ], }, @@ -10631,13 +10059,17 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGetGovernancePolicyDefaultLensDomainDataProductResponseD1DB350D", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "200", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -10645,7 +10077,64 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "400", + "StatusCode": "403", + }, + ], + "OperationName": "DeleteGovernancePolicyAttributeValuesGroup", + "RequestParameters": Object { + "method.request.path.attributeId": true, + "method.request.path.group": true, + "method.request.path.ontologyNamespace": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGET36166C0A": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupOPTIONS81610F5D", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributeValuePolicy4B6B1E42", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", }, Object { "ResponseModels": Object { @@ -10653,7 +10142,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "404", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -10664,16 +10153,17 @@ Object { "StatusCode": "403", }, ], - "OperationName": "GetGovernancePolicyDefaultLensDomainDataProduct", + "OperationName": "GetGovernancePolicyAttributeValuesGroup", "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, + "method.request.path.attributeId": true, + "method.request.path.group": true, + "method.request.path.ontologyNamespace": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -10681,172 +10171,67 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGetGovernancePolicyDefaultLensDomainDataProductResponseD1DB350D": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroup2CBA4950": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "Get default lens policy by data product id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributeValuePolicy4B6B1E42", + "Arn", + ], }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DefaultLensPolicy": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "/prod/GET/governance/policy/attribute-values/*/*/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupCF8D131F": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetAttributeValuePolicy4B6B1E42", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "required": Array [ - "dataProductId", - "defaultLensId", - "defaultLensOverrides", - "domainId", - ], - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "defaultLensId", - "defaultLensOverrides", - "domainId", + "/test-invoke-stage/GET/governance/policy/attribute-values/*/*/group/*", + ], ], - "title": "GetGovernancePolicyDefaultLensDomainDataProductResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdOPTIONS02528619": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupOPTIONS81610F5D": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -10878,7 +10263,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -10886,9 +10271,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUT37188344": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUT03240958": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETCF285BA6", + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupGET36166C0A", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -10910,7 +10295,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaPutDefaultLensPolicy75B66676", + "ApiLambdaPutAttributeValuePolicyCB248150", "Arn", ], }, @@ -10921,11 +10306,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductResponseF62200B0", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10953,21 +10334,22 @@ Object { "StatusCode": "403", }, ], - "OperationName": "PutGovernancePolicyDefaultLensDomainDataProduct", + "OperationName": "PutGovernancePolicyAttributeValuesGroup", "RequestModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductRequest2B2140D1", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupRequestC2FFBCF2", }, }, "RequestParameters": Object { - "method.request.path.dataProductId": true, - "method.request.path.domainId": true, + "method.request.path.attributeId": true, + "method.request.path.group": true, + "method.request.path.ontologyNamespace": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + "Ref": "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdGroupGroupDE7A1221", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -10975,12 +10357,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductIdC1D218AA": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroup5CE27305": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutDefaultLensPolicy75B66676", + "ApiLambdaPutAttributeValuePolicyCB248150", "Arn", ], }, @@ -10997,19 +10379,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/PUT/governance/policy/default-lens/domain/*/data-product/*", + "/prod/PUT/governance/policy/attribute-values/*/*/group/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId875CECA2": Object { + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyAttributeValuesOntologyNamespaceAttributeIdGroupGroupD25A4A21": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutDefaultLensPolicy75B66676", + "ApiLambdaPutAttributeValuePolicyCB248150", "Arn", ], }, @@ -11026,249 +10408,67 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/PUT/governance/policy/default-lens/domain/*/data-product/*", + "/test-invoke-stage/PUT/governance/policy/attribute-values/*/*/group/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductRequest2B2140D1": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGetGovernancePolicyDefaultLensDomainDataProductResponseD1DB350D", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details of new default lens policy", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - }, - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "defaultLensId", - "defaultLensOverrides", - ], - "title": "PutGovernancePolicyDefaultLensDomainDataProductRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductResponseF62200B0": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductRequest2B2140D1", - ], + "ApiRestApiRefgovernancepolicyattributevaluesontologyNamespaceattributeIdgroupgroupPutGovernancePolicyAttributeValuesGroupRequestC2FFBCF2": Object { "Properties": Object { "ContentType": "application/json", - "Description": "Create or update new default lens policy by data product id", + "Description": "Details of new Attribute Value Policy", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DefaultLensPolicy": Object { + "AttributePolicyIdentifier": Object { "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", + "group": Object { "maxLength": 256, "minLength": 2, "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", + "namespaceAndAttributeId": Object { + "maxLength": 512, + "minLength": 5, + "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", "type": "string", }, }, "required": Array [ - "dataProductId", - "defaultLensId", - "defaultLensOverrides", - "domainId", + "namespaceAndAttributeId", + "group", ], "type": "object", }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, }, "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "description": Object { + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", "type": "string", }, - "dataProductId": Object { - "description": "The id of the data product", + "group": Object { "maxLength": 256, "minLength": 2, "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "defaultLensId": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "defaultLensOverrides": Object { - "additionalProperties": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "type": "object", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", + "namespaceAndAttributeId": Object { + "maxLength": 512, + "minLength": 5, + "pattern": "^[a-z][a-z_0-9]*.[a-z][a-z_0-9]*$", "type": "string", }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", + "sqlClause": Object { + "description": "An SQL WHERE clause for row level governance on the attribute", + "maxLength": 262144, + "pattern": "^([\\\\s\\\\S]+)$", "type": "string", }, "updatedTimestamp": Object { @@ -11278,21 +10478,72 @@ Object { }, }, "required": Array [ - "dataProductId", - "defaultLensId", - "defaultLensOverrides", - "domainId", + "sqlClause", ], - "title": "PutGovernancePolicyDefaultLensDomainDataProductResponse", + "title": "PutGovernancePolicyAttributeValuesGroupRequest", "type": "object", }, }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefgovernancepolicydomainDomainIdAF8AA2DD": Object { + "ApiRestApiRefgovernancepolicydefaultlensDomainD086C50C": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicyDomain52264973", + "Ref": "ApiRestApiRefgovernancepolicyDefaultLensAAFC7054", + }, + "PathPart": "domain", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicydefaultlensOPTIONS69B692E3": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyDefaultLensAAFC7054", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomainDomainId3A7B17FF": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicydefaultlensDomainD086C50C", }, "PathPart": "{domainId}", "RestApiId": Object { @@ -11301,8 +10552,9 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicydomainOPTIONS7C71819F": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomainOPTIONS3811C253": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11334,7 +10586,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicyDomain52264973", + "Ref": "ApiRestApiRefgovernancepolicydefaultlensDomainD086C50C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -11342,10 +10594,10 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydomaindomainIdDataProductCF19BF6F": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdDataProduct5452CF4F": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicydomainDomainIdAF8AA2DD", + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomainDomainId3A7B17FF", }, "PathPart": "data-product", "RestApiId": Object { @@ -11354,8 +10606,9 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicydomaindomainIdOPTIONS54F3CBD6": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdOPTIONSBB32C8BC": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11387,7 +10640,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydomainDomainIdAF8AA2DD", + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomainDomainId3A7B17FF", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -11395,10 +10648,10 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductDataProductIdEAA26FC8": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIdDataProductCF19BF6F", + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdDataProduct5452CF4F", }, "PathPart": "{dataProductId}", "RestApiId": Object { @@ -11407,8 +10660,9 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductOPTIONS6218C1C3": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductOPTIONS9A40B55F": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11420,40 +10674,178 @@ Object { "method.response.header.Access-Control-Allow-Origin": "'*'", "method.response.header.Access-Control-Max-Age": "'600'", }, - "StatusCode": "200", - }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIdDataProduct5452CF4F", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDELETE7E79913B": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUT37188344", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteDefaultLensPolicy60932C04", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "DeleteGovernancePolicyDefaultLensDomainDataProduct", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId5213679F": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteDefaultLensPolicy60932C04", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/DELETE/governance/policy/default-lens/domain/*/data-product/*", + ], ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIdDataProductCF19BF6F", + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId70604DDB": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteDefaultLensPolicy60932C04", + "Arn", + ], }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/governance/policy/default-lens/domain/*/data-product/*", + ], + ], }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDomainDomainIdDataProductDataProductId7F554AB1": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductIdB95EE25B": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductPolicy3C243F15", + "ApiLambdaGetDefaultLensPolicyF26C06AD", "Arn", ], }, @@ -11470,19 +10862,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/DELETE/governance/policy/domain/*/data-product/*", + "/prod/GET/governance/policy/default-lens/domain/*/data-product/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDomainDomainIdDataProductDataProductId7413D091": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId118CA8D9": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductPolicy3C243F15", + "ApiLambdaGetDefaultLensPolicyF26C06AD", "Arn", ], }, @@ -11499,23 +10891,23 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/DELETE/governance/policy/domain/*/data-product/*", + "/test-invoke-stage/GET/governance/policy/default-lens/domain/*/data-product/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDELETED81855AA": Object { + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETCF285BA6": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPUTBAD56E2B", + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdOPTIONS02528619", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "DELETE", + "HttpMethod": "GET", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -11530,7 +10922,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteDataProductPolicy3C243F15", + "ApiLambdaGetDefaultLensPolicyF26C06AD", "Arn", ], }, @@ -11540,14 +10932,132 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "404", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDeleteGovernancePolicyDomainDataProductResponse8E18CED1", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "403", + }, + ], + "OperationName": "GetGovernancePolicyDefaultLensDomainDataProduct", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdOPTIONS02528619": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, "StatusCode": "200", }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUT37188344": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdGETCF285BA6", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "PUT", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutDefaultLensPolicy75B66676", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { @@ -11573,7 +11083,12 @@ Object { "StatusCode": "403", }, ], - "OperationName": "DeleteGovernancePolicyDomainDataProduct", + "OperationName": "PutGovernancePolicyDefaultLensDomainDataProduct", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductRequest2B2140D1", + }, + }, "RequestParameters": Object { "method.request.path.dataProductId": true, "method.request.path.domainId": true, @@ -11582,72 +11097,82 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIddataproductDataProductIdEAA26FC8", + "Ref": "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductDataProductId7A3D2607", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Method", + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUTApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductIdC1D218AA": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutDefaultLensPolicy75B66676", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/governance/policy/default-lens/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPUTApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318PUTGovernancePolicyDefaultLensDomainDomainIdDataProductDataProductId875CECA2": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutDefaultLensPolicy75B66676", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/governance/policy/default-lens/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDeleteGovernancePolicyDomainDataProductResponse8E18CED1": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPutGovernancePolicyDomainDataProductResponse9D1C89FD", - ], + "ApiRestApiRefgovernancepolicydefaultlensdomaindomainIddataproductdataProductIdPutGovernancePolicyDefaultLensDomainDataProductRequest2B2140D1": Object { "Properties": Object { "ContentType": "application/json", - "Description": "Delete data product policy", + "Description": "Details of new default lens policy", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", "definitions": Object { - "AccessEnum": Object { - "description": "Access control value", - "enum": Array [ - "READ_ONLY", - "FULL", - ], - "type": "string", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductAccessLevel": Object { - "properties": Object { - "access": Object { - "$ref": "#/definitions/AccessEnum", - "description": "Access control value", - }, - }, - "required": Array [ - "access", - ], - "type": "object", - }, "DataProductIdentifier": Object { "properties": Object { "dataProductId": Object { @@ -11671,51 +11196,18 @@ Object { ], "type": "object", }, - "DataProductPermissions": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataProductAccessLevel", - }, - "type": "object", - }, - "DataProductPolicy": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "permissions": Object { - "$ref": "#/definitions/DataProductPermissions", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - "permissions", + "LensEnum": Object { + "description": "Lens value", + "enum": Array [ + "clear", + "hidden", + "hashed", + "ada_detect_pii_types", ], - "type": "object", + "type": "string", }, }, "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, "dataProductId": Object { "description": "The id of the data product", "maxLength": 256, @@ -11723,6 +11215,17 @@ Object { "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, + "defaultLensId": Object { + "$ref": "#/definitions/LensEnum", + "description": "Lens value", + }, + "defaultLensOverrides": Object { + "additionalProperties": Object { + "$ref": "#/definitions/LensEnum", + "description": "Lens value", + }, + "type": "object", + }, "domainId": Object { "description": "The id of the domain to which this data product belongs", "maxLength": 256, @@ -11730,14 +11233,6 @@ Object { "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "permissions": Object { - "$ref": "#/definitions/DataProductPermissions", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, "updatedTimestamp": Object { "maxLength": 64, "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", @@ -11745,22 +11240,183 @@ Object { }, }, "required": Array [ - "dataProductId", - "domainId", - "permissions", + "defaultLensId", + "defaultLensOverrides", ], - "title": "DeleteGovernancePolicyDomainDataProductResponse", + "title": "PutGovernancePolicyDefaultLensDomainDataProductRequest", "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefgovernancepolicydomainDomainIdAF8AA2DD": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicyDomain52264973", + }, + "PathPart": "{domainId}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicydomainOPTIONS7C71819F": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicyDomain52264973", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydomaindomainIdDataProductCF19BF6F": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicydomainDomainIdAF8AA2DD", + }, + "PathPart": "data-product", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicydomaindomainIdOPTIONS54F3CBD6": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydomainDomainIdAF8AA2DD", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefgovernancepolicydomaindomainIddataproductDataProductIdEAA26FC8": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefgovernancepolicydomaindomainIdDataProductCF19BF6F", + }, + "PathPart": "{dataProductId}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefgovernancepolicydomaindomainIddataproductOPTIONS6218C1C3": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydomaindomainIdDataProductCF19BF6F", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDomainDomainIdDataProductDataProductId36BA3E2C": Object { + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDELETEApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDomainDomainIdDataProductDataProductId7F554AB1": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductPolicy0BA8B2AD", + "ApiLambdaDeleteDataProductPolicy3C243F15", "Arn", ], }, @@ -11777,19 +11433,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/governance/policy/domain/*/data-product/*", + "/prod/DELETE/governance/policy/domain/*/data-product/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDomainDomainIdDataProductDataProductId11090E2C": Object { + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDELETEApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318DELETEGovernancePolicyDomainDomainIdDataProductDataProductId7413D091": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductPolicy0BA8B2AD", + "ApiLambdaDeleteDataProductPolicy3C243F15", "Arn", ], }, @@ -11806,23 +11462,23 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/governance/policy/domain/*/data-product/*", + "/test-invoke-stage/DELETE/governance/policy/domain/*/data-product/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGETDC888AC5": Object { + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdDELETED81855AA": Object { "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdOPTIONS88C31DBB", + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPUTBAD56E2B", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "GET", + "HttpMethod": "DELETE", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -11837,7 +11493,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetDataProductPolicy0BA8B2AD", + "ApiLambdaDeleteDataProductPolicy3C243F15", "Arn", ], }, @@ -11848,11 +11504,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGetGovernancePolicyDomainDataProductResponse0A5A9209", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -11880,7 +11532,7 @@ Object { "StatusCode": "403", }, ], - "OperationName": "GetGovernancePolicyDomainDataProduct", + "OperationName": "DeleteGovernancePolicyDomainDataProduct", "RequestParameters": Object { "method.request.path.dataProductId": true, "method.request.path.domainId": true, @@ -11897,170 +11549,147 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGetGovernancePolicyDomainDataProductResponse0A5A9209": Object { + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGETApiPermissionAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDomainDomainIdDataProductDataProductId36BA3E2C": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "Get a policy for a data product", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetDataProductPolicy0BA8B2AD", + "Arn", + ], }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AccessEnum": Object { - "description": "Access control value", - "enum": Array [ - "READ_ONLY", - "FULL", - ], - "type": "string", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "object", - }, - "DataProductAccessLevel": Object { - "properties": Object { - "access": Object { - "$ref": "#/definitions/AccessEnum", - "description": "Access control value", - }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "required": Array [ - "access", - ], - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "/prod/GET/governance/policy/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGETApiPermissionTestAdaGovernanceServiceApiRestApiRefE62DB318GETGovernancePolicyDomainDomainIdDataProductDataProductId11090E2C": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetDataProductPolicy0BA8B2AD", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductPermissions": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataProductAccessLevel", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "type": "object", - }, - "DataProductPolicy": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + "/test-invoke-stage/GET/governance/policy/domain/*/data-product/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGETDC888AC5": Object { + "DependsOn": Array [ + "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdOPTIONS88C31DBB", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "permissions": Object { - "$ref": "#/definitions/DataProductPermissions", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetDataProductPolicy0BA8B2AD", + "Arn", + ], }, - }, - "required": Array [ - "dataProductId", - "domainId", - "permissions", + "/invocations", ], - "type": "object", - }, + ], }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "permissions": Object { - "$ref": "#/definitions/DataProductPermissions", + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, + "StatusCode": "403", }, - "required": Array [ - "dataProductId", - "domainId", - "permissions", - ], - "title": "GetGovernancePolicyDomainDataProductResponse", - "type": "object", + ], + "OperationName": "GetGovernancePolicyDomainDataProduct", + "RequestParameters": Object { + "method.request.path.dataProductId": true, + "method.request.path.domainId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefgovernancepolicydomaindomainIddataproductDataProductIdEAA26FC8", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdOPTIONS88C31DBB": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -12193,11 +11822,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPutGovernancePolicyDomainDataProductResponse9D1C89FD", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -12260,9 +11885,6 @@ Object { "Type": "AWS::ApiGateway::Resource", }, "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPutGovernancePolicyDomainDataProductRequest57C6EE94": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdGetGovernancePolicyDomainDataProductResponse0A5A9209", - ], "Properties": Object { "ContentType": "application/json", "Description": "Details of new data product policy", @@ -12355,171 +11977,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPutGovernancePolicyDomainDataProductResponse9D1C89FD": Object { - "DependsOn": Array [ - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdPutGovernancePolicyDomainDataProductRequest57C6EE94", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Create or update new data product policy by dataProductId", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AccessEnum": Object { - "description": "Access control value", - "enum": Array [ - "READ_ONLY", - "FULL", - ], - "type": "string", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductAccessLevel": Object { - "properties": Object { - "access": Object { - "$ref": "#/definitions/AccessEnum", - "description": "Access control value", - }, - }, - "required": Array [ - "access", - ], - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductPermissions": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataProductAccessLevel", - }, - "type": "object", - }, - "DataProductPolicy": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "permissions": Object { - "$ref": "#/definitions/DataProductPermissions", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - "permissions", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "permissions": Object { - "$ref": "#/definitions/DataProductPermissions", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - "permissions", - ], - "title": "PutGovernancePolicyDomainDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdpermissionsGET5989F890": Object { "DependsOn": Array [ "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdpermissionsOPTIONSBCD9A405", @@ -12555,11 +12012,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdpermissionsGetGovernancePolicyDomainDataProductPermissionsResponse3BA383B2", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -12663,101 +12116,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdpermissionsGetGovernancePolicyDomainDataProductPermissionsResponse3BA383B2": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Get permissions for a group and associated data product policy", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "additionalProperties": Object { - "$ref": "#/definitions/DataProductAccessLevel", - }, - "definitions": Object { - "AccessEnum": Object { - "description": "Access control value", - "enum": Array [ - "READ_ONLY", - "FULL", - ], - "type": "string", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductAccessLevel": Object { - "properties": Object { - "access": Object { - "$ref": "#/definitions/AccessEnum", - "description": "Access control value", - }, - }, - "required": Array [ - "access", - ], - "type": "object", - }, - "DataProductPermissions": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataProductAccessLevel", - }, - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "title": "GetGovernancePolicyDomainDataProductPermissionsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefgovernancepolicydomaindomainIddataproductdataProductIdpermissionsOPTIONSBCD9A405": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -12834,6 +12195,20 @@ Object { }, ], "BillingMode": "PAY_PER_REQUEST", + "GlobalSecondaryIndexes": Array [ + Object { + "IndexName": "AttributesPolicyTable-NamespaceAndAttributeId1863ghashx", + "KeySchema": Array [ + Object { + "AttributeName": "namespaceAndAttributeId", + "KeyType": "HASH", + }, + ], + "Projection": Object { + "ProjectionType": "ALL", + }, + }, + ], "KeySchema": Array [ Object { "AttributeName": "group", @@ -12878,6 +12253,20 @@ Object { }, ], "BillingMode": "PAY_PER_REQUEST", + "GlobalSecondaryIndexes": Array [ + Object { + "IndexName": "AttributeValuePolicyTable-NamespaceAndAttributeId1863ghashx", + "KeySchema": Array [ + Object { + "AttributeName": "namespaceAndAttributeId", + "KeyType": "HASH", + }, + ], + "Projection": Object { + "ProjectionType": "ALL", + }, + }, + ], "KeySchema": Array [ Object { "AttributeName": "group", diff --git a/source/packages/@ada/infra/src/services/identity/api/handlers/put-group.ts b/source/packages/@ada/infra/src/services/identity/api/handlers/put-group.ts index c75b8ca..a6fa8d5 100644 --- a/source/packages/@ada/infra/src/services/identity/api/handlers/put-group.ts +++ b/source/packages/@ada/infra/src/services/identity/api/handlers/put-group.ts @@ -4,6 +4,7 @@ import { ApiClient } from '@ada/api-client-lambda'; import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; import { DefaultGroupIds } from '@ada/common'; import { DefaultUser } from '@ada/microservice-common'; +import { GroupEntity } from '@ada/api'; import { GroupStore } from '../../../api/components/ddb/groups'; import { Logger } from '@ada/infra-common/constructs/lambda/lambda-logger'; import { entityIdentifier } from '@ada/api-client/types'; @@ -97,6 +98,10 @@ export const handler = ApiLambdaHandler.for( await lockClient.release(...apiAccessPolicyLocks); - return ApiResponse.success(writtenGroup); + if (userId !== DefaultUser.SYSTEM) { + return ApiResponse.success(writtenGroup); + } else { + return ApiResponse.success({} as GroupEntity); + } }, ); diff --git a/source/packages/@ada/infra/src/services/identity/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/identity/stack/__snapshots__/index.test.ts.snap index 0ca567b..4380530 100644 --- a/source/packages/@ada/infra/src/services/identity/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/identity/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-IdentityService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-IdentityService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaIdentityServiceUserPoolClient300BB0C2Ref": Object { "Value": Object { @@ -151,7 +151,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -9575,6 +9575,7 @@ Object { }, "ApiRestApiRefidentityOPTIONS5DA96F0F": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -9743,11 +9744,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityattributesGetIdentityAttributesResponse0632E278", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -9788,55 +9785,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentityattributesGetIdentityAttributesResponse0632E278": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the identity attributes", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "IdentityAttribute": Object { - "properties": Object { - "name": Object { - "description": "The name of the attribute", - "type": "string", - }, - "required": Object { - "description": "Flag that determine if the attribute is required or not", - "type": "boolean", - }, - "type": Object { - "description": "The data type of the attribute", - "type": "string", - }, - }, - "required": Array [ - "name", - "type", - "required", - ], - "type": "object", - }, - }, - "properties": Object { - "attributes": Object { - "items": Object { - "$ref": "#/definitions/IdentityAttribute", - }, - "type": "array", - }, - }, - "title": "GetIdentityAttributesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefidentityattributesOPTIONS771152C3": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -9911,11 +9862,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupListIdentityGroupsResponseFB65B8A3", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10015,238 +9962,9 @@ Object { }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefidentitygroupListIdentityGroupsResponseFB65B8A3": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all groups", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Group": Object { - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", - ], - "type": "object", - }, - "GroupEntity": Object { - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", - ], - "type": "object", - }, - "GroupIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "groupId", - ], - "type": "object", - }, - "GroupMembers": Object { - "properties": Object { - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "members", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "groups": Object { - "items": Object { - "$ref": "#/definitions/GroupEntity", - }, - "type": "array", - }, - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "groups", - ], - "title": "ListIdentityGroupsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefidentitygroupOPTIONSDB29DBC4": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -10321,11 +10039,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdDeleteIdentityGroupResponse6EAAFE35", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10427,225 +10141,23 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitygroupgroupIdDeleteIdentityGroupResponse6EAAFE35": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupResponse0B09002C", - ], + "ApiRestApiRefidentitygroupgroupIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityGroupGroupIdC3544299": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The group that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetGroup3B9ECE83", + "Arn", + ], }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Group": Object { - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", - ], - "type": "object", - }, - "GroupIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "groupId", - ], - "type": "object", - }, - "GroupMembers": Object { - "properties": Object { - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "members", - ], - "type": "object", - }, - }, - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", - ], - "title": "DeleteIdentityGroupResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitygroupgroupIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityGroupGroupIdC3544299": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetGroup3B9ECE83", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, ":execute-api:ap-southeast-1:1111111111:", Object { @@ -10722,11 +10234,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdGetIdentityGroupResponse2F7B6FFC", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10762,96 +10270,212 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitygroupgroupIdGetIdentityGroupResponse2F7B6FFC": Object { + "ApiRestApiRefidentitygroupgroupIdMembers049DDFD4": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The group with the given id", + "ParentId": Object { + "Ref": "ApiRestApiRefidentitygroupGroupId4E7457BA", + }, + "PathPart": "members", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefidentitygroupgroupIdOPTIONS201BBC23": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "type": "object", + "StatusCode": "200", }, - "Group": Object { - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefidentitygroupGroupId4E7457BA", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitygroupgroupIdPUTA9B2955F": Object { + "DependsOn": Array [ + "ApiRestApiRefidentitygroupgroupIdGETFB136731", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "PUT", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutGroupE85EA883", + "Arn", + ], }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", + "/invocations", ], - "type": "object", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, + "StatusCode": "403", + }, + ], + "OperationName": "PutIdentityGroup", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupRequestA672C9D0", + }, + }, + "RequestParameters": Object { + "method.request.path.groupId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefidentitygroupGroupId4E7457BA", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitygroupgroupIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdCBC14502": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutGroupE85EA883", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/identity/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitygroupgroupIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdE6BEA121": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutGroupE85EA883", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/identity/group/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupRequestA672C9D0": Object { + "Properties": Object { + "ContentType": "application/json", + "Description": "Details about the new group", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "Schema": Object { + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": Object { "GroupIdentifier": Object { "properties": Object { "groupId": Object { @@ -10908,16 +10532,6 @@ Object { }, "type": "array", }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, "description": Object { "description": "A description of the group", "maxLength": 2048, @@ -10938,11 +10552,6 @@ Object { }, "type": "array", }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, "updatedTimestamp": Object { "maxLength": 64, "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", @@ -10950,31 +10559,18 @@ Object { }, }, "required": Array [ - "apiAccessPolicyIds", "claims", - "groupId", - "members", + "apiAccessPolicyIds", ], - "title": "GetIdentityGroupResponse", + "title": "PutIdentityGroupRequest", "type": "object", }, }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefidentitygroupgroupIdMembers049DDFD4": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefidentitygroupGroupId4E7457BA", - }, - "PathPart": "members", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefidentitygroupgroupIdOPTIONS201BBC23": Object { + "ApiRestApiRefidentitygroupgroupIdmembersOPTIONS5464AD55": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11006,7 +10602,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefidentitygroupGroupId4E7457BA", + "Ref": "ApiRestApiRefidentitygroupgroupIdMembers049DDFD4", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -11014,9 +10610,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitygroupgroupIdPUTA9B2955F": Object { + "ApiRestApiRefidentitygroupgroupIdmembersPUT27D0B006": Object { "DependsOn": Array [ - "ApiRestApiRefidentitygroupgroupIdGETFB136731", + "ApiRestApiRefidentitygroupgroupIdmembersOPTIONS5464AD55", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -11038,7 +10634,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaPutGroupE85EA883", + "ApiLambdaPutGroupMembers51CFD1A8", "Arn", ], }, @@ -11049,11 +10645,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupResponse0B09002C", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -11081,10 +10673,10 @@ Object { "StatusCode": "403", }, ], - "OperationName": "PutIdentityGroup", + "OperationName": "PutIdentityGroupMembers", "RequestModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupRequestA672C9D0", + "Ref": "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersRequest8761B07A", }, }, "RequestParameters": Object { @@ -11094,7 +10686,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitygroupGroupId4E7457BA", + "Ref": "ApiRestApiRefidentitygroupgroupIdMembers049DDFD4", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -11102,12 +10694,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitygroupgroupIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdCBC14502": Object { + "ApiRestApiRefidentitygroupgroupIdmembersPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdMembers4D23C54D": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutGroupE85EA883", + "ApiLambdaPutGroupMembers51CFD1A8", "Arn", ], }, @@ -11124,19 +10716,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/PUT/identity/group/*", + "/prod/PUT/identity/group/*/members", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitygroupgroupIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdE6BEA121": Object { + "ApiRestApiRefidentitygroupgroupIdmembersPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdMembers36C0F51B": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutGroupE85EA883", + "ApiLambdaPutGroupMembers51CFD1A8", "Arn", ], }, @@ -11153,371 +10745,50 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/PUT/identity/group/*", + "/test-invoke-stage/PUT/identity/group/*/members", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupRequestA672C9D0": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitygroupgroupIdGetIdentityGroupResponse2F7B6FFC", - ], + "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersRequest8761B07A": Object { "Properties": Object { "ContentType": "application/json", - "Description": "Details about the new group", + "Description": "Details about the members to include", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "GroupIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "groupId", - ], - "type": "object", - }, - "GroupMembers": Object { - "properties": Object { - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "members", - ], - "type": "object", - }, - }, "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", + "members": Object { + "description": "The members that belong to this group, defined by values of preferred_username.", "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, "type": "array", }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "claims", - "apiAccessPolicyIds", - ], - "title": "PutIdentityGroupRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupResponse0B09002C": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitygroupgroupIdPutIdentityGroupRequestA672C9D0", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated group", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Group": Object { - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", - ], - "type": "object", - }, - "GroupIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "groupId", - ], - "type": "object", - }, - "GroupMembers": Object { - "properties": Object { - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "members", - ], - "type": "object", - }, - }, - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, }, "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", "members", ], - "title": "PutIdentityGroupResponse", + "title": "PutIdentityGroupMembersRequest", "type": "object", }, }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefidentitygroupgroupIdmembersOPTIONS5464AD55": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdMembers049DDFD4", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentitygroupgroupIdmembersPUT27D0B006": Object { + "ApiRestApiRefidentitymachineGET36805FE0": Object { "DependsOn": Array [ - "ApiRestApiRefidentitygroupgroupIdmembersOPTIONS5464AD55", + "ApiRestApiRefidentitymachineOPTIONS4486C7C8", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "PUT", + "HttpMethod": "GET", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -11532,7 +10803,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaPutGroupMembers51CFD1A8", + "ApiLambdaListMachineBB3E3337", "Arn", ], }, @@ -11543,11 +10814,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersResponseD768D61A", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -11558,37 +10825,18 @@ Object { }, "StatusCode": "400", }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, ], - "OperationName": "PutIdentityGroupMembers", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersRequest8761B07A", - }, - }, + "OperationName": "ListIdentityMachines", "RequestParameters": Object { - "method.request.path.groupId": true, + "method.request.querystring.limit": false, + "method.request.querystring.nextToken": false, + "method.request.querystring.pageSize": false, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitygroupgroupIdMembers049DDFD4", + "Ref": "ApiRestApiRefidentityMachine1872D5A1", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -11596,12 +10844,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitygroupgroupIdmembersPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdMembers4D23C54D": Object { + "ApiRestApiRefidentitymachineGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineCE116A23": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutGroupMembers51CFD1A8", + "ApiLambdaListMachineBB3E3337", "Arn", ], }, @@ -11618,19 +10866,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/PUT/identity/group/*/members", + "/prod/GET/identity/machine", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitygroupgroupIdmembersPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityGroupGroupIdMembers36C0F51B": Object { + "ApiRestApiRefidentitymachineGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineFB958356": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaPutGroupMembers51CFD1A8", + "ApiLambdaListMachineBB3E3337", "Arn", ], }, @@ -11647,245 +10895,265 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/PUT/identity/group/*/members", + "/test-invoke-stage/GET/identity/machine", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersRequest8761B07A": Object { + "ApiRestApiRefidentitymachineMachineId0C13A352": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the members to include", + "ParentId": Object { + "Ref": "ApiRestApiRefidentityMachine1872D5A1", + }, + "PathPart": "{machineId}", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefidentitymachineOPTIONS4486C7C8": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "type": "array", + "StatusCode": "200", }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", }, - "required": Array [ - "members", + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefidentityMachine1872D5A1", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitymachinemachineIdDELETEApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineId0AC65DB2": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteMachineF7253F98", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/DELETE/identity/machine/*", + ], ], - "title": "PutIdentityGroupMembersRequest", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitymachinemachineIdDELETEApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineId4BFAC44B": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteMachineF7253F98", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/identity/machine/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersResponseD768D61A": Object { + "ApiRestApiRefidentitymachinemachineIdDELETEF62CEC90": Object { "DependsOn": Array [ - "ApiRestApiRefidentitygroupgroupIdmembersPutIdentityGroupMembersRequest8761B07A", + "ApiRestApiRefidentitymachinemachineIdPUTB351E2EB", ], "Properties": Object { - "ContentType": "application/json", - "Description": "The updated group", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteMachineF7253F98", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, - "Group": Object { - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "type": "array", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", - ], - "type": "object", }, - "GroupIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "groupId", - ], - "type": "object", - }, - "GroupMembers": Object { - "properties": Object { - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "members", - ], - "type": "object", }, + "StatusCode": "403", }, - "properties": Object { - "apiAccessPolicyIds": Object { - "description": "The api access policies associated with the group. These policy ids map to sets of api paths to define what apis the group may call.", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + ], + "OperationName": "DeleteIdentityMachine", + "RequestParameters": Object { + "method.request.path.machineId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitymachinemachineIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdAEE8BC05": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetMachine547DE9F5", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "array", - }, - "autoAssignUsers": Object { - "description": "Flag to automatically add users to this group", - "type": "boolean", - }, - "claims": Object { - "description": "The identity provider claims or machine ids associated with this group. If a user has one or more of these claims, they are considered part of the group", - "items": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the group", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "groupId": Object { - "description": "Identifier for the group", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "members": Object { - "description": "The members that belong to this group, defined by values of preferred_username.", - "items": Object { - "type": "string", + "/prod/GET/identity/machine/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitymachinemachineIdGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdDD938BB2": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetMachine547DE9F5", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "array", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "apiAccessPolicyIds", - "claims", - "groupId", - "members", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/identity/machine/*", + ], ], - "title": "PutIdentityGroupMembersResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachineGET36805FE0": Object { + "ApiRestApiRefidentitymachinemachineIdGETDA6C4C27": Object { "DependsOn": Array [ - "ApiRestApiRefidentitymachineOPTIONS4486C7C8", + "ApiRestApiRefidentitymachinemachineIdOPTIONS871B53D3", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -11907,7 +11175,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaListMachineBB3E3337", + "ApiLambdaGetMachine547DE9F5", "Arn", ], }, @@ -11917,13 +11185,17 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefidentitymachineListIdentityMachinesResponseD5A2FA1B", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "200", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -11931,20 +11203,18 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "400", + "StatusCode": "404", }, ], - "OperationName": "ListIdentityMachines", + "OperationName": "GetIdentityMachine", "RequestParameters": Object { - "method.request.querystring.limit": false, - "method.request.querystring.nextToken": false, - "method.request.querystring.pageSize": false, + "method.request.path.machineId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentityMachine1872D5A1", + "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -11952,12 +11222,54 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachineGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineCE116A23": Object { + "ApiRestApiRefidentitymachinemachineIdOPTIONS871B53D3": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitymachinemachineIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineId051770C2": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaListMachineBB3E3337", + "ApiLambdaPutMachine4AEF87E6", "Arn", ], }, @@ -11974,19 +11286,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/identity/machine", + "/prod/PUT/identity/machine/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachineGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineFB958356": Object { + "ApiRestApiRefidentitymachinemachineIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineId2E2619BC": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaListMachineBB3E3337", + "ApiLambdaPutMachine4AEF87E6", "Arn", ], }, @@ -12003,110 +11315,107 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/identity/machine", + "/test-invoke-stage/PUT/identity/machine/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachineListIdentityMachinesResponseD5A2FA1B": Object { + "ApiRestApiRefidentitymachinemachineIdPUTB351E2EB": Object { + "DependsOn": Array [ + "ApiRestApiRefidentitymachinemachineIdGETDA6C4C27", + ], "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all machines", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "HttpMethod": "PUT", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutMachine4AEF87E6", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, - "Machine": Object { - "properties": Object { - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "machineId", - ], - "type": "object", }, - "MachineEntity": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "required": Array [ - "machineId", - ], - "type": "object", }, + "StatusCode": "403", + }, + ], + "OperationName": "PutIdentityMachine", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineRequestC4A421A1", + }, + }, + "RequestParameters": Object { + "method.request.path.machineId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineRequestC4A421A1": Object { + "Properties": Object { + "ContentType": "application/json", + "Description": "Details about the new machine", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "Schema": Object { + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": Object { "MachineIdentifier": Object { "properties": Object { "machineId": Object { @@ -12122,87 +11431,112 @@ Object { ], "type": "object", }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, }, "properties": Object { - "machines": Object { - "items": Object { - "$ref": "#/definitions/MachineEntity", - }, - "type": "array", + "description": Object { + "description": "A description of the machine", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", }, - "nextToken": Object { + "machineId": Object { + "description": "Identifier for the machine", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "totalItems": Object { - "type": "number", + "updatedTimestamp": Object { + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "type": "string", }, }, - "required": Array [ - "machines", - ], - "title": "ListIdentityMachinesResponse", + "title": "PutIdentityMachineRequest", "type": "object", }, }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefidentitymachineMachineId0C13A352": Object { + "ApiRestApiRefidentitymachinemachineIdToken840321AD": Object { "Properties": Object { "ParentId": Object { - "Ref": "ApiRestApiRefidentityMachine1872D5A1", + "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", }, - "PathPart": "{machineId}", + "PathPart": "token", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, "Type": "AWS::ApiGateway::Resource", }, - "ApiRestApiRefidentitymachineOPTIONS4486C7C8": Object { + "ApiRestApiRefidentitymachinemachineIdtokenGET3BF5DB30": Object { + "DependsOn": Array [ + "ApiRestApiRefidentitymachinemachineIdtokenOPTIONSAA03C9EB", + ], "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaListTokenC0C96EED", + "Arn", + ], + }, + "/invocations", + ], + ], }, - "Type": "MOCK", }, "MethodResponses": Array [ Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, + }, + "StatusCode": "404", + }, ], + "OperationName": "ListIdentityMachineTokens", + "RequestParameters": Object { + "method.request.path.machineId": true, + "method.request.querystring.limit": false, + "method.request.querystring.nextToken": false, + "method.request.querystring.pageSize": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentityMachine1872D5A1", + "Ref": "ApiRestApiRefidentitymachinemachineIdToken840321AD", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -12210,12 +11544,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdDELETEApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineId0AC65DB2": Object { + "ApiRestApiRefidentitymachinemachineIdtokenGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdToken55E961A5": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteMachineF7253F98", + "ApiLambdaListTokenC0C96EED", "Arn", ], }, @@ -12232,19 +11566,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/DELETE/identity/machine/*", + "/prod/GET/identity/machine/*/token", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdDELETEApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineId4BFAC44B": Object { + "ApiRestApiRefidentitymachinemachineIdtokenGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdTokenF0E14B4C": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteMachineF7253F98", + "ApiLambdaListTokenC0C96EED", "Arn", ], }, @@ -12261,38 +11595,92 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/DELETE/identity/machine/*", + "/test-invoke-stage/GET/identity/machine/*/token", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdDELETEF62CEC90": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdPUTB351E2EB", - ], + "ApiRestApiRefidentitymachinemachineIdtokenOPTIONSAA03C9EB": Object { "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "DELETE", + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefidentitymachinemachineIdToken840321AD", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefidentitymachinemachineIdToken840321AD", + }, + "PathPart": "{tokenId}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefidentitymachinemachineIdtokentokenIdDELETE3A79C2B6": Object { + "DependsOn": Array [ + "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUT0682B703", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteMachineF7253F98", + "ApiLambdaDeleteToken1CF84CD4", "Arn", ], }, @@ -12303,11 +11691,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdDeleteIdentityMachineResponseC12CCC74", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -12335,15 +11719,16 @@ Object { "StatusCode": "403", }, ], - "OperationName": "DeleteIdentityMachine", + "OperationName": "DeleteIdentityMachineToken", "RequestParameters": Object { "method.request.path.machineId": true, + "method.request.path.tokenId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -12351,131 +11736,70 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdDeleteIdentityMachineResponseC12CCC74": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineResponseE0D5E80B", - ], + "ApiRestApiRefidentitymachinemachineIdtokentokenIdDELETEApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineIdTokenTokenIdA4514132": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The machine that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteToken1CF84CD4", + "Arn", + ], }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "object", - }, - "Machine": Object { - "properties": Object { - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "/prod/DELETE/identity/machine/*/token/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitymachinemachineIdtokentokenIdDELETEApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineIdTokenTokenId10E12C6F": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteToken1CF84CD4", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "machineId", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/DELETE/identity/machine/*/token/*", + ], ], - "title": "DeleteIdentityMachineResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdAEE8BC05": Object { + "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdTokenTokenId373907CE": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetMachine547DE9F5", + "ApiLambdaGetToken6A1EACD6", "Arn", ], }, @@ -12492,19 +11816,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/identity/machine/*", + "/prod/GET/identity/machine/*/token/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdDD938BB2": Object { + "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdTokenTokenId2E20E11B": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetMachine547DE9F5", + "ApiLambdaGetToken6A1EACD6", "Arn", ], }, @@ -12521,16 +11845,16 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/identity/machine/*", + "/test-invoke-stage/GET/identity/machine/*/token/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdGETDA6C4C27": Object { + "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETF412C82F": Object { "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdOPTIONS871B53D3", + "ApiRestApiRefidentitymachinemachineIdtokentokenIdOPTIONS812A5FED", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -12552,7 +11876,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetMachine547DE9F5", + "ApiLambdaGetToken6A1EACD6", "Arn", ], }, @@ -12563,11 +11887,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdGetIdentityMachineResponseEB860E79", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -12587,15 +11907,16 @@ Object { "StatusCode": "404", }, ], - "OperationName": "GetIdentityMachine", + "OperationName": "GetIdentityMachineToken", "RequestParameters": Object { "method.request.path.machineId": true, + "method.request.path.tokenId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -12603,124 +11924,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdGetIdentityMachineResponseEB860E79": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The machine with the given id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Machine": Object { - "properties": Object { - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "title": "GetIdentityMachineResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitymachinemachineIdOPTIONS871B53D3": Object { + "ApiRestApiRefidentitymachinemachineIdtokentokenIdOPTIONS812A5FED": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -12752,7 +11958,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -12760,67 +11966,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineId051770C2": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutMachine4AEF87E6", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/identity/machine/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentitymachinemachineIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineId2E2619BC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutMachine4AEF87E6", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/identity/machine/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentitymachinemachineIdPUTB351E2EB": Object { + "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUT0682B703": Object { "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdGETDA6C4C27", + "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETF412C82F", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -12842,7 +11990,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaPutMachine4AEF87E6", + "ApiLambdaPutTokenE98F4763", "Arn", ], }, @@ -12853,11 +12001,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineResponseE0D5E80B", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -12885,20 +12029,21 @@ Object { "StatusCode": "403", }, ], - "OperationName": "PutIdentityMachine", + "OperationName": "PutIdentityMachineToken", "RequestModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineRequestC4A421A1", + "Ref": "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenRequest162231C7", }, }, "RequestParameters": Object { "method.request.path.machineId": true, + "method.request.path.tokenId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", + "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -12906,13 +12051,68 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineRequestC4A421A1": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdGetIdentityMachineResponseEB860E79", - ], + "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineIdTokenTokenId8D912A9B": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutTokenE98F4763", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/PUT/identity/machine/*/token/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineIdTokenTokenId24FBCFEE": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutTokenE98F4763", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/identity/machine/*/token/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenRequest162231C7": Object { "Properties": Object { "ContentType": "application/json", - "Description": "Details about the new machine", + "Description": "Details about the new machine token", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, @@ -12934,117 +12134,69 @@ Object { ], "type": "object", }, + "TokenIdentifier": Object { + "properties": Object { + "machineId": Object { + "description": "Identifier for the machine", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "tokenId": Object { + "description": "Identifier of the token", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + }, + "required": Array [ + "machineId", + "tokenId", + ], + "type": "object", + }, }, "properties": Object { - "description": Object { - "description": "A description of the machine", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "authToken": Object { + "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", "type": "string", }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", + "authUrl": Object { + "description": "The authentication url used to authorize the token", "type": "string", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "clientId": Object { + "description": "The clientId of the token.", "type": "string", }, - }, - "title": "PutIdentityMachineRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineResponseE0D5E80B": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdPutIdentityMachineRequestC4A421A1", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated machine", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Machine": Object { - "properties": Object { - "token": Object { - "description": "The token to be used by the machine to do API calls", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", + "clientSecret": Object { + "description": "The clientSecret of the token, only available during initial create response.", "type": "string", }, - "createdTimestamp": Object { + "enabled": Object { + "description": "Define whether the token is active or not", + "type": "boolean", + }, + "expiration": Object { + "description": "The expiration date of the token", "maxLength": 64, "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", "type": "string", }, - "token": Object { - "description": "The token to be used by the machine to do API calls", + "machineId": Object { + "description": "Identifier for the machine", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "updatedBy": Object { + "tokenId": Object { + "description": "Identifier of the token", "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, "updatedTimestamp": Object { @@ -13052,31 +12204,24 @@ Object { "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", "type": "string", }, + "username": Object { + "description": "The username associated with the token.", + "type": "string", + }, }, "required": Array [ - "machineId", + "enabled", + "expiration", ], - "title": "PutIdentityMachineResponse", + "title": "PutIdentityMachineTokenRequest", "type": "object", }, }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefidentitymachinemachineIdToken840321AD": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefidentitymachineMachineId0C13A352", - }, - "PathPart": "token", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefidentitymachinemachineIdtokenGET3BF5DB30": Object { + "ApiRestApiRefidentityproviderGET4BA7693A": Object { "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokenOPTIONSAA03C9EB", + "ApiRestApiRefidentityproviderOPTIONSBC900877", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -13098,7 +12243,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaListTokenC0C96EED", + "ApiLambdaListIdentityProviderFED98AC8", "Arn", ], }, @@ -13109,11 +12254,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokenListIdentityMachineTokensResponse37E46971", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -13124,18 +12265,9 @@ Object { }, "StatusCode": "400", }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, ], - "OperationName": "ListIdentityMachineTokens", + "OperationName": "ListIdentityProviders", "RequestParameters": Object { - "method.request.path.machineId": true, "method.request.querystring.limit": false, "method.request.querystring.nextToken": false, "method.request.querystring.pageSize": false, @@ -13144,7 +12276,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdToken840321AD", + "Ref": "ApiRestApiRefidentityProviderC27C8DD3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -13152,12 +12284,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdtokenGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdToken55E961A5": Object { + "ApiRestApiRefidentityproviderGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProvider1D8EA49A": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaListTokenC0C96EED", + "ApiLambdaListIdentityProviderFED98AC8", "Arn", ], }, @@ -13174,19 +12306,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/identity/machine/*/token", + "/prod/GET/identity/provider", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdtokenGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdTokenF0E14B4C": Object { + "ApiRestApiRefidentityproviderGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProvider53DA460B": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaListTokenC0C96EED", + "ApiLambdaListIdentityProviderFED98AC8", "Arn", ], }, @@ -13203,362 +12335,105 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/identity/machine/*/token", + "/test-invoke-stage/GET/identity/provider", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdtokenListIdentityMachineTokensResponse37E46971": Object { + "ApiRestApiRefidentityproviderOPTIONSBC900877": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The machine tokens with the given id", + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", + }, + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefidentityProviderC27C8DD3", + }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentityprovideridentityProviderIdDELETE52677EC4": Object { + "DependsOn": Array [ + "ApiRestApiRefidentityprovideridentityProviderIdPUT82434A45", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "DELETE", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaDeleteIdentityProvider40284824", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "Token": Object { - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "type": "object", - }, - "TokenEntity": Object { - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "type": "object", - }, - "TokenIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - "tokenId", - ], - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "tokens": Object { - "items": Object { - "$ref": "#/definitions/TokenEntity", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "tokens", - ], - "title": "ListIdentityMachineTokensResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitymachinemachineIdtokenOPTIONSAA03C9EB": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdToken840321AD", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdToken840321AD", - }, - "PathPart": "{tokenId}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdDELETE3A79C2B6": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUT0682B703", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "DELETE", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteToken1CF84CD4", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokentokenIdDeleteIdentityMachineTokenResponse35F6730C", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, "StatusCode": "404", @@ -13572,16 +12447,15 @@ Object { "StatusCode": "403", }, ], - "OperationName": "DeleteIdentityMachineToken", + "OperationName": "DeleteIdentityProvider", "RequestParameters": Object { - "method.request.path.machineId": true, - "method.request.path.tokenId": true, + "method.request.path.identityProviderId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", + "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -13589,12 +12463,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdDELETEApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineIdTokenTokenIdA4514132": Object { + "ApiRestApiRefidentityprovideridentityProviderIdDELETEApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityProviderIdentityProviderId321F1059": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteToken1CF84CD4", + "ApiLambdaDeleteIdentityProvider40284824", "Arn", ], }, @@ -13611,19 +12485,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/DELETE/identity/machine/*/token/*", + "/prod/DELETE/identity/provider/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdDELETEApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityMachineMachineIdTokenTokenId10E12C6F": Object { + "ApiRestApiRefidentityprovideridentityProviderIdDELETEApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityProviderIdentityProviderIdF6763014": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteToken1CF84CD4", + "ApiLambdaDeleteIdentityProvider40284824", "Arn", ], }, @@ -13640,233 +12514,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/DELETE/identity/machine/*/token/*", + "/test-invoke-stage/DELETE/identity/provider/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdDeleteIdentityMachineTokenResponse35F6730C": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenResponse5AF9CC09", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The machine token that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "Token": Object { - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "type": "object", - }, - "TokenIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - "tokenId", - ], - "type": "object", - }, - }, - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "title": "DeleteIdentityMachineTokenResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdTokenTokenId373907CE": Object { + "ApiRestApiRefidentityprovideridentityProviderIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProviderIdentityProviderId72A75919": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetToken6A1EACD6", + "ApiLambdaGetIdentityProvider9A3BC28A", "Arn", ], }, @@ -13883,19 +12543,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/identity/machine/*/token/*", + "/prod/GET/identity/provider/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityMachineMachineIdTokenTokenId2E20E11B": Object { + "ApiRestApiRefidentityprovideridentityProviderIdGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProviderIdentityProviderId3FEAF309": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetToken6A1EACD6", + "ApiLambdaGetIdentityProvider9A3BC28A", "Arn", ], }, @@ -13912,16 +12572,16 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/identity/machine/*/token/*", + "/test-invoke-stage/GET/identity/provider/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETF412C82F": Object { + "ApiRestApiRefidentityprovideridentityProviderIdGETBC87CAEF": Object { "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokentokenIdOPTIONS812A5FED", + "ApiRestApiRefidentityprovideridentityProviderIdOPTIONS705D1BF9", ], "Properties": Object { "AuthorizationType": "CUSTOM", @@ -13943,7 +12603,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetToken6A1EACD6", + "ApiLambdaGetIdentityProvider9A3BC28A", "Arn", ], }, @@ -13953,13 +12613,17 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokentokenIdGetIdentityMachineTokenResponseB95DAE47", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "200", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -13967,7 +12631,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "400", + "StatusCode": "404", }, Object { "ResponseModels": Object { @@ -13975,19 +12639,18 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "404", + "StatusCode": "403", }, ], - "OperationName": "GetIdentityMachineToken", + "OperationName": "GetIdentityProvider", "RequestParameters": Object { - "method.request.path.machineId": true, - "method.request.path.tokenId": true, + "method.request.path.identityProviderId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", + "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -13995,2329 +12658,58 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdGetIdentityMachineTokenResponseB95DAE47": Object { + "ApiRestApiRefidentityprovideridentityProviderIdOPTIONS705D1BF9": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The machine token with the given id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "Token": Object { - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "type": "object", - }, - "TokenIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - "tokenId", - ], - "type": "object", - }, - }, - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "title": "GetIdentityMachineTokenResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdOPTIONS812A5FED": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", + "StatusCode": "200", }, ], "RequestTemplates": Object { "application/json": "{ statusCode: 200 }", }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUT0682B703": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokentokenIdGETF412C82F", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutTokenE98F4763", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenResponse5AF9CC09", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "PutIdentityMachineToken", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenRequest162231C7", - }, - }, - "RequestParameters": Object { - "method.request.path.machineId": true, - "method.request.path.tokenId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefidentitymachinemachineIdtokenTokenId91C9F39C", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineIdTokenTokenId8D912A9B": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutTokenE98F4763", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/identity/machine/*/token/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityMachineMachineIdTokenTokenId24FBCFEE": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutTokenE98F4763", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/identity/machine/*/token/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenRequest162231C7": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokentokenIdGetIdentityMachineTokenResponseB95DAE47", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the new machine token", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "TokenIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - "tokenId", - ], - "type": "object", - }, - }, - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "enabled", - "expiration", - ], - "title": "PutIdentityMachineTokenRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenResponse5AF9CC09": Object { - "DependsOn": Array [ - "ApiRestApiRefidentitymachinemachineIdtokentokenIdPutIdentityMachineTokenRequest162231C7", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated machine token", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "MachineIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - ], - "type": "object", - }, - "Token": Object { - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "type": "object", - }, - "TokenIdentifier": Object { - "properties": Object { - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "machineId", - "tokenId", - ], - "type": "object", - }, - }, - "properties": Object { - "authToken": Object { - "description": "The base64 encoded clientId and clientSecret, only available during initial create response.", - "type": "string", - }, - "authUrl": Object { - "description": "The authentication url used to authorize the token", - "type": "string", - }, - "clientId": Object { - "description": "The clientId of the token.", - "type": "string", - }, - "clientSecret": Object { - "description": "The clientSecret of the token, only available during initial create response.", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "enabled": Object { - "description": "Define whether the token is active or not", - "type": "boolean", - }, - "expiration": Object { - "description": "The expiration date of the token", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "machineId": Object { - "description": "Identifier for the machine", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "tokenId": Object { - "description": "Identifier of the token", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "username": Object { - "description": "The username associated with the token.", - "type": "string", - }, - }, - "required": Array [ - "clientId", - "enabled", - "expiration", - "machineId", - "tokenId", - "username", - ], - "title": "PutIdentityMachineTokenResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentityproviderGET4BA7693A": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityproviderOPTIONSBC900877", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaListIdentityProviderFED98AC8", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityproviderListIdentityProvidersResponseD3B3F9B0", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - ], - "OperationName": "ListIdentityProviders", - "RequestParameters": Object { - "method.request.querystring.limit": false, - "method.request.querystring.nextToken": false, - "method.request.querystring.pageSize": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefidentityProviderC27C8DD3", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityproviderGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProvider1D8EA49A": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListIdentityProviderFED98AC8", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/identity/provider", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityproviderGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProvider53DA460B": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListIdentityProviderFED98AC8", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/identity/provider", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityproviderListIdentityProvidersResponseD3B3F9B0": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all providers", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "IdentityProvider": Object { - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "type": "object", - }, - "IdentityProviderEntity": Object { - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "type": "object", - }, - "IdentityProviderIdentifier": Object { - "properties": Object { - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "identityProviderId", - ], - "type": "object", - }, - "IdentityProviderTypeEnum": Object { - "description": "The type of identity provider, SAML, OIDC, etc", - "enum": Array [ - "SAML", - "OIDC", - "Google", - "LoginWithAmazon", - ], - "type": "string", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "providers": Object { - "items": Object { - "$ref": "#/definitions/IdentityProviderEntity", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "providers", - ], - "title": "ListIdentityProvidersResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentityproviderOPTIONSBC900877": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefidentityProviderC27C8DD3", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityprovideridentityProviderIdDELETE52677EC4": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityprovideridentityProviderIdPUT82434A45", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "DELETE", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteIdentityProvider40284824", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityprovideridentityProviderIdDeleteIdentityProviderResponse69246290", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "DeleteIdentityProvider", - "RequestParameters": Object { - "method.request.path.identityProviderId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityprovideridentityProviderIdDELETEApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityProviderIdentityProviderId321F1059": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteIdentityProvider40284824", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/DELETE/identity/provider/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityprovideridentityProviderIdDELETEApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88DELETEIdentityProviderIdentityProviderIdF6763014": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaDeleteIdentityProvider40284824", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/DELETE/identity/provider/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityprovideridentityProviderIdDeleteIdentityProviderResponse69246290": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderResponse28156E94", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the deleted identity provider", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "IdentityProvider": Object { - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "type": "object", - }, - "IdentityProviderIdentifier": Object { - "properties": Object { - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "identityProviderId", - ], - "type": "object", - }, - "IdentityProviderTypeEnum": Object { - "description": "The type of identity provider, SAML, OIDC, etc", - "enum": Array [ - "SAML", - "OIDC", - "Google", - "LoginWithAmazon", - ], - "type": "string", - }, - }, - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "title": "DeleteIdentityProviderResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentityprovideridentityProviderIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProviderIdentityProviderId72A75919": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetIdentityProvider9A3BC28A", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/identity/provider/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityprovideridentityProviderIdGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityProviderIdentityProviderId3FEAF309": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetIdentityProvider9A3BC28A", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/identity/provider/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityprovideridentityProviderIdGETBC87CAEF": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityprovideridentityProviderIdOPTIONS705D1BF9", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetIdentityProvider9A3BC28A", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityprovideridentityProviderIdGetIdentityProviderResponse09895174", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "GetIdentityProvider", - "RequestParameters": Object { - "method.request.path.identityProviderId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityprovideridentityProviderIdGetIdentityProviderResponse09895174": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the connected identity provider", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "IdentityProvider": Object { - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "type": "object", - }, - "IdentityProviderIdentifier": Object { - "properties": Object { - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "identityProviderId", - ], - "type": "object", - }, - "IdentityProviderTypeEnum": Object { - "description": "The type of identity provider, SAML, OIDC, etc", - "enum": Array [ - "SAML", - "OIDC", - "Google", - "LoginWithAmazon", - ], - "type": "string", - }, - }, - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "title": "GetIdentityProviderResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentityprovideridentityProviderIdOPTIONS705D1BF9": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityprovideridentityProviderIdPUT82434A45": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityprovideridentityProviderIdGETBC87CAEF", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "PUT", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutIdentityProvider75803F69", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderResponse28156E94", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "PutIdentityProvider", - "RequestModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderRequestDE854E64", - }, - }, - "RequestParameters": Object { - "method.request.path.identityProviderId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityprovideridentityProviderIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityProviderIdentityProviderId3A199DAF": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutIdentityProvider75803F69", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/identity/provider/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityprovideridentityProviderIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityProviderIdentityProviderId7398BF95": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutIdentityProvider75803F69", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/identity/provider/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderRequestDE854E64": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityprovideridentityProviderIdGetIdentityProviderResponse09895174", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the identity provider to connect", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "IdentityProviderIdentifier": Object { - "properties": Object { - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "identityProviderId", - ], - "type": "object", - }, - "IdentityProviderTypeEnum": Object { - "description": "The type of identity provider, SAML, OIDC, etc", - "enum": Array [ - "SAML", - "OIDC", - "Google", - "LoginWithAmazon", - ], - "type": "string", - }, - }, - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "type", - "name", - "details", - ], - "title": "PutIdentityProviderRequest", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderResponse28156E94": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderRequestDE854E64", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the connected provider", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "IdentityProvider": Object { - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "type": "object", - }, - "IdentityProviderIdentifier": Object { - "properties": Object { - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "identityProviderId", - ], - "type": "object", - }, - "IdentityProviderTypeEnum": Object { - "description": "The type of identity provider, SAML, OIDC, etc", - "enum": Array [ - "SAML", - "OIDC", - "Google", - "LoginWithAmazon", - ], - "type": "string", - }, - }, - "properties": Object { - "attributeMapping": Object { - "additionalProperties": Object { - "type": "string", - }, - "description": "The identity provider attribute mapping", - "type": "object", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "description": "A description of the identity provider", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "details": Object { - "description": "Parameters to configure the identity provider", - }, - "enabled": Object { - "default": true, - "description": "Specify if the identity provider is enabled or not", - "type": "boolean", - }, - "identifiers": Object { - "description": "A list of identity provider identifiers", - "items": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "type": "array", - }, - "identityProviderId": Object { - "description": "The id of identity provider", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the identity provider", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "$ref": "#/definitions/IdentityProviderTypeEnum", - "description": "The type of identity provider, SAML, OIDC, etc", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, + "StatusCode": "200", }, - "required": Array [ - "details", - "identityProviderId", - "name", - "type", - ], - "title": "PutIdentityProviderResponse", - "type": "object", + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentityrequestGET5FCEA4F3": Object { + "ApiRestApiRefidentityprovideridentityProviderIdPUT82434A45": Object { "DependsOn": Array [ - "ApiRestApiRefidentityrequestOPTIONS9C24B84E", + "ApiRestApiRefidentityprovideridentityProviderIdGETBC87CAEF", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "GET", + "HttpMethod": "PUT", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -16332,7 +12724,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaAccessRequestList86CDA54F", + "ApiLambdaPutIdentityProvider75803F69", "Arn", ], }, @@ -16342,13 +12734,17 @@ Object { }, }, "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, Object { "ResponseModels": Object { "application/json": Object { - "Ref": "ApiRestApiRefidentityrequestListIdentityRequestsResponseA1F7B46F", + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "200", + "StatusCode": "400", }, Object { "ResponseModels": Object { @@ -16356,7 +12752,7 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "400", + "StatusCode": "404", }, Object { "ResponseModels": Object { @@ -16364,20 +12760,23 @@ Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, }, - "StatusCode": "404", + "StatusCode": "403", }, ], - "OperationName": "ListIdentityRequests", + "OperationName": "PutIdentityProvider", + "RequestModels": Object { + "application/json": Object { + "Ref": "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderRequestDE854E64", + }, + }, "RequestParameters": Object { - "method.request.querystring.limit": false, - "method.request.querystring.nextToken": false, - "method.request.querystring.pageSize": false, + "method.request.path.identityProviderId": true, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefidentityRequest6D83A7B0", + "Ref": "ApiRestApiRefIdentityProviderIdentityProviderIdC2C4FFF3", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -16385,12 +12784,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentityrequestGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityRequest54DBCA87": Object { + "ApiRestApiRefidentityprovideridentityProviderIdPUTApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityProviderIdentityProviderId3A199DAF": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaAccessRequestList86CDA54F", + "ApiLambdaPutIdentityProvider75803F69", "Arn", ], }, @@ -16407,19 +12806,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/identity/request", + "/prod/PUT/identity/provider/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentityrequestGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityRequestFD84E12B": Object { + "ApiRestApiRefidentityprovideridentityProviderIdPUTApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88PUTIdentityProviderIdentityProviderId7398BF95": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaAccessRequestList86CDA54F", + "ApiLambdaPutIdentityProvider75803F69", "Arn", ], }, @@ -16436,195 +12835,261 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/GET/identity/request", + "/test-invoke-stage/PUT/identity/provider/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentityrequestGroupId7AA0D863": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefidentityRequest6D83A7B0", - }, - "PathPart": "{groupId}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefidentityrequestListIdentityRequestsResponseA1F7B46F": Object { + "ApiRestApiRefidentityprovideridentityProviderIdPutIdentityProviderRequestDE854E64": Object { "Properties": Object { "ContentType": "application/json", - "Description": "The access requests with the given id", + "Description": "Details about the identity provider to connect", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", "definitions": Object { - "AccessRequest": Object { + "IdentityProviderIdentifier": Object { "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", + "identityProviderId": Object { + "description": "The id of identity provider", "maxLength": 256, "minLength": 2, "pattern": "^[a-z][a-z_0-9]*$", "type": "string", }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, }, "required": Array [ - "groupId", - "userId", + "identityProviderId", ], "type": "object", }, - "AccessRequestEntity": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", + "IdentityProviderTypeEnum": Object { + "description": "The type of identity provider, SAML, OIDC, etc", + "enum": Array [ + "SAML", + "OIDC", + "Google", + "LoginWithAmazon", ], - "type": "object", + "type": "string", }, - "AccessRequestIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, + }, + "properties": Object { + "attributeMapping": Object { + "additionalProperties": Object { + "type": "string", }, - "required": Array [ - "groupId", - "userId", - ], + "description": "The identity provider attribute mapping", "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, + "description": Object { + "description": "A description of the identity provider", + "maxLength": 2048, + "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", + "type": "string", + }, + "details": Object { + "description": "Parameters to configure the identity provider", + }, + "enabled": Object { + "default": true, + "description": "Specify if the identity provider is enabled or not", + "type": "boolean", + }, + "identifiers": Object { + "description": "A list of identity provider identifiers", + "items": Object { + "maxLength": 256, + "pattern": "[\\\\w\\\\s+=.@-]+", + "type": "string", }, - "type": "object", + "type": "array", }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", + "identityProviderId": Object { + "description": "The id of identity provider", + "maxLength": 256, + "minLength": 2, + "pattern": "^[a-z][a-z_0-9]*$", + "type": "string", + }, + "name": Object { + "description": "The name of the identity provider", + "maxLength": 2048, + "minLength": 2, + "pattern": "^[\\\\w _-]*$", + "type": "string", + }, + "type": Object { + "$ref": "#/definitions/IdentityProviderTypeEnum", + "description": "The type of identity provider, SAML, OIDC, etc", + }, + "updatedTimestamp": Object { + "maxLength": 64, + "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", + "type": "string", + }, + }, + "required": Array [ + "type", + "name", + "details", + ], + "title": "PutIdentityProviderRequest", + "type": "object", + }, + }, + "Type": "AWS::ApiGateway::Model", + }, + "ApiRestApiRefidentityrequestGET5FCEA4F3": Object { + "DependsOn": Array [ + "ApiRestApiRefidentityrequestOPTIONS9C24B84E", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "totalItems": Object { - "type": "number", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaAccessRequestList86CDA54F", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, + "StatusCode": "400", }, - "properties": Object { - "accessRequests": Object { - "items": Object { - "$ref": "#/definitions/AccessRequestEntity", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", - }, - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", }, + "StatusCode": "404", }, - "required": Array [ - "accessRequests", + ], + "OperationName": "ListIdentityRequests", + "RequestParameters": Object { + "method.request.querystring.limit": false, + "method.request.querystring.nextToken": false, + "method.request.querystring.pageSize": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefidentityRequest6D83A7B0", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefidentityrequestGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityRequest54DBCA87": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaAccessRequestList86CDA54F", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/identity/request", + ], ], - "title": "ListIdentityRequestsResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentityrequestGETApiPermissionTestAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityRequestFD84E12B": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaAccessRequestList86CDA54F", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/identity/request", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefidentityrequestGroupId7AA0D863": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefidentityRequest6D83A7B0", + }, + "PathPart": "{groupId}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", }, "ApiRestApiRefidentityrequestOPTIONS9C24B84E": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -16666,6 +13131,7 @@ Object { }, "ApiRestApiRefidentityrequestgroupIdOPTIONS7C49ED94": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -16798,218 +13264,74 @@ Object { }, "HttpMethod": "DELETE", "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaAccessRequestDelete8BC9A8B4", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityrequestgroupIduserIdDeleteIdentityRequestResponse9CC5FD93", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, - ], - "OperationName": "DeleteIdentityRequest", - "RequestParameters": Object { - "method.request.path.groupId": true, - "method.request.path.userId": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefidentityrequestgroupIdUserId50C05FF9", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefidentityrequestgroupIduserIdDeleteIdentityRequestResponse9CC5FD93": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityrequestgroupIduserIdPutIdentityRequestResponseBE893912", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The AccessRequest that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AccessRequest": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "type": "object", - }, - "AccessRequestIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaAccessRequestDelete8BC9A8B4", + "Arn", + ], }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "object", }, + "StatusCode": "400", }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "StatusCode": "404", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, + "StatusCode": "403", }, - "required": Array [ - "groupId", - "userId", - ], - "title": "DeleteIdentityRequestResponse", - "type": "object", + ], + "OperationName": "DeleteIdentityRequest", + "RequestParameters": Object { + "method.request.path.groupId": true, + "method.request.path.userId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefidentityrequestgroupIdUserId50C05FF9", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, "ApiRestApiRefidentityrequestgroupIduserIdGETApiPermissionAdaIdentityServiceApiRestApiRef3D1E5D88GETIdentityRequestGroupIdUserId97670459": Object { "Properties": Object { @@ -17104,11 +13426,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityrequestgroupIduserIdGetIdentityRequestResponseF356A52C", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -17145,145 +13463,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefidentityrequestgroupIduserIdGetIdentityRequestResponseF356A52C": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The access request with the given ids", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AccessRequest": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "type": "object", - }, - "AccessRequestIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "type": "object", - }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "title": "GetIdentityRequestResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefidentityrequestgroupIduserIdOPTIONS86E7887C": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -17358,11 +13540,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityrequestgroupIduserIdPutIdentityRequestResponseBE893912", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -17463,122 +13641,23 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/PUT/identity/request/*/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefidentityrequestgroupIduserIdPutIdentityRequestRequestD55F53E5": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityrequestgroupIduserIdGetIdentityRequestResponseF356A52C", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "Details about the new AccessRequest", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "AccessRequestIdentifier": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "type": "object", - }, - }, - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "title": "PutIdentityRequestRequest", - "type": "object", + "/test-invoke-stage/PUT/identity/request/*/*", + ], + ], }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentityrequestgroupIduserIdPutIdentityRequestResponseBE893912": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityrequestgroupIduserIdPutIdentityRequestRequestD55F53E5", - ], + "ApiRestApiRefidentityrequestgroupIduserIdPutIdentityRequestRequestD55F53E5": Object { "Properties": Object { "ContentType": "application/json", - "Description": "The created/updated AccessRequest", + "Description": "Details about the new AccessRequest", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", "definitions": Object { - "AccessRequest": Object { - "properties": Object { - "groupId": Object { - "description": "The id of group the user wants access to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "message": Object { - "description": "Access Request Notes", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "userId": Object { - "description": "UserId of user requesting access", - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - }, - "required": Array [ - "groupId", - "userId", - ], - "type": "object", - }, "AccessRequestIdentifier": Object { "properties": Object { "groupId": Object { @@ -17601,43 +13680,8 @@ Object { ], "type": "object", }, - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, }, "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, "groupId": Object { "description": "The id of group the user wants access to", "maxLength": 256, @@ -17651,11 +13695,6 @@ Object { "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", "type": "string", }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, "updatedTimestamp": Object { "maxLength": 64, "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", @@ -17668,11 +13707,7 @@ Object { "type": "string", }, }, - "required": Array [ - "groupId", - "userId", - ], - "title": "PutIdentityRequestResponse", + "title": "PutIdentityRequestRequest", "type": "object", }, }, @@ -17680,6 +13715,7 @@ Object { }, "ApiRestApiRefidentityrequestgroupIduserIdactionOPTIONSD79E6E9A": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -17812,11 +13848,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityrequestgroupIduserIdactionPutIdentityRequestActionResponse8839B05C", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -17892,32 +13924,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefidentityrequestgroupIduserIdactionPutIdentityRequestActionResponse8839B05C": Object { - "DependsOn": Array [ - "ApiRestApiRefidentityrequestgroupIduserIdactionPutIdentityRequestActionRequest2D8565E8", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The new details of the AccessRequest", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "reason": Object { - "type": "string", - }, - }, - "required": Array [ - "reason", - ], - "title": "PutIdentityRequestActionResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefidentityuserGET3B342429": Object { "DependsOn": Array [ "ApiRestApiRefidentityuserOPTIONSA312304F", @@ -17953,11 +13959,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefidentityuserListIdentityUsersResponse5F4F3774", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -18046,222 +14048,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefidentityuserListIdentityUsersResponse5F4F3774": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of the users currently available in Cognito", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "User": Object { - "properties": Object { - "address": Object { - "description": "The address of the user", - "type": "string", - }, - "customGroups": Object { - "description": "List of groups that the user belongs to, separated by comma", - "type": "string", - }, - "email": Object { - "description": "The user's email address", - "type": "string", - }, - "familyName": Object { - "description": "The family name of the user", - "type": "string", - }, - "givenName": Object { - "description": "The given name of the user", - "type": "string", - }, - "middleName": Object { - "description": "The middle name of the user", - "type": "string", - }, - "name": Object { - "description": "The name of the user", - "type": "string", - }, - "nickname": Object { - "description": "The nickname of the user", - "type": "string", - }, - "phoneNumber": Object { - "description": "The phone number of the user", - "type": "string", - }, - "preferredUsername": Object { - "description": "The preferred_username attribute that is used to identity the user", - "type": "string", - }, - "sub": Object { - "description": "The Cognito sub of the user, equivalent to the ID", - "type": "string", - }, - "username": Object { - "description": "The username of the user", - "type": "string", - }, - }, - "required": Array [ - "username", - ], - "type": "object", - }, - "UserEntity": Object { - "properties": Object { - "address": Object { - "description": "The address of the user", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "customGroups": Object { - "description": "List of groups that the user belongs to, separated by comma", - "type": "string", - }, - "email": Object { - "description": "The user's email address", - "type": "string", - }, - "familyName": Object { - "description": "The family name of the user", - "type": "string", - }, - "givenName": Object { - "description": "The given name of the user", - "type": "string", - }, - "middleName": Object { - "description": "The middle name of the user", - "type": "string", - }, - "name": Object { - "description": "The name of the user", - "type": "string", - }, - "nickname": Object { - "description": "The nickname of the user", - "type": "string", - }, - "phoneNumber": Object { - "description": "The phone number of the user", - "type": "string", - }, - "preferredUsername": Object { - "description": "The preferred_username attribute that is used to identity the user", - "type": "string", - }, - "sub": Object { - "description": "The Cognito sub of the user, equivalent to the ID", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "username": Object { - "description": "The username of the user", - "type": "string", - }, - }, - "required": Array [ - "username", - ], - "type": "object", - }, - "UserIdentifier": Object { - "properties": Object { - "username": Object { - "description": "The username of the user", - "type": "string", - }, - }, - "required": Array [ - "username", - ], - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - "users": Object { - "items": Object { - "$ref": "#/definitions/UserEntity", - }, - "type": "array", - }, - }, - "required": Array [ - "users", - ], - "title": "ListIdentityUsersResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefidentityuserOPTIONSA312304F": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { diff --git a/source/packages/@ada/infra/src/services/notification/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/notification/stack/__snapshots__/index.test.ts.snap index f5d904b..3662b93 100644 --- a/source/packages/@ada/infra/src/services/notification/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/notification/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-NotificationService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-NotificationService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaNotificationServiceNotificationListenerLambda7FAAC5B2Arn": Object { "Value": Object { @@ -97,7 +97,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -721,11 +721,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefnotificationListNotificationsResponseEF54BE37", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -822,285 +818,6 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefnotificationListNotificationsResponseEF54BE37": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The notifications for the calling user (optionally filtered by status)", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Notification": Object { - "description": "A notification as sent throughout the system", - "properties": Object { - "payload": Object { - "description": "Payload to send in the notification, can be any object", - }, - "source": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "target": Object { - "description": "Specified if the notification should target a particular recipient, for example a user id.", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "source", - "type", - "payload", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "PersistedNotification": Object { - "description": "An object containing a persisted notification status", - "properties": Object { - "notificationId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "payload": Object { - "description": "Payload to send in the notification, can be any object", - }, - "source": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "status": Object { - "enum": Array [ - "PENDING", - "ACKNOWLEDGED", - "DISMISSED", - ], - "type": "string", - }, - "target": Object { - "description": "The target of the notification, for example the userId", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "targetAndStatus": Object { - "description": "Composite key for index of notification by target and status. Delimited by .", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "notificationId", - "payload", - "source", - "status", - "target", - "targetAndStatus", - "type", - ], - "type": "object", - }, - "PersistedNotificationEntity": Object { - "description": "An object containing a persisted notification status", - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "notificationId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "payload": Object { - "description": "Payload to send in the notification, can be any object", - }, - "source": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "status": Object { - "enum": Array [ - "PENDING", - "ACKNOWLEDGED", - "DISMISSED", - ], - "type": "string", - }, - "target": Object { - "description": "The target of the notification, for example the userId", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "targetAndStatus": Object { - "description": "Composite key for index of notification by target and status. Delimited by .", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "notificationId", - "payload", - "source", - "status", - "target", - "targetAndStatus", - "type", - ], - "type": "object", - }, - "PersistedNotificationIdentifier": Object { - "properties": Object { - "notificationId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "target": Object { - "description": "The target of the notification, for example the userId", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "notificationId", - "target", - ], - "type": "object", - }, - "PersistedNotificationStatus": Object { - "description": "An object containing a persisted notification status", - "properties": Object { - "status": Object { - "enum": Array [ - "PENDING", - "ACKNOWLEDGED", - "DISMISSED", - ], - "type": "string", - }, - }, - "required": Array [ - "status", - ], - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "notifications": Object { - "items": Object { - "$ref": "#/definitions/PersistedNotificationEntity", - "description": "An object containing a persisted notification status", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "notifications", - ], - "title": "ListNotificationsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefnotificationNotificationIdC10C01FD": Object { "Properties": Object { "ParentId": Object { @@ -1115,6 +832,7 @@ Object { }, "ApiRestApiRefnotificationOPTIONS3E3D0A7A": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1168,6 +886,7 @@ Object { }, "ApiRestApiRefnotificationnotificationIdOPTIONS31868CA5": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1209,6 +928,7 @@ Object { }, "ApiRestApiRefnotificationnotificationIdactionOPTIONSE9AB6D81": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1341,11 +1061,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefnotificationnotificationIdactionPutNotificationActionResponse359A8F63", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1415,256 +1131,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefnotificationnotificationIdactionPutNotificationActionResponse359A8F63": Object { - "DependsOn": Array [ - "ApiRestApiRefnotificationnotificationIdactionPutNotificationActionRequest1D2713B5", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The notification that was actioned", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "Notification": Object { - "description": "A notification as sent throughout the system", - "properties": Object { - "payload": Object { - "description": "Payload to send in the notification, can be any object", - }, - "source": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "target": Object { - "description": "Specified if the notification should target a particular recipient, for example a user id.", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "source", - "type", - "payload", - ], - "type": "object", - }, - "PersistedNotification": Object { - "description": "An object containing a persisted notification status", - "properties": Object { - "notificationId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "payload": Object { - "description": "Payload to send in the notification, can be any object", - }, - "source": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "status": Object { - "enum": Array [ - "PENDING", - "ACKNOWLEDGED", - "DISMISSED", - ], - "type": "string", - }, - "target": Object { - "description": "The target of the notification, for example the userId", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "targetAndStatus": Object { - "description": "Composite key for index of notification by target and status. Delimited by .", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "notificationId", - "payload", - "source", - "status", - "target", - "targetAndStatus", - "type", - ], - "type": "object", - }, - "PersistedNotificationIdentifier": Object { - "properties": Object { - "notificationId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "target": Object { - "description": "The target of the notification, for example the userId", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "notificationId", - "target", - ], - "type": "object", - }, - "PersistedNotificationStatus": Object { - "description": "An object containing a persisted notification status", - "properties": Object { - "status": Object { - "enum": Array [ - "PENDING", - "ACKNOWLEDGED", - "DISMISSED", - ], - "type": "string", - }, - }, - "required": Array [ - "status", - ], - "type": "object", - }, - }, - "description": "An object containing a persisted notification status", - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "notificationId": Object { - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "payload": Object { - "description": "Payload to send in the notification, can be any object", - }, - "source": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "status": Object { - "enum": Array [ - "PENDING", - "ACKNOWLEDGED", - "DISMISSED", - ], - "type": "string", - }, - "target": Object { - "description": "The target of the notification, for example the userId", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "targetAndStatus": Object { - "description": "Composite key for index of notification by target and status. Delimited by .", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "type": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "notificationId", - "payload", - "source", - "status", - "target", - "targetAndStatus", - "type", - ], - "title": "PutNotificationActionResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "AppRegistryAssociation": Object { "Properties": Object { "Application": Object { diff --git a/source/packages/@ada/infra/src/services/ontology/api/handlers/__tests__/put-ontology.test.ts b/source/packages/@ada/infra/src/services/ontology/api/handlers/__tests__/put-ontology.test.ts index 07c5b2a..6029a33 100644 --- a/source/packages/@ada/infra/src/services/ontology/api/handlers/__tests__/put-ontology.test.ts +++ b/source/packages/@ada/infra/src/services/ontology/api/handlers/__tests__/put-ontology.test.ts @@ -290,6 +290,12 @@ describe('put-ontology', () => { }, }); expect(response.statusCode).toBe(200); + + const expectedResponse = { + name: 'test name', + }; + expect(JSON.parse(response.body)).toEqual(expectedResponse); + const expectedOntology = { ...ontology, ontologyId: 'pii-ontology-id-1', @@ -299,7 +305,6 @@ describe('put-ontology', () => { createdTimestamp: now, updatedTimestamp: now, }; - expect(JSON.parse(response.body)).toEqual(expectedOntology); // Check the ontology is written to dynamodb expect( diff --git a/source/packages/@ada/infra/src/services/ontology/api/handlers/put-ontology.ts b/source/packages/@ada/infra/src/services/ontology/api/handlers/put-ontology.ts index 6f9a92b..fd022a8 100644 --- a/source/packages/@ada/infra/src/services/ontology/api/handlers/put-ontology.ts +++ b/source/packages/@ada/infra/src/services/ontology/api/handlers/put-ontology.ts @@ -2,6 +2,7 @@ SPDX-License-Identifier: Apache-2.0 */ import { ApiLambdaHandler, ApiResponse } from '@ada/api-gateway'; import { DefaultUser } from '../../../../common/services'; +import { OntologyEntity } from '@ada/api'; import { OntologyNamespace } from '@ada/common'; import { OntologyStore } from '../../components/ddb/ontology'; import type { OntologyIdentifier, OntologyInput } from '@ada/api-client'; @@ -64,6 +65,11 @@ export const handler = ApiLambdaHandler.for( }); } - return ApiResponse.success(await OntologyStore.getInstance().putOntology(ontologyIdentifier, userId, ontology)); + const ret = await OntologyStore.getInstance().putOntology(ontologyIdentifier, userId, ontology); + if (userId !== DefaultUser.SYSTEM) { + return ApiResponse.success(ret); + } else { + return ApiResponse.success({ name: ret.name } as OntologyEntity); + } }, ); diff --git a/source/packages/@ada/infra/src/services/ontology/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/ontology/stack/__snapshots__/index.test.ts.snap index 8e964ca..66861e8 100644 --- a/source/packages/@ada/infra/src/services/ontology/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/ontology/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-OntologyService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-OntologyService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaOntologyServiceApiLambdaGetOntology5C119448Ref": Object { "Value": Object { @@ -105,7 +105,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -3429,11 +3429,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefontologyListOntologiesResponseBA424C32", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -3521,248 +3517,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefontologyListOntologiesResponseBA424C32": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all ontologies", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - "Ontology": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - "OntologyAlias": Object { - "properties": Object { - "name": Object { - "description": "The name of an alias for this ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "name", - ], - "type": "object", - }, - "OntologyEntity": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - "OntologyIdentifier": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "ontologies": Object { - "items": Object { - "$ref": "#/definitions/OntologyEntity", - "description": "Uniquely identifies the ontology attribute.", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "ontologies", - ], - "title": "ListOntologiesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefontologyOPTIONS2B2CA766": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -4134,6 +3891,7 @@ Object { }, "ApiRestApiRefontologyfindByAliasOPTIONS83B72C67": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -4175,6 +3933,7 @@ Object { }, "ApiRestApiRefontologyontologyNamespaceOPTIONSDBF2C1CC": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -4261,11 +4020,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefontologyontologyNamespaceontologyIdDeleteOntologyResponse551B0819", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -4368,225 +4123,14 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefontologyontologyNamespaceontologyIdDeleteOntologyResponse551B0819": Object { - "DependsOn": Array [ - "ApiRestApiRefontologyontologyNamespaceontologyIdPutOntologyResponse329EBDD4", - ], + "ApiRestApiRefontologyontologyNamespaceontologyIdGETApiPermissionAdaOntologyServiceApiRestApiRefEF70DF76GETOntologyOntologyNamespaceOntologyId68FF6B3E": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The ontology that was deleted", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - "Ontology": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - "OntologyAlias": Object { - "properties": Object { - "name": Object { - "description": "The name of an alias for this ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "name", - ], - "type": "object", - }, - "OntologyIdentifier": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - }, - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "title": "DeleteOntologyResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefontologyontologyNamespaceontologyIdGETApiPermissionAdaOntologyServiceApiRestApiRefEF70DF76GETOntologyOntologyNamespaceOntologyId68FF6B3E": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaGetOntology1FCF29AC", - "Arn", - ], + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetOntology1FCF29AC", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -4662,267 +4206,56 @@ Object { Object { "Fn::GetAtt": Array [ "ApiLambdaGetOntology1FCF29AC", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefontologyontologyNamespaceontologyIdGetOntologyResponse8CBF9915", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - ], - "OperationName": "GetOntology", - "RequestParameters": Object { - "method.request.path.ontologyId": true, - "method.request.path.ontologyNamespace": true, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefontologyontologyNamespaceOntologyIdB8F14038", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefontologyontologyNamespaceontologyIdGetOntologyResponse8CBF9915": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The ontology with the given id", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - "Ontology": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - "OntologyAlias": Object { - "properties": Object { - "name": Object { - "description": "The name of an alias for this ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "name", - ], - "type": "object", - }, - "OntologyIdentifier": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - }, - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + "Arn", + ], + }, + "/invocations", + ], + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", + }, }, + "StatusCode": "404", }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "title": "GetOntologyResponse", - "type": "object", + ], + "OperationName": "GetOntology", + "RequestParameters": Object { + "method.request.path.ontologyId": true, + "method.request.path.ontologyNamespace": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefontologyontologyNamespaceOntologyIdB8F14038", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, "ApiRestApiRefontologyontologyNamespaceontologyIdOPTIONS2DB86D3E": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -4997,11 +4330,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefontologyontologyNamespaceontologyIdPutOntologyResponse329EBDD4", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -5110,9 +4439,6 @@ Object { "Type": "AWS::Lambda::Permission", }, "ApiRestApiRefontologyontologyNamespaceontologyIdPutOntologyRequest3B707AD1": Object { - "DependsOn": Array [ - "ApiRestApiRefontologyontologyNamespaceontologyIdGetOntologyResponse8CBF9915", - ], "Properties": Object { "ContentType": "application/json", "Description": "Details about the new ontology", @@ -5228,217 +4554,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefontologyontologyNamespaceontologyIdPutOntologyResponse329EBDD4": Object { - "DependsOn": Array [ - "ApiRestApiRefontologyontologyNamespaceontologyIdPutOntologyRequest3B707AD1", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The created/updated ontology", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - "Ontology": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - "OntologyAlias": Object { - "properties": Object { - "name": Object { - "description": "The name of an alias for this ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "name", - ], - "type": "object", - }, - "OntologyIdentifier": Object { - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "ontologyId", - "ontologyNamespace", - ], - "type": "object", - }, - }, - "description": "Uniquely identifies the ontology attribute.", - "properties": Object { - "aliases": Object { - "description": "Alternate names for the ontology attribute, used for ontology suggestions", - "items": Object { - "$ref": "#/definitions/OntologyAlias", - }, - "type": "array", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "defaultLens": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "description": Object { - "description": "A description of the ontology attribute", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "name": Object { - "description": "The name of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "ontologyId": Object { - "description": "Identifies the ontology attribute within the ontologyNamespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The namespace the ontology attribute belongs to", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "aliases", - "name", - "ontologyId", - "ontologyNamespace", - ], - "title": "PutOntologyResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "AppRegistryAssociation": Object { "Properties": Object { "Application": Object { diff --git a/source/packages/@ada/infra/src/services/query-parse-render/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/query-parse-render/stack/__snapshots__/index.test.ts.snap index d113aa6..f2dd3d3 100644 --- a/source/packages/@ada/infra/src/services/query-parse-render/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/query-parse-render/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-QueryParseRenderService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-QueryParseRenderService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaQueryParseRenderServiceApiGovernanceAthenaLensLambda2872E629Ref": Object { "Value": Object { @@ -663,6 +663,7 @@ Object { }, "ApiRestApiRefqueryparserenderOPTIONSE9866B73": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -728,6 +729,7 @@ Object { }, "ApiRestApiRefqueryparserenderdiscoverOPTIONSDF9F17EA": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -851,11 +853,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryparserenderdiscoverPostQueryParseRenderDiscoverResponse690C3A31", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -911,49 +909,9 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefqueryparserenderdiscoverPostQueryParseRenderDiscoverResponse690C3A31": Object { - "DependsOn": Array [ - "ApiRestApiRefqueryparserenderdiscoverPostQueryParseRenderDiscoverRequest91C73DE0", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The data products discovered from the query", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "tables": Object { - "items": Object { - "properties": Object { - "identifierParts": Object { - "description": "Each identifier part as referenced in the query", - "items": Object { - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "identifierParts", - ], - "type": "object", - }, - "type": "array", - }, - }, - "required": Array [ - "tables", - ], - "title": "PostQueryParseRenderDiscoverResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryparserenderrewriteOPTIONS773ACF1C": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1077,11 +1035,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryparserenderrewritePostQueryParseRenderRewriteResponseB5921FE4", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1247,37 +1201,9 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefqueryparserenderrewritePostQueryParseRenderRewriteResponseB5921FE4": Object { - "DependsOn": Array [ - "ApiRestApiRefqueryparserenderrewritePostQueryParseRenderRewriteRequest6C18D652", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "A query ready to execute in Athena", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "title": "PostQueryParseRenderRewriteResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryparserendervalidateattributevaluepolicyOPTIONS77AF9B90": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -1401,11 +1327,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryparserendervalidateattributevaluepolicyPostQueryParseRenderValidateAttributeValuePolicyResponseFF680594", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -1464,25 +1386,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefqueryparserendervalidateattributevaluepolicyPostQueryParseRenderValidateAttributeValuePolicyResponseFF680594": Object { - "DependsOn": Array [ - "ApiRestApiRefqueryparserendervalidateattributevaluepolicyPostQueryParseRenderValidateAttributeValuePolicyRequestE347C01A", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "An empty response if validation is successful", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object {}, - "title": "PostQueryParseRenderValidateAttributeValuePolicyResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiSecretSalt41559FAD": Object { "DeletionPolicy": "Delete", "Properties": Object { diff --git a/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/index.ts b/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/index.ts index 368d357..ec89430 100644 --- a/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/index.ts +++ b/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/index.ts @@ -14,7 +14,17 @@ import { import { AthenaGetQueryExecution, LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks'; import { AthenaQueryExecutionState } from '@ada/common'; import { CfnResource, Duration, RemovalPolicy, Stack } from 'aws-cdk-lib'; -import { Choice, Condition, LogLevel, Pass, StateMachine, TaskInput, Wait, WaitTime } from 'aws-cdk-lib/aws-stepfunctions'; +import { + Choice, + Condition, + DefinitionBody, + LogLevel, + Pass, + StateMachine, + TaskInput, + Wait, + WaitTime, +} from 'aws-cdk-lib/aws-stepfunctions'; import { Construct } from 'constructs'; import { CounterTable } from '../../../../common/constructs/dynamodb/counter-table'; import { EntityManagementTables } from '../../../api/components/entity/constructs/entity-management-tables'; @@ -272,14 +282,10 @@ export class AthenaQueryExecutorStateMachine extends Construct { }), ); - if(queryEventsStream.encryptionKey) { + if (queryEventsStream.encryptionKey) { logQueryExecutionLambdaRole.addToPolicy( new PolicyStatement({ - actions: [ - 'kms:Encrypt', - 'kms:ReEncrypt*', - 'kms:GenerateDataKey*', - ], + actions: ['kms:Encrypt', 'kms:ReEncrypt*', 'kms:GenerateDataKey*'], resources: [queryEventsStream.encryptionKey.keyArn], }), ); @@ -365,7 +371,7 @@ export class AthenaQueryExecutorStateMachine extends Construct { this.stateMachine = new StateMachine(this, 'AthenaQueryExecutorStateMachine', { tracingEnabled: true, - definition, + definitionBody: DefinitionBody.fromChainable(definition), logs: { destination: new LogGroup(this, 'AthenaQueryExecutorLogs', { logGroupName: getUniqueStateMachineLogGroupName(this, `${id}StateMachineLogs`), diff --git a/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/steps/__tests__/start-athena-query-execution.test.ts b/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/steps/__tests__/start-athena-query-execution.test.ts index bf9c696..3e1c641 100644 --- a/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/steps/__tests__/start-athena-query-execution.test.ts +++ b/source/packages/@ada/infra/src/services/query/components/athena-query-executor-step-function/steps/__tests__/start-athena-query-execution.test.ts @@ -25,9 +25,9 @@ describe('start-athena-query-execution', () => { jest.clearAllMocks(); mockAssumeRole.mockReturnValue({ Credentials: { - AccessKeyId: 'test-access-key', - SecretAccessKey: 'test-secret-access-key', - SessionToken: 'test-session-token', + AccessKeyId: 'testAccessKey', + SecretAccessKey: 'testSecretAccessKey', + SessionToken: 'testSessionToken', }, }); }); diff --git a/source/packages/@ada/infra/src/services/query/stack/__snapshots__/index.test.ts.snap b/source/packages/@ada/infra/src/services/query/stack/__snapshots__/index.test.ts.snap index 9f18e29..5afff6d 100644 --- a/source/packages/@ada/infra/src/services/query/stack/__snapshots__/index.test.ts.snap +++ b/source/packages/@ada/infra/src/services/query/stack/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`stack snapshots 1`] = ` Object { - "Description": "(SO0190-QueryService) - Automated Data Analytics on AWS. Version v1.2.0", + "Description": "(SO0190-QueryService) - Automated Data Analytics on AWS. Version v1.3.0", "Outputs": Object { "AdaQueryServiceApiLambdaGetAthenaQueryResult40B42785Ref": Object { "Value": Object { @@ -165,7 +165,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -5799,6 +5799,7 @@ Object { }, "ApiRestApiRefqueryOPTIONSBC9FCF1E": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -5931,11 +5932,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryPostQueryResponseE571568A", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -5999,32 +5996,6 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefqueryPostQueryResponseE571568A": Object { - "DependsOn": Array [ - "ApiRestApiRefqueryPostQueryRequest108B3097", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "An execution id to track the status or retrieve the result of a query", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "executionId": Object { - "type": "string", - }, - }, - "required": Array [ - "executionId", - ], - "title": "PostQueryResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefquerySavedQuery9A8E7D0C": Object { "Properties": Object { "ParentId": Object { @@ -6063,6 +6034,7 @@ Object { }, "ApiRestApiRefqueryexecutionIdOPTIONS2977B07E": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -6243,11 +6215,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryexecutionIdresultListQueryResultsResponse678C2ED3", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -6295,138 +6263,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefqueryexecutionIdresultListQueryResultsResponse678C2ED3": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The result of a query execution", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "DataIntegrityEnum": Object { - "description": "Data Integrity value", - "enum": Array [ - "stale", - "current", - ], - "type": "string", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "QueryResult": Object { - "properties": Object { - "columns": Object { - "items": Object { - "$ref": "#/definitions/QueryResultColumnMetadata", - }, - "type": "array", - }, - "data": Object { - "items": Object { - "$ref": "#/definitions/QueryResultData", - }, - "type": "array", - }, - "dataIntegrity": Object { - "$ref": "#/definitions/DataIntegrityEnum", - "description": "Data Integrity value", - }, - }, - "required": Array [ - "data", - "columns", - ], - "type": "object", - }, - "QueryResultColumnMetadata": Object { - "properties": Object { - "caseSensitive": Object { - "type": "boolean", - }, - "label": Object { - "type": "string", - }, - "name": Object { - "type": "string", - }, - "nullable": Object { - "type": "string", - }, - "precision": Object { - "description": "For decimal data types, specifies the total number of digits", - "type": "number", - }, - "scale": Object { - "description": "For decimal data types, specifies the total number of digits in the fractional part of the value", - "type": "number", - }, - "type": Object { - "type": "string", - }, - }, - "required": Array [ - "name", - "type", - ], - "type": "object", - }, - "QueryResultData": Object { - "additionalProperties": Object { - "type": "string", - }, - "type": "object", - }, - }, - "properties": Object { - "columns": Object { - "items": Object { - "$ref": "#/definitions/QueryResultColumnMetadata", - }, - "type": "array", - }, - "data": Object { - "items": Object { - "$ref": "#/definitions/QueryResultData", - }, - "type": "array", - }, - "dataIntegrity": Object { - "$ref": "#/definitions/DataIntegrityEnum", - "description": "Data Integrity value", - }, - "error": Object { - "type": "string", - }, - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "data", - "columns", - ], - "title": "ListQueryResultsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryexecutionIdresultOPTIONS69A5C341": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -6559,11 +6398,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryexecutionIdresultasathenaListQueryResultsAsAthenaResultsResponse3D8AE17B", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -6609,32 +6444,9 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefqueryexecutionIdresultasathenaListQueryResultsAsAthenaResultsResponse3D8AE17B": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The result of a query execution", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "resultSet": Object {}, - "updateCount": Object { - "type": "integer", - }, - }, - "title": "listQueryResultsAsAthenaResultsResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryexecutionIdresultasathenaOPTIONSDAC9FFE6": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -6709,11 +6521,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryexecutionIdresultdownloadGetQueryResultDownloadResponse81C07742", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -6815,31 +6623,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefqueryexecutionIdresultdownloadGetQueryResultDownloadResponse81C07742": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "A download url for the full result of a query", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": Object { - "signedUrl": Object { - "type": "string", - }, - }, - "required": Array [ - "signedUrl", - ], - "title": "GetQueryResultDownloadResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryexecutionIdresultdownloadOPTIONS38F5CFDE": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -6914,11 +6700,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryexecutionIdstatusGetQueryStatusResponse0E7F3F96", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -7020,51 +6802,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefqueryexecutionIdstatusGetQueryStatusResponse0E7F3F96": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The status of a query execution", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "QueryExecutionStatusEnum": Object { - "description": "Status for a query execution", - "enum": Array [ - "RUNNING", - "SUCCEEDED", - "FAILED", - "TIMED_OUT", - "ABORTED", - "QUEUED", - "CANCELLED", - ], - "type": "string", - }, - }, - "properties": Object { - "reason": Object { - "description": "Failure status reason", - "type": "string", - }, - "status": Object { - "$ref": "#/definitions/QueryExecutionStatusEnum", - "description": "Status for a query execution", - }, - }, - "required": Array [ - "status", - ], - "title": "GetQueryStatusResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryexecutionIdstatusOPTIONSCED85750": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -7106,6 +6846,7 @@ Object { }, "ApiRestApiRefquerygenerateOPTIONS1D29350F": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -7180,11 +6921,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerygeneratePostQueryGenerateResponse44E79103", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -7306,2195 +7043,132 @@ Object { }, "Type": "AWS::ApiGateway::Model", }, - "ApiRestApiRefquerygeneratePostQueryGenerateResponse44E79103": Object { + "ApiRestApiRefqueryhistoryGET38F1CECC": Object { "DependsOn": Array [ - "ApiRestApiRefquerygeneratePostQueryGenerateRequestE67FC1C7", + "ApiRestApiRefqueryhistoryOPTIONSFC56E77B", ], "Properties": Object { - "ContentType": "application/json", - "Description": "The generated query (ie. translated to include governance)", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "ColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaListQueryHistoryBD763833", + "Arn", + ], }, - }, - "required": Array [ - "dataType", + "/invocations", ], - "type": "object", - }, - "ColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/ColumnMetadata", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "description": "A map of column name to metadata about the column", - "type": "object", }, - "DataProduct": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "dataSets", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductBase": Object { - "properties": Object { - "childDataProducts": Object { - "description": "Any child data products, ie data products that use this data product as a source for their data", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "cloudFormationStackId": Object { - "description": "The id of the cloudformation stack for all resources pertaining to this data product", - "maxLength": 2048, - "pattern": "^arn:[\\\\w]+:[\\\\w-]+:[\\\\w-]+:[\\\\d]+:[*-\\\\/\\\\w]+$", - "type": "string", - }, - "dataImportStateMachineArn": Object { - "description": "The arn of the state machine for importing data product data (if any)", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataStatus": Object { - "$ref": "#/definitions/DataProductDataStatus", - "description": "Status of data product data", - }, - "dataStatusDetails": Object { - "description": "Details about the data status of the data product, eg error message if data import failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the data product", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "enableAutomaticPii": Object { - "description": "Whether or not to automatically apply pii detection and redaction", - "type": "boolean", - }, - "enableAutomaticTransforms": Object { - "description": "Whether or not to automatically apply transforms based on the type of data in the data product", - "type": "boolean", - }, - "infrastructureStatus": Object { - "$ref": "#/definitions/DataProductInfrastructureStatus", - "description": "Status of data product infrastructure", - }, - "infrastructureStatusDetails": Object { - "description": "Details about the infrastructure status of the data product, eg error message if creation failed", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "latestDataUpdateTimestamp": Object { - "description": "The time at which the data product data was last updated", - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "name": Object { - "description": "The name of the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "parentDataProducts": Object { - "description": "Any parent data products, ie data products that are used as a source for data in this data product", - "items": Object { - "$ref": "#/definitions/DataProductIdentifier", - }, - "type": "array", - }, - "sourceDataSets": Object { - "$ref": "#/definitions/DataSets", - "description": "Map of datasets by id", - }, - "sourceDataStatus": Object { - "$ref": "#/definitions/DataProductSourceDataStatus", - "description": "Status of raw source data product data", - }, - "sourceDataStatusDetails": Object { - "description": "Details about the raw source data status of the data product, eg error message if data source inference failed", - "type": "string", - }, - "sourceDetails": Object { - "$ref": "#/definitions/SouceDetailsSchema", - }, - "sourceType": Object { - "$ref": "#/definitions/SourceTypeEnum", - "description": "Source type value", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "transforms": Object { - "$ref": "#/definitions/DataProductTransforms", - "description": "Ordered list of transformations applied to data in the data product", - }, - "updateTrigger": Object { - "$ref": "#/definitions/DataProductUpdateTrigger", - "description": "The trigger for a data update", - }, - }, - "required": Array [ - "childDataProducts", - "dataProductId", - "domainId", - "name", - "parentDataProducts", - "sourceType", - "tags", - "transforms", - "updateTrigger", - ], - "type": "object", - }, - "DataProductDataStatus": Object { - "description": "Status of data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataProductInfrastructureStatus": Object { - "description": "Status of data product infrastructure", - "enum": Array [ - "PROVISIONING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductSourceDataStatus": Object { - "description": "Status of raw source data product data", - "enum": Array [ - "NO_DATA", - "UPDATING", - "READY", - "FAILED", - ], - "type": "string", - }, - "DataProductTransform": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "inlineScriptContent": Object { - "description": "Inline script content for use in schema previews. Data products cannot be created with inline scripts.", - "maxLength": 262144, - "pattern": "^[\\\\s\\\\S]*def apply_transform\\\\([\\\\s\\\\S]*$", - "type": "string", - }, - "inputArgs": Object { - "description": "Arguments to pass to the script", - }, - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "DataProductTransforms": Object { - "description": "Ordered list of transformations applied to data in the data product", - "items": Object { - "$ref": "#/definitions/DataProductTransform", - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - }, - "type": "array", - }, - "DataProductUpdatePolicyType": Object { - "description": "Update types for a data product data", - "enum": Array [ - "APPEND", - "REPLACE", - ], - "type": "string", - }, - "DataProductUpdateTrigger": Object { - "description": "The trigger for a data update", - "properties": Object { - "scheduleRate": Object { - "description": "Cron schedule for data update (if triggerType is scheduled)", - "maxLength": 64, - "pattern": "(?:(?:^rate\\\\((\\\\d+) (minutes?|hours?|days?)\\\\)$)|(?:^cron\\\\(([\\\\w,/\\\\-*?#]{1,20} ?){1,6}\\\\)$))", - "type": "string", - }, - "triggerType": Object { - "$ref": "#/definitions/DataProductUpdateTriggerType", - "description": "Trigger types for a data product data", - }, - "updatePolicy": Object { - "$ref": "#/definitions/DataProductUpdatePolicyType", - "description": "Update types for a data product data", - }, - }, - "required": Array [ - "triggerType", - ], - "type": "object", - }, - "DataProductUpdateTriggerType": Object { - "description": "Trigger types for a data product data", - "enum": Array [ - "ON_DEMAND", - "SCHEDULE", - "AUTOMATIC", - ], - "type": "string", - }, - "DataSet": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/ColumnsMetadata", - "description": "A map of column name to metadata about the column", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "DataSetDetails": Object { - "properties": Object { - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "identifiers", - ], - "type": "object", - }, - "DataSetIdentifiers": Object { - "description": "Details specific to attributes that identify the dataset", - "properties": Object { - "catalog": Object { - "description": "The catalog of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "database": Object { - "description": "The database where the detaset is located", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "table": Object { - "description": "The name of the table that contains the data of the dataset", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "type": "object", - }, - "DataSets": Object { - "additionalProperties": Object { - "$ref": "#/definitions/DataSet", - }, - "description": "Map of datasets by id", - "type": "object", - }, - "GovernedColumnMetadata": Object { - "properties": Object { - "dataType": Object { - "description": "The data type of the column", - "maxLength": 2048, - "pattern": "^[\\\\w _\\\\{\\\\}\\"<>:,-]*$", - "type": "string", - }, - "description": Object { - "description": "A description of the column", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "lensToApply": Object { - "$ref": "#/definitions/LensEnum", - "description": "Lens value", - }, - "ontologyAttributeId": Object { - "description": "The ontology attribute the column maps to (if any)", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "ontologyNamespace": Object { - "description": "The ontologyNamespace of the ontology attribute", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "piiClassification": Object { - "description": "Pii classification of the column", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "sortOrder": Object { - "description": "The order in which this column should appear in the schema and results", - "type": "number", - }, - "sqlClauses": Object { - "items": Object { - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "type": "array", - }, - }, - "required": Array [ - "dataType", - "lensToApply", - "sqlClauses", - ], - "type": "object", - }, - "GovernedColumnsMetadata": Object { - "additionalProperties": Object { - "$ref": "#/definitions/GovernedColumnMetadata", - }, - "type": "object", - }, - "GovernedDataSet": Object { - "properties": Object { - "addressedAs": Object { - "type": "string", - }, - "dataProductId": Object { - "type": "string", - }, - "dataSet": Object { - "$ref": "#/definitions/GovernedDataSetDetails", - }, - "dataSetId": Object { - "type": "string", - }, - "domainId": Object { - "type": "string", - }, - }, - "required": Array [ - "domainId", - "dataProductId", - "dataSetId", - "addressedAs", - "dataSet", - ], - "type": "object", - }, - "GovernedDataSetDetails": Object { - "properties": Object { - "columnMetadata": Object { - "$ref": "#/definitions/GovernedColumnsMetadata", - }, - "description": Object { - "description": "A description of the dataset", - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "identifiers": Object { - "$ref": "#/definitions/DataSetIdentifiers", - "description": "Details specific to attributes that identify the dataset", - }, - "name": Object { - "description": "The name of the dataset within the data product", - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - }, - "required": Array [ - "columnMetadata", - "identifiers", - ], - "type": "object", - }, - "GovernedDataSets": Object { - "description": "The data sets involved in the query, with their applied governance details", - "items": Object { - "$ref": "#/definitions/GovernedDataSet", - }, - "type": "array", - }, - "LensEnum": Object { - "description": "Lens value", - "enum": Array [ - "clear", - "hidden", - "hashed", - "ada_detect_pii_types", - ], - "type": "string", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "ScriptIdentifier": Object { - "description": "Uniquely identifies the script. Used to calculate the script path in s3", - "properties": Object { - "namespace": Object { - "description": "The namespace in which the script resides, eg the domain.", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "scriptId": Object { - "description": "Identifies the script within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "scriptId", - "namespace", - ], - "type": "object", - }, - "SouceDetailsSchema": Object { - "type": "object", - }, - "SourceTypeEnum": Object { - "description": "Source type value", - "enum": Array [ - "UPLOAD", - "S3", - "KINESIS", - "GOOGLE_ANALYTICS", - "GOOGLE_BIGQUERY", - "GOOGLE_STORAGE", - "DYNAMODB", - "CLOUDWATCH", - "MYSQL5", - "POSTGRESQL", - "SQLSERVER", - "CLOUDTRAIL", - "MONGODB", - ], - "type": "string", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "dataProducts": Object { - "description": "The data products involved in the query", - "items": Object { - "$ref": "#/definitions/DataProduct", - }, - "type": "array", - }, - "governedDataSets": Object { - "$ref": "#/definitions/GovernedDataSets", - "description": "The data sets involved in the query, with their applied governance details", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "dataProducts", - "governedDataSets", - "query", - ], - "title": "PostQueryGenerateResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefqueryhistoryGET38F1CECC": Object { - "DependsOn": Array [ - "ApiRestApiRefqueryhistoryOPTIONSFC56E77B", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaListQueryHistoryBD763833", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryhistoryListQueryHistoriesResponse8E3C2F6E", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - ], - "OperationName": "ListQueryHistories", - "RequestParameters": Object { - "method.request.querystring.limit": false, - "method.request.querystring.nextToken": false, - "method.request.querystring.pageSize": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefqueryHistory41CE3043", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefqueryhistoryGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQueryHistory77FC0D55": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListQueryHistoryBD763833", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/query/history", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefqueryhistoryGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQueryHistoryB846F6ED": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListQueryHistoryBD763833", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/query/history", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefqueryhistoryListQueryHistoriesResponse8E3C2F6E": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of queries performed by a specific user, order by execution date (desc)", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "QueryHistory": Object { - "properties": Object { - "executionId": Object { - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "executionId", - "query", - ], - "type": "object", - }, - "QueryHistoryEntity": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "executionId": Object { - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "executionId", - "query", - ], - "type": "object", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "queries": Object { - "items": Object { - "$ref": "#/definitions/QueryHistoryEntity", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "queries", - ], - "title": "ListQueryHistoriesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefqueryhistoryOPTIONSFC56E77B": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefqueryHistory41CE3043", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefquerysavedqueryGET4AF9FD70": Object { - "DependsOn": Array [ - "ApiRestApiRefquerysavedqueryOPTIONS773B4A45", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaListSavedPublicQueries482893E6", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysavedqueryListQuerySavedQueriesResponseB30B1F6D", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - ], - "OperationName": "ListQuerySavedQueries", - "RequestParameters": Object { - "method.request.querystring.limit": false, - "method.request.querystring.nextToken": false, - "method.request.querystring.pageSize": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefquerySavedQuery9A8E7D0C", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefquerysavedqueryGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryCD1FCC1D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListSavedPublicQueries482893E6", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/query/saved-query", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedqueryGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQuery1FFEAC7B": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListSavedPublicQueries482893E6", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/query/saved-query", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedqueryListQuerySavedQueriesResponseB30B1F6D": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of all public saved queries", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataSetIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "ReferencedDataSetIdentifier": Object { - "properties": Object { - "addressedAs": Object { - "description": "How the data set was referenced in a query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "SavedQuery": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, - "SavedQueryEntity": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, - "SavedQueryIdentifier": Object { - "properties": Object { - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespace", - "queryId", - ], - "type": "object", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "queries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryEntity", - }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "queries", - ], - "title": "ListQuerySavedQueriesResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefquerysavedqueryNamespaceA722EFD9": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefquerySavedQuery9A8E7D0C", - }, - "PathPart": "{namespace}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefquerysavedqueryOPTIONS773B4A45": Object { - "Properties": Object { - "AuthorizationType": "NONE", - "HttpMethod": "OPTIONS", - "Integration": Object { - "IntegrationResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", - "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", - "method.response.header.Access-Control-Allow-Origin": "'*'", - "method.response.header.Access-Control-Max-Age": "'600'", - }, - "StatusCode": "200", - }, - ], - "RequestTemplates": Object { - "application/json": "{ statusCode: 200 }", - }, - "Type": "MOCK", - }, - "MethodResponses": Array [ - Object { - "ResponseParameters": Object { - "method.response.header.Access-Control-Allow-Headers": true, - "method.response.header.Access-Control-Allow-Methods": true, - "method.response.header.Access-Control-Allow-Origin": true, - "method.response.header.Access-Control-Max-Age": true, - }, - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "ApiRestApiRefquerySavedQuery9A8E7D0C", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefquerysavedquerynamespaceGET3235CD35": Object { - "DependsOn": Array [ - "ApiRestApiRefquerysavedquerynamespaceOPTIONSA0084358", - ], - "Properties": Object { - "AuthorizationType": "CUSTOM", - "AuthorizerId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", - }, - "HttpMethod": "GET", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ApiLambdaListSavedQueriesInNamespaceC03276FD", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysavedquerynamespaceListQueryNamespaceSavedQueriesResponse38CA7FD5", - }, - }, - "StatusCode": "200", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "400", - }, - ], - "OperationName": "listQueryNamespaceSavedQueries", - "RequestParameters": Object { - "method.request.path.namespace": true, - "method.request.querystring.limit": false, - "method.request.querystring.nextToken": false, - "method.request.querystring.pageSize": false, - }, - "RequestValidatorId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", - }, - "ResourceId": Object { - "Ref": "ApiRestApiRefquerysavedqueryNamespaceA722EFD9", - }, - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "ApiRestApiRefquerysavedquerynamespaceGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespace64A3A99A": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListSavedQueriesInNamespaceC03276FD", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/GET/query/saved-query/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedquerynamespaceGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespaceA5519BED": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaListSavedQueriesInNamespaceC03276FD", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/query/saved-query/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedquerynamespaceListQueryNamespaceSavedQueriesResponse38CA7FD5": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The list of queries saved within the given namespace", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataSetIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "PaginatedResponse": Object { - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "totalItems": Object { - "type": "number", - }, - }, - "type": "object", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "ReferencedDataSetIdentifier": Object { - "properties": Object { - "addressedAs": Object { - "description": "How the data set was referenced in a query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "SavedQuery": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, - "SavedQueryEntity": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, - "SavedQueryIdentifier": Object { - "properties": Object { - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + "StatusCode": "400", + }, + ], + "OperationName": "ListQueryHistories", + "RequestParameters": Object { + "method.request.querystring.limit": false, + "method.request.querystring.nextToken": false, + "method.request.querystring.pageSize": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefqueryHistory41CE3043", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefqueryhistoryGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQueryHistory77FC0D55": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaListQueryHistoryBD763833", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "required": Array [ - "namespace", - "queryId", - ], - "type": "object", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", + "/prod/GET/query/history", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefqueryhistoryGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQueryHistoryB846F6ED": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaListQueryHistoryBD763833", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "array", - }, - }, - "properties": Object { - "nextToken": Object { - "type": "string", - }, - "queries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryEntity", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "type": "array", - }, - "totalItems": Object { - "type": "number", - }, - }, - "required": Array [ - "queries", + "/test-invoke-stage/GET/query/history", + ], ], - "title": "listQueryNamespaceSavedQueriesResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysavedquerynamespaceOPTIONSA0084358": Object { + "ApiRestApiRefqueryhistoryOPTIONSFC56E77B": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -9526,7 +7200,7 @@ Object { }, ], "ResourceId": Object { - "Ref": "ApiRestApiRefquerysavedqueryNamespaceA722EFD9", + "Ref": "ApiRestApiRefqueryHistory41CE3043", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9534,28 +7208,16 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefquerysavedquerynamespaceQueryIdD199298A": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "ApiRestApiRefquerysavedqueryNamespaceA722EFD9", - }, - "PathPart": "{queryId}", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "ApiRestApiRefquerysavedquerynamespacequeryIdDELETE1917611A": Object { + "ApiRestApiRefquerysavedqueryGET4AF9FD70": Object { "DependsOn": Array [ - "ApiRestApiRefquerysavedquerynamespacequeryIdPUT6C2A9746", + "ApiRestApiRefquerysavedqueryOPTIONS773B4A45", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "DELETE", + "HttpMethod": "GET", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -9570,7 +7232,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteSavedQuery948617B3", + "ApiLambdaListSavedPublicQueries482893E6", "Arn", ], }, @@ -9581,21 +7243,9 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysavedquerynamespacequeryIdDeleteQuerySavedQueryResponseCB802B4E", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "404", - }, Object { "ResponseModels": Object { "application/json": Object { @@ -9604,25 +7254,18 @@ Object { }, "StatusCode": "400", }, - Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", - }, - }, - "StatusCode": "403", - }, ], - "OperationName": "DeleteQuerySavedQuery", + "OperationName": "ListQuerySavedQueries", "RequestParameters": Object { - "method.request.path.namespace": true, - "method.request.path.queryId": true, + "method.request.querystring.limit": false, + "method.request.querystring.nextToken": false, + "method.request.querystring.pageSize": false, }, "RequestValidatorId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", }, "ResourceId": Object { - "Ref": "ApiRestApiRefquerysavedquerynamespaceQueryIdD199298A", + "Ref": "ApiRestApiRefquerySavedQuery9A8E7D0C", }, "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", @@ -9630,12 +7273,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdDELETEApiPermissionAdaQueryServiceApiRestApiRef183E5607DELETEQuerySavedQueryNamespaceQueryId086E900D": Object { + "ApiRestApiRefquerysavedqueryGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryCD1FCC1D": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteSavedQuery948617B3", + "ApiLambdaListSavedPublicQueries482893E6", "Arn", ], }, @@ -9652,19 +7295,19 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/DELETE/query/saved-query/*/*", + "/prod/GET/query/saved-query", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdDELETEApiPermissionTestAdaQueryServiceApiRestApiRef183E5607DELETEQuerySavedQueryNamespaceQueryIdBE8EA648": Object { + "ApiRestApiRefquerysavedqueryGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQuery1FFEAC7B": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaDeleteSavedQuery948617B3", + "ApiLambdaListSavedPublicQueries482893E6", "Arn", ], }, @@ -9681,373 +7324,263 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/test-invoke-stage/DELETE/query/saved-query/*/*", + "/test-invoke-stage/GET/query/saved-query", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdDeleteQuerySavedQueryResponseCB802B4E": Object { - "DependsOn": Array [ - "ApiRestApiRefquerysavedquerynamespacequeryIdPutQuerySavedQueryResponseDE97E74C", - ], + "ApiRestApiRefquerysavedqueryNamespaceA722EFD9": Object { "Properties": Object { - "ContentType": "application/json", - "Description": "The saved query that was deleted", + "ParentId": Object { + "Ref": "ApiRestApiRefquerySavedQuery9A8E7D0C", + }, + "PathPart": "{namespace}", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataSetIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "ReferencedDataSetIdentifier": Object { - "properties": Object { - "addressedAs": Object { - "description": "How the data set was referenced in a query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "SavedQuery": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, - "SavedQueryIdentifier": Object { - "properties": Object { - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefquerysavedqueryOPTIONS773B4A45": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", }, - "required": Array [ - "namespace", - "queryId", - ], - "type": "object", + "StatusCode": "200", }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, + }, + "StatusCode": "200", + }, + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefquerySavedQuery9A8E7D0C", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefquerysavedquerynamespaceGET3235CD35": Object { + "DependsOn": Array [ + "ApiRestApiRefquerysavedquerynamespaceOPTIONSA0084358", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaListSavedQueriesInNamespaceC03276FD", + "Arn", + ], }, - }, - "required": Array [ - "key", + "/invocations", ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", }, + "StatusCode": "404", }, - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", + "StatusCode": "400", + }, + ], + "OperationName": "listQueryNamespaceSavedQueries", + "RequestParameters": Object { + "method.request.path.namespace": true, + "method.request.querystring.limit": false, + "method.request.querystring.nextToken": false, + "method.request.querystring.pageSize": false, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefquerysavedqueryNamespaceA722EFD9", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefquerysavedquerynamespaceGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespace64A3A99A": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaListSavedQueriesInNamespaceC03276FD", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/query/saved-query/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefquerysavedquerynamespaceGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespaceA5519BED": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaListSavedQueriesInNamespaceC03276FD", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/query/saved-query/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefquerysavedquerynamespaceOPTIONSA0084358": Object { + "Properties": Object { + "ApiKeyRequired": false, + "AuthorizationType": "NONE", + "HttpMethod": "OPTIONS", + "Integration": Object { + "IntegrationResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": "'Authorization,*'", + "method.response.header.Access-Control-Allow-Methods": "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'", + "method.response.header.Access-Control-Allow-Origin": "'*'", + "method.response.header.Access-Control-Max-Age": "'600'", + }, + "StatusCode": "200", }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", + ], + "RequestTemplates": Object { + "application/json": "{ statusCode: 200 }", + }, + "Type": "MOCK", + }, + "MethodResponses": Array [ + Object { + "ResponseParameters": Object { + "method.response.header.Access-Control-Allow-Headers": true, + "method.response.header.Access-Control-Allow-Methods": true, + "method.response.header.Access-Control-Allow-Origin": true, + "method.response.header.Access-Control-Max-Age": true, }, + "StatusCode": "200", }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "title": "DeleteQuerySavedQueryResponse", - "type": "object", + ], + "ResourceId": Object { + "Ref": "ApiRestApiRefquerysavedqueryNamespaceA722EFD9", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdGET668530A3": Object { + "ApiRestApiRefquerysavedquerynamespaceQueryIdD199298A": Object { + "Properties": Object { + "ParentId": Object { + "Ref": "ApiRestApiRefquerysavedqueryNamespaceA722EFD9", + }, + "PathPart": "{queryId}", + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Resource", + }, + "ApiRestApiRefquerysavedquerynamespacequeryIdDELETE1917611A": Object { "DependsOn": Array [ - "ApiRestApiRefquerysavedquerynamespacequeryIdOPTIONSB5836E28", + "ApiRestApiRefquerysavedquerynamespacequeryIdPUT6C2A9746", ], "Properties": Object { "AuthorizationType": "CUSTOM", "AuthorizerId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", }, - "HttpMethod": "GET", + "HttpMethod": "DELETE", "Integration": Object { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -10062,7 +7595,7 @@ Object { ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", Object { "Fn::GetAtt": Array [ - "ApiLambdaGetSavedQueryEA80697E", + "ApiLambdaDeleteSavedQuery948617B3", "Arn", ], }, @@ -10073,11 +7606,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysavedquerynamespacequeryIdGetQuerySavedQueryResponse2C1AE900", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10105,7 +7634,7 @@ Object { "StatusCode": "403", }, ], - "OperationName": "GetQuerySavedQuery", + "OperationName": "DeleteQuerySavedQuery", "RequestParameters": Object { "method.request.path.namespace": true, "method.request.path.queryId": true, @@ -10122,12 +7651,12 @@ Object { }, "Type": "AWS::ApiGateway::Method", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespaceQueryIdDFA14E60": Object { + "ApiRestApiRefquerysavedquerynamespacequeryIdDELETEApiPermissionAdaQueryServiceApiRestApiRef183E5607DELETEQuerySavedQueryNamespaceQueryId086E900D": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetSavedQueryEA80697E", + "ApiLambdaDeleteSavedQuery948617B3", "Arn", ], }, @@ -10144,391 +7673,183 @@ Object { Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "/prod/GET/query/saved-query/*/*", + "/prod/DELETE/query/saved-query/*/*", ], ], }, }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespaceQueryIdD2CB8611": Object { + "ApiRestApiRefquerysavedquerynamespacequeryIdDELETEApiPermissionTestAdaQueryServiceApiRestApiRef183E5607DELETEQuerySavedQueryNamespaceQueryIdBE8EA648": Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { "Fn::GetAtt": Array [ - "ApiLambdaGetSavedQueryEA80697E", + "ApiLambdaDeleteSavedQuery948617B3", "Arn", ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/GET/query/saved-query/*/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedquerynamespacequeryIdGetQuerySavedQueryResponse2C1AE900": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The saved query", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataSetIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "ReferencedDataSetIdentifier": Object { - "properties": Object { - "addressedAs": Object { - "description": "How the data set was referenced in a query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "SavedQuery": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, - "SavedQueryIdentifier": Object { - "properties": Object { - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "required": Array [ - "namespace", - "queryId", - ], - "type": "object", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", + "/test-invoke-stage/DELETE/query/saved-query/*/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefquerysavedquerynamespacequeryIdGET668530A3": Object { + "DependsOn": Array [ + "ApiRestApiRefquerysavedquerynamespacequeryIdOPTIONSB5836E28", + ], + "Properties": Object { + "AuthorizationType": "CUSTOM", + "AuthorizerId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiCustomAuthorizerHandler80C96C55Ref", + }, + "HttpMethod": "GET", + "Integration": Object { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", + ":apigateway:ap-southeast-1:lambda:path/2015-03-31/functions/", + Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetSavedQueryEA80697E", + "Arn", + ], }, - }, - "required": Array [ - "key", + "/invocations", ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", + ], + }, + }, + "MethodResponses": Array [ + Object { + "ResponseModels": Object {}, + "StatusCode": "200", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", }, + "StatusCode": "404", }, - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", + "StatusCode": "400", + }, + Object { + "ResponseModels": Object { + "application/json": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiErrorModelD8BFCFCERef", }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", }, + "StatusCode": "403", }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", + ], + "OperationName": "GetQuerySavedQuery", + "RequestParameters": Object { + "method.request.path.namespace": true, + "method.request.path.queryId": true, + }, + "RequestValidatorId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApiFederatedRestApiValidator5117C971Ref", + }, + "ResourceId": Object { + "Ref": "ApiRestApiRefquerysavedquerynamespaceQueryIdD199298A", + }, + "RestApiId": Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + }, + "Type": "AWS::ApiGateway::Method", + }, + "ApiRestApiRefquerysavedquerynamespacequeryIdGETApiPermissionAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespaceQueryIdDFA14E60": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetSavedQueryEA80697E", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/prod/GET/query/saved-query/*/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefquerysavedquerynamespacequeryIdGETApiPermissionTestAdaQueryServiceApiRestApiRef183E5607GETQuerySavedQueryNamespaceQueryIdD2CB8611": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaGetSavedQueryEA80697E", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/GET/query/saved-query/*/*", + ], ], - "title": "GetQuerySavedQueryResponse", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, "ApiRestApiRefquerysavedquerynamespacequeryIdOPTIONSB5836E28": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -10603,11 +7924,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysavedquerynamespacequeryIdPutQuerySavedQueryResponseDE97E74C", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -10668,328 +7985,63 @@ Object { }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/prod/PUT/query/saved-query/*/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedquerynamespacequeryIdPUTApiPermissionTestAdaQueryServiceApiRestApiRef183E5607PUTQuerySavedQueryNamespaceQueryId6B2C7ACD": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ApiLambdaPutSavedQuery3AFC9794", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:ap-southeast-1:1111111111:", - Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "/test-invoke-stage/PUT/query/saved-query/*/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ApiRestApiRefquerysavedquerynamespacequeryIdPutQuerySavedQueryRequest13E5AF5C": Object { - "DependsOn": Array [ - "ApiRestApiRefquerysavedquerynamespacequeryIdGetQuerySavedQueryResponse2C1AE900", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "The query to save", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "DataProductIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "domainId", - ], - "type": "object", - }, - "DataSetIdentifier": Object { - "properties": Object { - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "Query": Object { - "properties": Object { - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - }, - "required": Array [ - "query", - ], - "type": "object", - }, - "ReferencedDataSetIdentifier": Object { - "properties": Object { - "addressedAs": Object { - "description": "How the data set was referenced in a query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataProductId": Object { - "description": "The id of the data product", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "dataSetId": Object { - "description": "The id of the data set", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "domainId": Object { - "description": "The id of the domain to which this data product belongs", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "dataProductId", - "dataSetId", - "domainId", - ], - "type": "object", - }, - "SavedQueryIdentifier": Object { - "properties": Object { - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - }, - "required": Array [ - "namespace", - "queryId", - ], - "type": "object", - }, - "Tag": Object { - "properties": Object { - "key": Object { - "maxLength": 128, - "minLength": 1, - "pattern": "^([a-zA-Z][a-zA-Z0-9_.:/=+-@]{0,127})$", - }, - "value": Object { - "maxLength": 256, - "minLength": 0, - "pattern": "^([a-zA-Z0-9_.:/=+-@]{0,256})$", - }, - }, - "required": Array [ - "key", - ], - "type": "object", - }, - "Tags": Object { - "items": Object { - "$ref": "#/definitions/Tag", - }, - "type": "array", - }, - }, - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "required": Array [ - "query", + "/prod/PUT/query/saved-query/*/*", + ], ], - "title": "PutQuerySavedQueryRequest", - "type": "object", }, }, - "Type": "AWS::ApiGateway::Model", + "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysavedquerynamespacequeryIdPutQuerySavedQueryResponseDE97E74C": Object { - "DependsOn": Array [ - "ApiRestApiRefquerysavedquerynamespacequeryIdPutQuerySavedQueryRequest13E5AF5C", - ], + "ApiRestApiRefquerysavedquerynamespacequeryIdPUTApiPermissionTestAdaQueryServiceApiRestApiRef183E5607PUTQuerySavedQueryNamespaceQueryId6B2C7ACD": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ApiLambdaPutSavedQuery3AFC9794", + "Arn", + ], + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":execute-api:ap-southeast-1:1111111111:", + Object { + "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", + }, + "/test-invoke-stage/PUT/query/saved-query/*/*", + ], + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ApiRestApiRefquerysavedquerynamespacequeryIdPutQuerySavedQueryRequest13E5AF5C": Object { "Properties": Object { "ContentType": "application/json", - "Description": "The saved query", + "Description": "The query to save", "RestApiId": Object { "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", }, "Schema": Object { "$schema": "http://json-schema.org/draft-04/schema#", "definitions": Object { - "CreateAndUpdateDetails": Object { - "properties": Object { - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "updatedTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, - }, - "type": "object", - }, "DataProductIdentifier": Object { "properties": Object { "dataProductId": Object { @@ -11097,73 +8149,6 @@ Object { ], "type": "object", }, - "SavedQuery": Object { - "properties": Object { - "addressedAs": Object { - "maxLength": 2048, - "minLength": 2, - "pattern": "^[\\\\w _-]*$", - "type": "string", - }, - "description": Object { - "maxLength": 2048, - "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", - "type": "string", - }, - "namespace": Object { - "description": "The namespace for this query", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "query": Object { - "description": "An SQL query", - "maxLength": 262144, - "pattern": "^([\\\\s\\\\S]+)$", - "type": "string", - }, - "queryId": Object { - "description": "The id of the query within the namespace", - "maxLength": 256, - "minLength": 2, - "pattern": "^[a-z][a-z_0-9]*$", - "type": "string", - }, - "referencedDataSets": Object { - "items": Object { - "$ref": "#/definitions/ReferencedDataSetIdentifier", - }, - "type": "array", - }, - "referencedQueries": Object { - "items": Object { - "$ref": "#/definitions/SavedQueryIdentifier", - }, - "type": "array", - }, - "tags": Object { - "$ref": "#/definitions/Tags", - }, - "type": Object { - "enum": Array [ - "PUBLIC", - "PRIVATE", - ], - "type": "string", - }, - }, - "required": Array [ - "addressedAs", - "namespace", - "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", - ], - "type": "object", - }, "SavedQueryIdentifier": Object { "properties": Object { "namespace": Object { @@ -11219,16 +8204,6 @@ Object { "pattern": "^[\\\\w _-]*$", "type": "string", }, - "createdBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, - "createdTimestamp": Object { - "maxLength": 64, - "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", - "type": "string", - }, "description": Object { "maxLength": 2048, "pattern": "^[\\\\w+ _.:,\\\\/*&%$#=+-@?!|()\\"'\\\\]\\\\[]*$", @@ -11276,11 +8251,6 @@ Object { ], "type": "string", }, - "updatedBy": Object { - "maxLength": 256, - "pattern": "[\\\\w\\\\s+=.@-]+", - "type": "string", - }, "updatedTimestamp": Object { "maxLength": 64, "pattern": "^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2}):(\\\\d{2}(?:\\\\.\\\\d*)?)((-(\\\\d{2}):(\\\\d{2})|Z)?))?$", @@ -11288,15 +8258,9 @@ Object { }, }, "required": Array [ - "addressedAs", - "namespace", "query", - "queryId", - "referencedDataSets", - "referencedQueries", - "type", ], - "title": "PutQuerySavedQueryResponse", + "title": "PutQuerySavedQueryRequest", "type": "object", }, }, @@ -11316,6 +8280,7 @@ Object { }, "ApiRestApiRefqueryschemaOPTIONS45D7CA85": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11369,6 +8334,7 @@ Object { }, "ApiRestApiRefqueryschemadomainIdOPTIONS16231ED7": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11422,6 +8388,7 @@ Object { }, "ApiRestApiRefqueryschemadomainIddataproductOPTIONS2F7C3791": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11496,11 +8463,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefqueryschemadomainIddataproductdataProductIdGetQuerySchemaDataProductResponseF8A64F91", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { @@ -11604,39 +8567,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefqueryschemadomainIddataproductdataProductIdGetQuerySchemaDataProductResponseF8A64F91": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The schema for a data product", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "Schema": Object { - "additionalProperties": Object { - "type": "string", - }, - "type": "object", - }, - }, - "properties": Object { - "schema": Object { - "$ref": "#/definitions/Schema", - }, - }, - "required": Array [ - "schema", - ], - "title": "GetQuerySchemaDataProductResponse", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefqueryschemadomainIddataproductdataProductIdOPTIONSCCE763E3": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11723,11 +8656,7 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysyncGetQuerySyncResponseFEFBA2B8", - }, - }, + "ResponseModels": Object {}, "ResponseParameters": Object { "method.response.header.location": true, }, @@ -11824,22 +8753,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysyncGetQuerySyncResponseFEFBA2B8": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "A redirect to the query result api", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "GetQuerySyncResponse", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefquerysyncOPTIONS302E574C": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11881,6 +8797,7 @@ Object { }, "ApiRestApiRefquerysyncexecutionIdOPTIONS111A0927": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -11967,19 +8884,11 @@ Object { }, "MethodResponses": Array [ Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysyncexecutionIdresultGetQuerySyncResultResponse0D2706F0F", - }, - }, + "ResponseModels": Object {}, "StatusCode": "200", }, Object { - "ResponseModels": Object { - "application/json": Object { - "Ref": "ApiRestApiRefquerysyncexecutionIdresultGetQuerySyncResultResponse1E390397C", - }, - }, + "ResponseModels": Object {}, "ResponseParameters": Object { "method.response.header.location": true, }, @@ -12080,110 +8989,9 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ApiRestApiRefquerysyncexecutionIdresultGetQuerySyncResultResponse0D2706F0F": Object { - "Properties": Object { - "ContentType": "application/json", - "Description": "The result of the query", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": Object { - "DataIntegrityEnum": Object { - "description": "Data Integrity value", - "enum": Array [ - "stale", - "current", - ], - "type": "string", - }, - "QueryResultColumnMetadata": Object { - "properties": Object { - "caseSensitive": Object { - "type": "boolean", - }, - "label": Object { - "type": "string", - }, - "name": Object { - "type": "string", - }, - "nullable": Object { - "type": "string", - }, - "precision": Object { - "description": "For decimal data types, specifies the total number of digits", - "type": "number", - }, - "scale": Object { - "description": "For decimal data types, specifies the total number of digits in the fractional part of the value", - "type": "number", - }, - "type": Object { - "type": "string", - }, - }, - "required": Array [ - "name", - "type", - ], - "type": "object", - }, - "QueryResultData": Object { - "additionalProperties": Object { - "type": "string", - }, - "type": "object", - }, - }, - "properties": Object { - "columns": Object { - "items": Object { - "$ref": "#/definitions/QueryResultColumnMetadata", - }, - "type": "array", - }, - "data": Object { - "items": Object { - "$ref": "#/definitions/QueryResultData", - }, - "type": "array", - }, - "dataIntegrity": Object { - "$ref": "#/definitions/DataIntegrityEnum", - "description": "Data Integrity value", - }, - }, - "required": Array [ - "data", - "columns", - ], - "title": "GetQuerySyncResultResponse0", - "type": "object", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, - "ApiRestApiRefquerysyncexecutionIdresultGetQuerySyncResultResponse1E390397C": Object { - "DependsOn": Array [ - "ApiRestApiRefquerysyncexecutionIdresultGetQuerySyncResultResponse0D2706F0F", - ], - "Properties": Object { - "ContentType": "application/json", - "Description": "A redirect to the query result api", - "RestApiId": Object { - "Ref": "referencetoAdaApiServiceNestedStackApiServiceNestedStackResourceBBF04FB4OutputsAdaApiServiceFederatedApiFederatedRestApi1FB0E4F5Ref", - }, - "Schema": Object { - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "GetQuerySyncResultResponse1", - }, - }, - "Type": "AWS::ApiGateway::Model", - }, "ApiRestApiRefquerysyncexecutionIdresultOPTIONSFB876A97": Object { "Properties": Object { + "ApiKeyRequired": false, "AuthorizationType": "NONE", "HttpMethod": "OPTIONS", "Integration": Object { @@ -12712,7 +9520,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -14401,7 +11209,7 @@ Object { "Ref": "referencetoAdaOpMetricsCustomResource0DFDFE51anonymousDataUUID", }, "AWS_SOLUTION_ID": "SO0190", - "AWS_SOLUTION_VERSION": "v1.2.0", + "AWS_SOLUTION_VERSION": "v1.3.0", "COUNTER_TABLE_NAME": Object { "Ref": "referencetoAdaCommonStackNestedStackCommonStackNestedStackResourceD51B693FOutputsAdaCommonStackCounterTable5D6ADA16Ref", }, @@ -15704,9 +12512,6 @@ Object { ], }, }, - "StreamModeDetails": Object { - "StreamMode": "PROVISIONED", - }, "Tags": Array [ Object { "Key": "Application", diff --git a/source/packages/@ada/infra/src/stacks/__snapshots__/ada-stack.test.ts.snap b/source/packages/@ada/infra/src/stacks/__snapshots__/ada-stack.test.ts.snap index 01cb4b1..75aa844 100644 --- a/source/packages/@ada/infra/src/stacks/__snapshots__/ada-stack.test.ts.snap +++ b/source/packages/@ada/infra/src/stacks/__snapshots__/ada-stack.test.ts.snap @@ -244,7 +244,7 @@ Object { "No", ], "Default": "Yes", - "Description": "Send anonymous operational metrics to AWS. We use this data to better understand how customers use this solution and related services and products. Choose No to opt out of this feature.", + "Description": "Send anonymized operational metrics to AWS. We use this data to better understand how customers use this solution and related services and products. Choose No to opt out of this feature.", "Type": "String", }, }, @@ -265,7 +265,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -482,7 +482,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -640,7 +640,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -789,7 +789,7 @@ Object { "applicationType": "AWS-Solutions", "solutionID": "SO0190", "solutionName": "Automated Data Analytics on AWS", - "version": "v1.2.0", + "version": "v1.3.0", }, "Description": "Attributes for Solutions Metadata", "Name": Object { @@ -903,7 +903,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Tags": Array [ Object { "Key": "Application", @@ -1024,7 +1024,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -1072,7 +1072,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -1117,7 +1117,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -1522,7 +1522,7 @@ Object { "Solutions:ApplicationType": "AWS-Solutions", "Solutions:SolutionID": "SO0190", "Solutions:SolutionName": "Automated Data Analytics on AWS", - "Solutions:SolutionVersion": "v1.2.0", + "Solutions:SolutionVersion": "v1.3.0", }, }, "Type": "AWS::ServiceCatalogAppRegistry::Application", @@ -1571,7 +1571,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -1630,7 +1630,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -1852,7 +1852,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -1913,7 +1913,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -2069,7 +2069,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -2314,7 +2314,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -2346,7 +2346,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -2413,7 +2413,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -2488,7 +2488,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -2791,7 +2791,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -2935,7 +2935,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -2967,7 +2967,7 @@ Object { "Ref": "AWS::Region", }, "awsSolutionId": "SO0190", - "awsSolutionVersion": "v1.2.0", + "awsSolutionVersion": "v1.3.0", "sendAnonymousData": Object { "Ref": "sendAnonymousData", }, @@ -2997,7 +2997,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -3072,7 +3072,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -3214,7 +3214,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -3438,7 +3438,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { @@ -3643,7 +3643,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs18.x", "Tags": Array [ Object { "Key": "Application", @@ -3789,6 +3789,7 @@ Object { }, ".execute-api.ap-southeast-1.amazonaws.com/prod/\\", \\"region\\": \\"ap-southeast-1\\", + \\"accountId\\": \\"1111111111\\", \\"oauthScopes\\": [ \\"phone\\", \\"profile\\", @@ -3902,7 +3903,7 @@ Object { }, Object { "Key": "ApplicationVersion", - "Value": "ada@1.2.0", + "Value": "ada@1.3.0", }, ], "TemplateURL": Object { diff --git a/source/packages/@ada/infra/src/stacks/ada-stack.ts b/source/packages/@ada/infra/src/stacks/ada-stack.ts index ee5b9b2..79e0c77 100644 --- a/source/packages/@ada/infra/src/stacks/ada-stack.ts +++ b/source/packages/@ada/infra/src/stacks/ada-stack.ts @@ -81,7 +81,7 @@ export class AdaStack extends ExtendedStack { sendAnonymousData: parameters.sendAnonymousData, }); - // common props for anonymous operational data collection in services + // common props for anonymized operational data collection in services const operationalMetricsConfig: OperationalMetricsConfig = { awsSolutionId: solution.awsSolutionId, awsSolutionVersion: solution.awsSolutionVersion, @@ -249,6 +249,7 @@ export class AdaStack extends ExtendedStack { userPoolClientId: identityService.userPoolClient.userPoolClientId, apiUrl: api.url, region: this.region, + accountId: this.account, oauthScopes: identityService.oauthScopes.map((q) => q.scopeName), oauthDomain: cognitoStack.cognitoDomain, ouathResponseType: 'code', @@ -318,4 +319,4 @@ export class AdaStack extends ExtendedStack { } } -export default AdaStack; \ No newline at end of file +export default AdaStack; diff --git a/source/packages/@ada/solution/package.json b/source/packages/@ada/solution/package.json index e2274a5..1650b28 100755 --- a/source/packages/@ada/solution/package.json +++ b/source/packages/@ada/solution/package.json @@ -24,14 +24,14 @@ "dependencies": { "@ada/common": "*", "@ada/infra": "*", - "aws-cdk-lib": "2.70.0", + "aws-cdk-lib": "2.88.0", "constructs": "^10.1.181", "source-map-support": "^0.5.21" }, "devDependencies": { "@types/node": "^15.3.1", - "aws-cdk": "2.70.0", - "@aws-cdk/cloudformation-diff": "2.70.0", + "aws-cdk": "2.88.0", + "@aws-cdk/cloudformation-diff": "2.88.0", "if-env-defined": "^1.0.0", "ts-node": "^8.1.0", "typescript": "4.3.5" diff --git a/source/packages/@ada/strings/src/dictionary/en/views/view/governance.ts b/source/packages/@ada/strings/src/dictionary/en/views/view/governance.ts index d9f7ad7..24cee16 100644 --- a/source/packages/@ada/strings/src/dictionary/en/views/view/governance.ts +++ b/source/packages/@ada/strings/src/dictionary/en/views/view/governance.ts @@ -41,6 +41,8 @@ export const GOVERNANCE = { actions: { editGovernance: 'Edit Governance', addOntolgoy: `Add ${ENTITY.Ontology}`, + searchGroups: `find ${ENTITY.group} and add governance settings for the group`, + addGovernanceForGroup: 'Add Governance Settings' }, summary: { diff --git a/source/packages/@ada/transforms/src/transforms/index.ts b/source/packages/@ada/transforms/src/transforms/index.ts index 43e5cdb..518fe66 100644 --- a/source/packages/@ada/transforms/src/transforms/index.ts +++ b/source/packages/@ada/transforms/src/transforms/index.ts @@ -24,10 +24,8 @@ export type BuiltInTransformIds = keyof typeof BuiltInTransforms; * This defines all automatic transforms that can be applied. Transforms are applied in the order they are specified * here, filtering out any that do not apply based on the initial classification of data. */ -export const AUTOMATIC_TRANSFORMS: AutomaticTransform[] = [json_relationalize, parquet_data_type_map].map( - ({ transform }) => ({ - scriptId: transform.id, - namespace: transform.namespace, - applicableClassifications: transform.applicableClassifications!, - }), -); +export const AUTOMATIC_TRANSFORMS: AutomaticTransform[] = [json_relationalize].map(({ transform }) => ({ + scriptId: transform.id, + namespace: transform.namespace, + applicableClassifications: transform.applicableClassifications!, +})); diff --git a/source/packages/@ada/website/package.json b/source/packages/@ada/website/package.json index 13f48fa..717fa57 100644 --- a/source/packages/@ada/website/package.json +++ b/source/packages/@ada/website/package.json @@ -10,13 +10,13 @@ "@ada/strings": "*", "@ada/transforms": "*", "@aws-amplify/ui-react": "^1.2.26", - "@aws-sdk/util-arn-parser": "^3.55.0", + "@aws-sdk/util-arn-parser": "^3.310.0", "@material-ui/core": "4.11.4", "@rjsf/core": "^4.2.0", "@rjsf/material-ui": "^4.2.0", "ace-builds": "^1.4.13", "async-retry": "^1.3.3", - "aws-amplify": "^4.3.12", + "aws-amplify": "^5.3.5", "aws-northstar": "^1.3.10", "axios": "^0.24.0", "brace": "^0.11.1", diff --git a/source/packages/@ada/website/puppeteer/__tests__/sanity.test.ts b/source/packages/@ada/website/puppeteer/__tests__/sanity.test.ts index 4cc7f4b..3bf3d0e 100644 --- a/source/packages/@ada/website/puppeteer/__tests__/sanity.test.ts +++ b/source/packages/@ada/website/puppeteer/__tests__/sanity.test.ts @@ -26,6 +26,7 @@ window['runtime-config'] = { "userPoolClientId": "mockUserPoolClientId", "apiUrl": "https://test.api/", "region": "ap-southeast-1", + "accountId": "123456789012", "oauthScopes": [ "phone", "profile", diff --git a/source/packages/@ada/website/src/common/components/CodeEditor/index.tsx b/source/packages/@ada/website/src/common/components/CodeEditor/index.tsx index e2d67e4..367a512 100644 --- a/source/packages/@ada/website/src/common/components/CodeEditor/index.tsx +++ b/source/packages/@ada/website/src/common/components/CodeEditor/index.tsx @@ -50,12 +50,6 @@ export const CodeEditor = React.forwardRef( }, ref, ) => { - if (defaultValue != null && value != null) { - throw new Error( - 'CodeEditor props `defaultValue` and `value` are mutually exclusive - either uncontrolled or controlled respectively.', - ); - } - const [minLines] = useState(() => { return Math.max(5, (defaultValue || '').split('\n').length); }); @@ -100,6 +94,12 @@ export const CodeEditor = React.forwardRef( } }, [completions]); + if (defaultValue != null && value != null) { + throw new Error( + 'CodeEditor props `defaultValue` and `value` are mutually exclusive - either uncontrolled or controlled respectively.', + ); + } + return ( void; + canRemove: boolean; + groupId: string; + fields: Field[]; + fieldIndex: number; + name: string; + showError?: boolean; +} + +/** + * Custom FormRenderer component for creating/updating governance settings for user groups. + */ +export const GovernanceEditCard: FC = ({ + onRemove, + groupId, + fieldIndex, + canRemove, + name, + ...props +}) => { + const { LL } = useI18nContext(); + const { renderForm } = useFormApi(); + const actions = useMemo(() => { + return + }, [onRemove, groupId]); + + const getFieldKey = useCallback((fieldName: string) => `${name}.${fieldName}`, [name]); + + const fields = useMemo(() => { + return props.fields.map((field) => ({ + ...field, + name: getFieldKey(field.name), + key: getFieldKey(field.name), + showError: props.showError, + })); + }, [props.fields, props.showError]); + + return ( + {renderForm(fields)} + ) +} \ No newline at end of file diff --git a/source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/components/SearchCustomGroups.tsx b/source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/components/SearchCustomGroups.tsx new file mode 100644 index 0000000..0a5870a --- /dev/null +++ b/source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/components/SearchCustomGroups.tsx @@ -0,0 +1,60 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { FC, useMemo } from 'react'; +import { apiHooks } from '$api'; +import { groupDisplayName } from '$common/entity/group/utils'; +import { useI18nContext } from '$strings'; +import Autosuggest, { SelectOption } from 'aws-northstar/components/Autosuggest'; +import FormField from 'aws-northstar/components/FormField'; + +export interface SearchCustomGroupsProps { + selected?: string; + onSelect: (id: string) => void; + filteredIds?: string[] +} + +export const SearchCustomGroups: FC = ({ + selected, + onSelect, + filteredIds, +}) => { + const { LL } = useI18nContext(); + const [groups, { isLoading, error }] = apiHooks.useAllIdentityGroups(); + + const options: SelectOption[] = useMemo(() => { + return groups?.filter(g => !filteredIds || !(filteredIds.includes(g.groupId))) + .map(g => ({ + value: g.groupId, + label: groupDisplayName(g.groupId), + })) || [] + }, [groups]); + + const getStatusType = () => { + if(isLoading) { + return 'loading' + } + + if(error) { + return 'error' + } + + return 'finished' + } + + return (

+ + o.value === selected) : undefined} + onChange={(option) => option?.value && onSelect(option.value)} + statusType={getStatusType()} + loadingText={LL.VIEW.loading.Loading()} + errorText={error?.message} + options={options} + controlId="search-custom-group" + ariaDescribedby={LL.VIEW.GOVERNANCE.actions.searchGroups()} /> + +
) +} \ No newline at end of file diff --git a/source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/index.tsx b/source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/index.tsx new file mode 100644 index 0000000..aeceab0 --- /dev/null +++ b/source/packages/@ada/website/src/common/components/form-renderer/custom-components/GovernanceEdit/index.tsx @@ -0,0 +1,82 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { FC, useState } from 'react'; +import { FieldArray as FieldArrayBase } from '@data-driven-forms/react-form-renderer'; +import { GovernanceEditCard } from './components/GovernanceEditCard'; +import { SearchCustomGroups } from './components/SearchCustomGroups'; +import { useI18nContext } from '$strings'; +import Box from 'aws-northstar/layouts/Box'; +import Button from 'aws-northstar/components/Button'; +import Stack from 'aws-northstar/layouts/Stack'; +import useFieldApi, { UseFieldApiConfig } from '@data-driven-forms/react-form-renderer/use-field-api'; + +/** + * Custom FormRenderer component for creating/updating governance settings for user groups. + */ +export const GovernanceEdit: FC = (props) => { + const { + arrayValidator, + fields: formFields, + showError, + input, + ...rest + } = useFieldApi(props); + const { LL } = useI18nContext(); + const [selectedCustomGroup, setSelectedCustomGroup] = useState(); + + const testId = rest['data-testid'] || 'governance-edit'; + + return ( + + {({ fields }) => { + const { map, push, remove, value } = fields; + return ( + + {map((_name: string, index: number) => { + const groupId = value[index].groupId; + return ( + + ); + })} + + + x.groupId) || []} + selected={selectedCustomGroup} + onSelect={setSelectedCustomGroup} /> + + + + + + + ); + }} + ) +} \ No newline at end of file diff --git a/source/packages/@ada/website/src/common/components/form-renderer/custom-components/index.ts b/source/packages/@ada/website/src/common/components/form-renderer/custom-components/index.ts index 7120c9f..5b141d5 100644 --- a/source/packages/@ada/website/src/common/components/form-renderer/custom-components/index.ts +++ b/source/packages/@ada/website/src/common/components/form-renderer/custom-components/index.ts @@ -7,6 +7,7 @@ import { CustomWrapper } from './CustomWrapper'; import { DynamoDBTableField } from './DynamoDBTableField'; import { FieldListener } from './FieldListener'; import { FileUploadField } from './FileUploadField'; +import { GovernanceEdit } from './GovernanceEdit'; import { StringGroupField, TokenGroupField } from './TokenGroupField'; import { TagGroup } from './TagGroup'; import { TwoColumns } from './TwoColumns'; @@ -37,6 +38,8 @@ export * from './FieldListener'; export * from './UserSelectField'; +export * from './GovernanceEdit'; + export enum CustomComponentTypes { ACCESSPOLICY_SELECT = 'access-policy-select', CARD_SELECT = 'card-select', @@ -53,6 +56,7 @@ export enum CustomComponentTypes { TOKEN_GROUP = 'token-group', TWO_COLUMNS = 'two-columns', USER_SELECT = 'user-select', + GOVERNANCE_EDIT = 'governance-edit', } export const DEFAULT_CUSTOM_COMPONENT_WRAPPER = { @@ -71,4 +75,5 @@ export const DEFAULT_CUSTOM_COMPONENT_WRAPPER = { [CustomComponentTypes.USER_SELECT]: UserSelectField as any, [CustomComponentTypes.FIELD_ARRAY]: FieldArray as any, [CustomComponentTypes.ACCESSPOLICY_SELECT]: AccessPolicySelectField as any, + [CustomComponentTypes.GOVERNANCE_EDIT]: GovernanceEdit as any, }; diff --git a/source/packages/@ada/website/src/common/entity/access-request/index.tsx b/source/packages/@ada/website/src/common/entity/access-request/index.tsx index adadbc1..7769674 100644 --- a/source/packages/@ada/website/src/common/entity/access-request/index.tsx +++ b/source/packages/@ada/website/src/common/entity/access-request/index.tsx @@ -8,7 +8,7 @@ import { useHistory } from 'react-router-dom'; import { useI18nContext } from '$strings'; import { useIsAdmin, useUserId } from '$core/provider/UserProvider'; import { useNotificationContext } from '$northstar-plus'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; const NOTIFICATION_UUID = Symbol('ACCESS_REQUEST_NOTIFICATION').toString(); @@ -146,13 +146,16 @@ export const AccessRequestProvider: React.FC = ({ children }) => { } }, [hasPendingAccessRequests, notified]); - const context: IAccessRequestContext = { + const context: IAccessRequestContext = useMemo(() => ({ accessRequests, hasPendingAccessRequests, denyRequest, approveRequest, getAccessRequestAcknowledgement: getAcknowledgement, - }; - + }), [accessRequests, hasPendingAccessRequests, + denyRequest, approveRequest, + getAcknowledgement] + ); + return {children}; }; diff --git a/source/packages/@ada/website/src/connectors/icons/icon_redshift.svg b/source/packages/@ada/website/src/connectors/icons/icon_redshift.svg new file mode 100644 index 0000000..44542ec --- /dev/null +++ b/source/packages/@ada/website/src/connectors/icons/icon_redshift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/packages/@ada/website/src/connectors/icons/index.tsx b/source/packages/@ada/website/src/connectors/icons/index.tsx index c6a4322..7b39d2b 100644 --- a/source/packages/@ada/website/src/connectors/icons/index.tsx +++ b/source/packages/@ada/website/src/connectors/icons/index.tsx @@ -19,7 +19,9 @@ import { ReactComponent as GOOGLE_STORAGE } from '../../vendor/google/cloud_stor import { ReactComponent as KINESIS } from './icon_kinesis.svg'; import { ReactComponent as MONGODB } from '../../vendor/mongodb.svg'; import { ReactComponent as MYSQL5 } from '../../vendor/mysql.svg'; +import { ReactComponent as ORACLE } from '../../vendor/oracle.svg'; import { ReactComponent as POSTGRESQL } from '../../vendor/postgres.svg'; +import { ReactComponent as REDSHIFT } from './icon_redshift.svg'; import { ReactComponent as S3 } from './icon_s3.svg'; import { ReactComponent as SQLSERVER } from '../../vendor/sqlserver.svg'; @@ -37,10 +39,12 @@ export const ConnectorIcons: Record = { GOOGLE_BIGQUERY, GOOGLE_STORAGE, DYNAMODB, + REDSHIFT, CLOUDWATCH, MYSQL5, POSTGRESQL, SQLSERVER, + ORACLE, CLOUDTRAIL, MONGODB, }; diff --git a/source/packages/@ada/website/src/core/provider/AmplifyProvider.test.tsx b/source/packages/@ada/website/src/core/provider/AmplifyProvider.test.tsx index 5804e61..20748d5 100644 --- a/source/packages/@ada/website/src/core/provider/AmplifyProvider.test.tsx +++ b/source/packages/@ada/website/src/core/provider/AmplifyProvider.test.tsx @@ -14,6 +14,7 @@ jest.mock('../../runtime-config', () => ({ userPoolClientId: 'mockUserPoolClientId', apiUrl: 'https://test.api/', region: 'ap-southeast-1', + accountId: '123456789012', oauthScopes: ['phone', 'profile', 'openid', 'email', 'aws.cognito.signin.user.admin'], oauthDomain: 'test.auth.ap-southeast-1.amazoncognito.com', ouathResponseType: 'code', diff --git a/source/packages/@ada/website/src/core/provider/AmplifyProvider.tsx b/source/packages/@ada/website/src/core/provider/AmplifyProvider.tsx index 14804a4..8c5c4b4 100644 --- a/source/packages/@ada/website/src/core/provider/AmplifyProvider.tsx +++ b/source/packages/@ada/website/src/core/provider/AmplifyProvider.tsx @@ -12,10 +12,10 @@ import { setSolutionPersistenceItem, } from '$config'; import { FederatedCognitoUser, TEST_COGNITO_USER } from '../../common/entity/user'; +import { Hub, Logger } from 'aws-amplify'; import { RuntimeConfig } from '../../runtime-config'; import { throttle } from 'lodash'; import { useStatefulRef } from '$common/hooks'; -import Amplify, { Hub } from 'aws-amplify'; import EventEmitter from 'eventemitter3'; import React, { PropsWithChildren, createContext, useContext, useEffect, useMemo, useState } from 'react'; @@ -39,7 +39,7 @@ const { region, userPoolId, userPoolClientId, oauthDomain, oauthScopes, ouathRes }, }); -ENV_DEVELOPMENT && (Amplify.Logger.LOG_LEVEL = 'INFO'); +ENV_DEVELOPMENT && (Logger.LOG_LEVEL = 'INFO'); export interface AmplifyContext { cognitoUser: FederatedCognitoUser; diff --git a/source/packages/@ada/website/src/northstar-plus/components/Modal/index.tsx b/source/packages/@ada/website/src/northstar-plus/components/Modal/index.tsx index d9dce90..b527626 100644 --- a/source/packages/@ada/website/src/northstar-plus/components/Modal/index.tsx +++ b/source/packages/@ada/website/src/northstar-plus/components/Modal/index.tsx @@ -71,18 +71,19 @@ export const Modal = ({ visible = false, children, title, subtitle, footer, onCl onClose?.(); }; - const CloseButton = () => ( - - - - ); - return ( // CHANGE: wrap modal in portal - prevents nested forms and is best practice with modals
- } footerContent={footer}> + + + } + footerContent={footer}> {children}
diff --git a/source/packages/@ada/website/src/northstar-plus/layouts/AppLayout/components/help.tsx b/source/packages/@ada/website/src/northstar-plus/layouts/AppLayout/components/help.tsx index 57be448..229ab2b 100644 --- a/source/packages/@ada/website/src/northstar-plus/layouts/AppLayout/components/help.tsx +++ b/source/packages/@ada/website/src/northstar-plus/layouts/AppLayout/components/help.tsx @@ -6,7 +6,7 @@ import { HelpPanelProps } from 'aws-northstar/components/HelpPanel'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { last } from 'lodash'; import { nanoid } from 'nanoid'; -import React, { createContext, useCallback, useContext, useEffect, useState } from 'react'; +import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; import ReactMarkdown, { Options as ReactMarkdownOptions } from 'react-markdown'; import rehypeAddClasses from 'rehype-add-classes'; import rehypeRaw from 'rehype-raw'; @@ -54,12 +54,14 @@ export const HelpProvider: React.FC<{}> = ({ children }) => { [setPanelStack], ); - const context: IHelpContext = { + const context: IHelpContext = useMemo(() => ({ managedPanels: panelStack, activePanel: last(panelStack), addHelpPanel, removeHelpPanel, - }; + }), [ + panelStack, addHelpPanel, removeHelpPanel, + ]); return {children}; }; diff --git a/source/packages/@ada/website/src/northstar-plus/providers/NotificationProvider/provider.tsx b/source/packages/@ada/website/src/northstar-plus/providers/NotificationProvider/provider.tsx index 2aa29bd..f92a537 100644 --- a/source/packages/@ada/website/src/northstar-plus/providers/NotificationProvider/provider.tsx +++ b/source/packages/@ada/website/src/northstar-plus/providers/NotificationProvider/provider.tsx @@ -332,7 +332,7 @@ export const NotificationProvider: React.FC = ({ [emitter], ); - const context: NotificationContext = { + const context: NotificationContext = useMemo(() => ({ ...store, addNotification, addFatal, @@ -347,7 +347,12 @@ export const NotificationProvider: React.FC = ({ addBrief, onAddedNotification, onDismissedNotification, - }; + }), [ + store, addNotification, + addFatal, addError, addWarning, addInfo, addSuccess, + addNotifications, dismissNotification, dismissAllNotifications, + addFlashbar, addBrief, onAddedNotification, onDismissedNotification, + ]); return {children}; }; diff --git a/source/packages/@ada/website/src/runtime-config.ts b/source/packages/@ada/website/src/runtime-config.ts index bb673f9..9f6fc8b 100644 --- a/source/packages/@ada/website/src/runtime-config.ts +++ b/source/packages/@ada/website/src/runtime-config.ts @@ -6,6 +6,7 @@ export interface RuntimeConfig { readonly userPoolClientId: string; readonly apiUrl: string; readonly region: string; + readonly accountId: string; readonly oauthScopes: string[]; readonly oauthDomain: string; readonly ouathResponseType: string; @@ -27,6 +28,7 @@ if (ENV_TEST || ENV_STORYBOOK) { userPoolClientId: 'mockUserPoolClientId', apiUrl: 'https://test.api/', region: 'ap-southeast-1', + accountId: '123456789012', oauthScopes: ['phone', 'profile', 'openid', 'email', 'aws.cognito.signin.user.admin'], oauthDomain: 'test.auth.ap-southeast-1.amazoncognito.com', ouathResponseType: 'code', diff --git a/source/packages/@ada/website/src/testing/user-event.tsx b/source/packages/@ada/website/src/testing/user-event.tsx index 7067e7d..1b9e54b 100644 --- a/source/packages/@ada/website/src/testing/user-event.tsx +++ b/source/packages/@ada/website/src/testing/user-event.tsx @@ -4,6 +4,38 @@ import { act, within } from '@testing-library/react'; import { delay } from '$common/utils'; import userEvent from '@testing-library/user-event'; +export async function autoSuggestOptionEvent( + canvasElement: HTMLElement, + selectLabel: string, + optionLabel: string) { + const canvas = within(canvasElement); + let openTrigger: HTMLElement; + try { + openTrigger = await within(canvas.getByLabelText(selectLabel)).findByRole('button'); + } catch (error) { + // https://github.com/testing-library/dom-testing-library/issues/714 + openTrigger = await within(canvas.getByText(selectLabel).parentElement!).findByRole('button'); + } + await delay(10); + await act(async () => { + userEvent.click(openTrigger); + }); + await delay(10); + const listbox = await within(canvasElement.ownerDocument.documentElement).findByRole('listbox'); + + const option = await within(listbox).findByText(optionLabel); + + if (option == null) { + throw new Error(`Failed to find option "${optionLabel}" for select "${selectLabel}"`); + } + + await act(async () => { + userEvent.click(option); + }); + + return option; +} + export async function selectOptionEvent( canvasElement: HTMLElement, selectLabel: string, diff --git a/source/packages/@ada/website/src/views/data-product/components/schema/SchemaRenderer/context.tsx b/source/packages/@ada/website/src/views/data-product/components/schema/SchemaRenderer/context.tsx index 706880d..bb24c97 100644 --- a/source/packages/@ada/website/src/views/data-product/components/schema/SchemaRenderer/context.tsx +++ b/source/packages/@ada/website/src/views/data-product/components/schema/SchemaRenderer/context.tsx @@ -27,7 +27,7 @@ import { isOwner, useUserId } from '$core/provider/UserProvider'; import { useNotificationContext } from '$northstar-plus'; import { useStatefulRef } from '$common/hooks'; import { useUserCanEditDataProduct } from '$views/data-product/hooks'; -import React, { createContext, useCallback, useContext, useRef, useState } from 'react'; +import React, { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react'; export interface NormalizedDatasetSchema { readonly id: string; @@ -160,7 +160,7 @@ export const SchemaRendererProvider: React.FC<{ dataProductId?: DataProductIdent const [sampleDataset, setSampleDataset] = useState(); - const context: ISchemaRendererContext = { + const context: ISchemaRendererContext = useMemo(() => ({ ...mutableContext, schema, @@ -178,7 +178,26 @@ export const SchemaRendererProvider: React.FC<{ dataProductId?: DataProductIdent sampleDataset, setSampleDataset, - }; + }), [ + mutableContext, + + schema, + updateSchema, + totalDatasets, + loadDataProductPreview, + loadDataProductEntity, + + isCreator, + isEditAllowed, + isPreview, + + isEditMode, + enterEditMode, + exitEditMode, + + sampleDataset, + setSampleDataset, + ]); return {children}; }; diff --git a/source/packages/@ada/website/src/views/data-product/context/DataProductContext.tsx b/source/packages/@ada/website/src/views/data-product/context/DataProductContext.tsx index f83db95..2a99739 100644 --- a/source/packages/@ada/website/src/views/data-product/context/DataProductContext.tsx +++ b/source/packages/@ada/website/src/views/data-product/context/DataProductContext.tsx @@ -6,7 +6,7 @@ import { HookError, apiHooks } from '$api'; import { getDataProductSQLIdentitier, getDataProductSourceSQLIdentitier, isNotFoundError } from '$common/utils'; import { useIsOwner } from '$core/provider/UserProvider'; import { useLiveDataProductState, useUserCanEditDataProduct } from '../hooks'; -import React, { createContext, useCallback, useContext } from 'react'; +import React, { createContext, useCallback, useContext, useMemo } from 'react'; interface IDataProductContext { identifier: DataProductIdentifier; @@ -57,7 +57,7 @@ export const DataProductContextProvider: React.FC<{ identifier: DataProductIdent await refetchState({ force: true }); }, [refetchState]); - const context: IDataProductContext = { + const context: IDataProductContext = useMemo(() => ({ identifier, dataProduct, dataProductState, @@ -76,7 +76,19 @@ export const DataProductContextProvider: React.FC<{ identifier: DataProductIdent refetchDataProduct, refetchDataProductState, - }; + }), [ + identifier, + dataProduct, + dataProductState, + error, + + isUserAllowedToEdit, + isDataProductOwner, + canUserQuerySource, + + refetchDataProduct, + refetchDataProductState, + ]); return {children}; }; diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/cloudwatch.test.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/cloudwatch.test.tsx index 95ab31b..a8e1224 100644 --- a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/cloudwatch.test.tsx +++ b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/cloudwatch.test.tsx @@ -23,7 +23,7 @@ describe(`CreateDataProductView/${Connectors.AmazonCloudWatch.ID}`, () => { }); it(`input error - ${Connectors.AmazonCloudWatch.ID}`, async () => { - const { container } = render(); + const { container } = render(); await InputError.play({ canvasElement: container }); diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/dynamodb.test.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/dynamodb.test.tsx index c7198b2..6324640 100644 --- a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/dynamodb.test.tsx +++ b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/dynamodb.test.tsx @@ -51,7 +51,7 @@ describe(`CreateDataProductView/${Connectors.AmazonDynamoDB.ID}`, () => { }); it(`input error - ${Connectors.AmazonDynamoDB.ID}`, async () => { - const { container } = render(); + const { container } = render(); await InputError.play({ canvasElement: container }); diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.stories.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.stories.tsx new file mode 100644 index 0000000..c7a4c5d --- /dev/null +++ b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.stories.tsx @@ -0,0 +1,122 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import * as Connectors from '@ada/connectors'; +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { CreateDataProductView } from '../../index'; +import { DELAY } from '$testing/interaction'; +import { DataProductUpdateTriggerType } from '@ada/common'; +import { + assertReview, + assertSubmit, + clickNext, + gotoSourceTypeDetails, + selectUpdateTriggerType, + useSourceTypeTestApiMocks, +} from '../helpers'; +import { userEvent, within } from '@storybook/testing-library'; +import assert from 'assert'; + +const SOURCE_DETAILS: Connectors.ORACLE.ISourceDetails = { + databaseEndpoint: 'localhost', + databasePort: '1521', + databaseName: 'ada-test-db', + databaseTable: 'test-collection', + username: 'username', + password: 'password', + databaseSchema: '', +}; + +export default { + title: `Views/DataProduct/Create/${Connectors.ORACLE.ID}`, + component: CreateDataProductView, +} as ComponentMeta; + +const Template: ComponentStory = (args) => { + useSourceTypeTestApiMocks(); + + return ; +}; + +export const Primary = Template.bind({}); + +Primary.play = async ({ canvasElement }) => { + await gotoSourceTypeDetails(canvasElement, Connectors.ORACLE.ID); + + const { getByLabelText } = within(canvasElement); + + await userEvent.type(getByLabelText('Database Endpoint or Host Name'), SOURCE_DETAILS.databaseEndpoint, { + delay: DELAY.TYPING, + }); + + await userEvent.type(getByLabelText('Database Port'), SOURCE_DETAILS.databasePort, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Database Name'), SOURCE_DETAILS.databaseName, { + delay: DELAY.TYPING, + }); + + await userEvent.type(getByLabelText('Database Table'), SOURCE_DETAILS.databaseTable, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Database Username'), SOURCE_DETAILS.username, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Database Password'), SOURCE_DETAILS.password, { delay: DELAY.TYPING }); + + await selectUpdateTriggerType(canvasElement, DataProductUpdateTriggerType.ON_DEMAND); + + await clickNext(canvasElement); + + await assertReview(canvasElement, Connectors.ORACLE.ID, SOURCE_DETAILS as any); + + await assertSubmit(canvasElement, { + sourceType: Connectors.ORACLE.ID, + sourceDetails: SOURCE_DETAILS, + }); +}; + +export const InputError = Template.bind({}); + +InputError.play = async ({ canvasElement }) => { + await gotoSourceTypeDetails(canvasElement, Connectors.ORACLE.ID); + + const { getByLabelText } = within(canvasElement); + const { queryByText } = within(canvasElement); + + const input = getByLabelText('Database Endpoint or Host Name'); + await userEvent.type(input, '!@#$', { delay: DELAY.TYPING }); + assert(queryByText('Must be a valid database endpoint'), 'Should show database endpoint error message'); + userEvent.clear(input); + + const input2 = getByLabelText('Database Port'); + await userEvent.type(input2, 'abcd', { delay: DELAY.TYPING }); + assert(queryByText('Must be 0 to 65535'), 'Should show database port error message'); + userEvent.clear(input2); + + const input3 = getByLabelText('Database Name'); + await userEvent.type(input3, ' database-name', { delay: DELAY.TYPING }); + assert( + queryByText('Must be a valid database name that consists of alphanumeric characters, dash, underscore and dot'), + 'Should show database name error message', + ); + userEvent.clear(input3); + + const input4 = getByLabelText('Database Table'); + await userEvent.type(input4, ' databasetable', { delay: DELAY.TYPING }); + assert( + queryByText( + 'Must be a valid database table name that consists of alphanumeric characters, dash, underscore and dot', + ), + 'Should show database table error message', + ); + userEvent.clear(input4); + + const input5 = getByLabelText('Database Username'); + await userEvent.type(input5, ' username', { delay: DELAY.TYPING }); + assert( + queryByText( + 'Must be a valid database user name that consists of alphanumeric characters, dash, underscore and dot', + ), + 'Should show database username error message', + ); + userEvent.clear(input5); + + await selectUpdateTriggerType(canvasElement, DataProductUpdateTriggerType.ON_DEMAND); +}; diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.test.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.test.tsx new file mode 100644 index 0000000..6990d6c --- /dev/null +++ b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/oracle.test.tsx @@ -0,0 +1,33 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import * as Connectors from '@ada/connectors'; +import * as stories from './oracle.stories'; +import { render } from '@testing-library/react'; +import { composeStories } from '@storybook/testing-react'; + +jest.retryTimes(3); +jest.setTimeout(30000); + +jest.mock('@ada/api-client'); + +const { Primary, InputError } = composeStories(stories); + +describe(`CreateDataProductView/${Connectors.ORACLE.ID}`, () => { + describe('storybook', () => { + it(`working - ${Connectors.ORACLE.ID}`, async () => { + const screen = render(); + + await Primary.play({ canvasElement: screen.container }); + + expect(screen.container).toBeDefined(); + }); + + it(`input error - ${Connectors.ORACLE.ID}`, async () => { + const { container } = render(); + + await InputError.play({ canvasElement: container }); + + expect(container).toBeDefined(); + }); + }); +}); diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.stories.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.stories.tsx new file mode 100644 index 0000000..957ff84 --- /dev/null +++ b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.stories.tsx @@ -0,0 +1,127 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import * as Connectors from '@ada/connectors'; +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { CreateDataProductView } from '../../index'; +import { DELAY } from '$testing/interaction'; +import { DataProductUpdateTriggerType } from '@ada/common'; +import { + assertReview, + assertSubmit, + clickNext, + gotoSourceTypeDetails, + selectUpdateTriggerType, + useSourceTypeTestApiMocks, +} from '../helpers'; +import { userEvent, within } from '@storybook/testing-library'; +import assert from 'assert'; + +const SOURCE_DETAILS: Connectors.AmazonRedshift.ISourceDetails = { + "databaseEndpoint": "default.123456789012.us-east-1.redshift-serverless.amazonaws.com", + "databasePort": "5339", + "databaseName": "dev", + "databaseTable": "testTable", + "databaseType": "Serverless", + "workgroup": "default", + "databaseUsername": "", + "clusterIdentifier": "", + "crossAccountRoleArn": 'arn:aws:iam::111111111111:role/xacctrole', +}; + +const CLUSTER_SOURCE_DETAILS: Connectors.AmazonRedshift.ISourceDetails = { + ...SOURCE_DETAILS, + "databaseEndpoint": "test-redshift-cluster.c9reiliclukz.us-east-1.redshift.amazonaws.com", + "databaseType": "Cluster", + "workgroup": "", + "databaseUsername": "awsuser", + "clusterIdentifier": "test-redshift-cluster", + "crossAccountRoleArn": 'arn:aws:iam::111111111111:role/xacctrole', +}; + +export default { + title: `Views/DataProduct/Create/${Connectors.AmazonRedshift.ID}`, + component: CreateDataProductView, +} as ComponentMeta; + +const Template: ComponentStory = (args) => { + useSourceTypeTestApiMocks(); + + return ; +}; + +export const Primary = Template.bind({}); + +Primary.play = async ({ canvasElement }) => { + const { getByLabelText } = within(canvasElement); + + await inputBaseConfig(canvasElement, SOURCE_DETAILS.databaseEndpoint); + + await userEvent.type(getByLabelText('Redshift Serverless Workgroup'), SOURCE_DETAILS.workgroup, { delay: DELAY.TYPING }); + + await clickNext(canvasElement); + + await assertReview(canvasElement, Connectors.AmazonRedshift.ID, SOURCE_DETAILS as any); + + await assertSubmit(canvasElement, { + sourceType: Connectors.AmazonRedshift.ID, + sourceDetails: SOURCE_DETAILS, + }); +}; + +export const RedshiftCluster = Template.bind({}); + +RedshiftCluster.play = async ({ canvasElement }) => { + const { getByLabelText } = within(canvasElement); + + await inputBaseConfig(canvasElement, CLUSTER_SOURCE_DETAILS.databaseEndpoint); + + await userEvent.click(getByLabelText('Is the database Amazon Redshift Serverless?')); + await userEvent.type(getByLabelText('Redshift Cluster Username'), CLUSTER_SOURCE_DETAILS.databaseUsername, { delay: DELAY.TYPING }); + await userEvent.type(getByLabelText('Redshift Cluster Identifier'), CLUSTER_SOURCE_DETAILS.clusterIdentifier, { delay: DELAY.TYPING }); + + await clickNext(canvasElement); + + await assertReview(canvasElement, Connectors.AmazonRedshift.ID, SOURCE_DETAILS as any); + + await assertSubmit(canvasElement, { + sourceType: Connectors.AmazonRedshift.ID, + sourceDetails: CLUSTER_SOURCE_DETAILS, + }); +} + +export const InputError = Template.bind({}); + +InputError.play = async ({ canvasElement }) => { + await gotoSourceTypeDetails(canvasElement, Connectors.AmazonRedshift.ID); + + const { getByLabelText, queryByText, queryAllByText } = within(canvasElement); + + await userEvent.type(getByLabelText('Redshift Endpoint'), 'bad-redshift-endpoint', { delay: DELAY.TYPING }); + assert(queryByText('Must be a valid Redshift endpiont'), 'Should show Redshift endpoint error message'); + + await userEvent.type(getByLabelText('Database Port'), '100000', { delay: DELAY.TYPING }); + + assert(queryByText('Must be 0 to 65535'), 'Should show Redshift database port message'); + + assert(queryAllByText('Required').length === 3); +}; + +const inputBaseConfig = async (canvasElement: HTMLElement, endpointContent: string) => { + await gotoSourceTypeDetails(canvasElement, Connectors.AmazonRedshift.ID); + + const { getByLabelText } = within(canvasElement); + + await userEvent.type(getByLabelText('Redshift Endpoint'), endpointContent, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Database Port'), SOURCE_DETAILS.databasePort, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Database Name'), SOURCE_DETAILS.databaseName, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Database Table'), SOURCE_DETAILS.databaseTable, { delay: DELAY.TYPING }); + + await userEvent.type(getByLabelText('Redshift Cross Account Access IAM Role ARN'), SOURCE_DETAILS.crossAccountRoleArn!, { + delay: DELAY.TYPING, + }); + + await selectUpdateTriggerType(canvasElement, DataProductUpdateTriggerType.ON_DEMAND); +} diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.test.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.test.tsx new file mode 100644 index 0000000..20375ff --- /dev/null +++ b/source/packages/@ada/website/src/views/data-product/views/Create/__tests__/source-type/redshift.test.tsx @@ -0,0 +1,41 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import * as Connectors from '@ada/connectors'; +import * as stories from './redshift.stories'; +import { render } from '@testing-library/react'; +import { composeStories } from '@storybook/testing-react'; + +jest.retryTimes(3); +jest.setTimeout(30000); + +jest.mock('@ada/api-client'); + +const { Primary, RedshiftCluster, InputError } = composeStories(stories); + +describe(`CreateDataProductView/${Connectors.AmazonRedshift.ID}`, () => { + describe('storybook', () => { + it(`working - ${Connectors.AmazonRedshift.ID}`, async () => { + const screen = render(); + + await Primary.play({ canvasElement: screen.container }); + + expect(screen.container).toBeDefined(); + }); + + it(`working - ${Connectors.AmazonRedshift.ID} - Redshift Cluster`, async () => { + const screen = render(); + + await RedshiftCluster.play({ canvasElement: screen.container }); + + expect(screen.container).toBeDefined(); + }); + + it(`input error - ${Connectors.AmazonRedshift.ID}`, async () => { + const screen = render(); + + await InputError.play({ canvasElement: screen.container }); + + expect(screen.container).toBeDefined(); + }); + }); +}); diff --git a/source/packages/@ada/website/src/views/data-product/views/Create/components/TransformsPlanner/context.tsx b/source/packages/@ada/website/src/views/data-product/views/Create/components/TransformsPlanner/context.tsx index 8a77d20..c0d941b 100644 --- a/source/packages/@ada/website/src/views/data-product/views/Create/components/TransformsPlanner/context.tsx +++ b/source/packages/@ada/website/src/views/data-product/views/Create/components/TransformsPlanner/context.tsx @@ -64,7 +64,7 @@ export const TransformPlannerContextProvider: React.FC = ({ transformedSchema?.preview && addFields(interpolateFieldEntriesFromPreview(transformedSchema.preview)); }, [transformedSchema]); - const context: ITransformPlannerContext = { + const context: ITransformPlannerContext = useMemo(() => ({ emitter, sourceSchema, transformedSchema, @@ -73,7 +73,16 @@ export const TransformPlannerContextProvider: React.FC = ({ addFields, transformPlan, updateTransformPlan, - }; + }), [ + emitter, + sourceSchema, + transformedSchema, + fields, + addField, + addFields, + transformPlan, + updateTransformPlan, + ]); return {children}; }; diff --git a/source/packages/@ada/website/src/views/governance/components/Summary.tsx b/source/packages/@ada/website/src/views/governance/components/Summary.tsx index aa3c621..1265035 100644 --- a/source/packages/@ada/website/src/views/governance/components/Summary.tsx +++ b/source/packages/@ada/website/src/views/governance/components/Summary.tsx @@ -1,23 +1,53 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import { EntityCreatedKV, EntityUpdatedKV, SqlViewer } from '$common/components'; -import { GOVERNABLE_GROUPS } from '$common/entity/ontology'; -import { OntologyIdentifier } from '@ada/api'; +import { LensEnum, OntologyIdentifier } from '@ada/api'; import { Skeletons, SummarySection } from '$northstar-plus/components'; import { SummaryRenderer } from '$northstar-plus/components/SummaryRenderer'; import { apiHooks } from '$api'; +import { getSortedGroupArray } from '../utils/getSortedGroupArray'; import { groupDisplayName } from '$common/entity/group/utils'; import { isEmpty, startCase, upperCase } from 'lodash'; import { ontologyLensDisplay } from '$common/utils'; import { useI18nContext } from '$strings'; -import { useOntologyGovernance } from '../hooks'; -import React from 'react'; +import { useOntologyGovernanceAttribute } from '../hooks'; +import React, { useCallback } from 'react'; export const OntologySummary: React.FC<{ id: OntologyIdentifier }> = ({ id }) => { const { LL } = useI18nContext(); const [ontology] = apiHooks.useOntology(id); - const [governance] = useOntologyGovernance(id); + const [governance] = useOntologyGovernanceAttribute(id); + + const generateData = useCallback((groupId: string, column?: LensEnum, row?: string) => { + return { + title: LL.VIEW.GOVERNANCE.summary.section.groupGovernance.title({ + group: groupDisplayName(groupId), + }), + subtitle: LL.VIEW.GOVERNANCE.summary.section.groupGovernance.subtitle({ + group: groupDisplayName(groupId), + }), + properties: [ + { + label: LL.ENTITY.AttributePolicy(), + value: column && ontology && ontologyLensDisplay(column, ontology.defaultLens), + }, + { + label: LL.ENTITY.AttributeValuePolicy(), + value: isEmpty(row) ? null : ( + + ), + }, + ], + }; + }, [LL, ontology]); if (ontology == null || governance == null) { return ; @@ -65,36 +95,11 @@ export const OntologySummary: React.FC<{ id: OntologyIdentifier }> = ({ id }) => }, ], }, - ...GOVERNABLE_GROUPS.map((groupId): SummarySection => { - const { column, row } = governance[groupId]; + // Display default groups + custom groups in sequence + ...getSortedGroupArray(governance).map((group): SummarySection => { + const { column, row, groupId } = group; - return { - title: LL.VIEW.GOVERNANCE.summary.section.groupGovernance.title({ - group: groupDisplayName(groupId), - }), - subtitle: LL.VIEW.GOVERNANCE.summary.section.groupGovernance.subtitle({ - group: groupDisplayName(groupId), - }), - properties: [ - { - label: LL.ENTITY.AttributePolicy(), - value: column && ontologyLensDisplay(column, ontology.defaultLens), - }, - { - label: LL.ENTITY.AttributeValuePolicy(), - value: isEmpty(row) ? null : ( - - ), - }, - ], - }; + return generateData(groupId, column, row); }), ]} /> diff --git a/source/packages/@ada/website/src/views/governance/components/Wizard.tsx b/source/packages/@ada/website/src/views/governance/components/Wizard.tsx index 927aadc..caa548d 100644 --- a/source/packages/@ada/website/src/views/governance/components/Wizard.tsx +++ b/source/packages/@ada/website/src/views/governance/components/Wizard.tsx @@ -1,27 +1,26 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import { Alert, Stack } from 'aws-northstar'; +import { AttributePolicy, AttributeValuePolicy, Ontology, OntologyIdentifier, OntologyInput } from '@ada/api'; import { CustomComponentTypes, ErrorAlert } from '$common/components'; import { CustomValidatorTypes } from '$common/components/form-renderer/validators'; -import { DefaultGroupIds, ID_VALIDATION, OntologyNamespace, ReservedDomains } from '@ada/common'; -import { Field, validatorTypes } from 'aws-northstar/components/FormRenderer'; +import { ID_VALIDATION, OntologyNamespace, ReservedDomains, buildNamespaceAndAttributeId } from '@ada/common'; import { - GOVERNABLE_GROUPS, LENSE_OPTIONS, LENSE_OPTIONS_WITH_NULLABLE, NONE_LENS_OPTION, } from '$common/entity/ontology'; -import { LensEnum, Ontology, OntologyIdentifier, OntologyInput } from '@ada/api'; import { NO_REFRESH_OPTIONS, apiHooks } from '$api'; +import { OntologyGovernanceGroup, useOntologyGovernanceAttribute } from '../hooks'; import { Skeletons, WizardLayout, WizardStep, useNotificationContext } from '$northstar-plus'; import { componentTypes } from 'aws-northstar/components/FormRenderer/types'; -import { get, isEmpty, omit, pick } from 'lodash'; import { getOntologyIdString, isDataEqual, nameToIdentifier } from '$common/utils'; -import { groupDisplayName } from '$common/entity/group/utils'; +import { getSortedGroupArray } from '../utils/getSortedGroupArray'; +import { omit, pick } from 'lodash'; import { useFormApi } from '@data-driven-forms/react-form-renderer'; import { useHistory } from 'react-router-dom'; import { useI18nContext } from '$strings'; -import { useOntologyGovernance } from '../hooks'; +import { validatorTypes } from 'aws-northstar/components/FormRenderer'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; /* eslint-plugin-disable sonarjs */ @@ -35,15 +34,11 @@ const SYSTEM = 'system'; const ALLOWED_SYSTEM_MUTABLES: (keyof OntologyInput)[] = ['defaultLens', 'aliases']; -interface OntologyGroupGovernance { - column?: LensEnum; - row?: string; // sql clause -} interface FormData extends Ontology { updatedTimestamp?: string; existing?: boolean; system?: boolean; - group?: Record; + groups?: OntologyGovernanceGroup[]; } export const CreateOntologyWizard: React.FC = () => { @@ -52,24 +47,29 @@ export const CreateOntologyWizard: React.FC = () => { ontologyNamespace: OntologyNamespace.DEFAULT, aliases: [], columnGovernance: { - [DefaultGroupIds.DEFAULT]: undefined, - [DefaultGroupIds.POWER_USER]: undefined, - [DefaultGroupIds.ADMIN]: undefined, }, rowGovernance: { - [DefaultGroupIds.DEFAULT]: undefined, - [DefaultGroupIds.POWER_USER]: undefined, - [DefaultGroupIds.ADMIN]: undefined, }, + groups: [], }; }, []); return ; }; +const renderCustomComponent = ( + content: string, + system?: boolean, +) => () => { + if (system) { + return {content}; + } + return null; +}; + export const UpdateOntologyWizard: React.FC<{ id: OntologyIdentifier }> = ({ id }) => { const [existingOntology, { isLoading: isLoadingExisting, error }] = apiHooks.useOntology(id, NO_REFRESH_OPTIONS); - const [governace, { isLoading: isLoadingGoverance }] = useOntologyGovernance(id); + const [governance, { isLoading: isLoadingGoverance }] = useOntologyGovernanceAttribute(id); const [initialValues, setInitialValues] = useState>(); @@ -80,7 +80,7 @@ export const UpdateOntologyWizard: React.FC<{ id: OntologyIdentifier }> = ({ id existing: true, system: existingOntology?.createdBy === SYSTEM, - group: governace, + groups: getSortedGroupArray(governance), }); } }, [isLoadingExisting, isLoadingGoverance]); @@ -116,12 +116,7 @@ const Wizard: React.FC<{ initialValues: Partial }> = ({ initialValues component: componentTypes.CUSTOM, name: '__system_warning', hidenField: !system, - CustomComponent: () => { - if (system) { - return {LL.VIEW.GOVERNANCE.wizard.alert.systemEntity()}; - } - return null; - }, + CustomComponent: renderCustomComponent(LL.VIEW.GOVERNANCE.wizard.alert.systemEntity(), system), }, { // TODO: use freeform select without restricted global @@ -132,7 +127,7 @@ const Wizard: React.FC<{ initialValues: Partial }> = ({ initialValues helperText: LL_ONTOLOGY_ATTR.namespace.hintText(), isRequired: true, resolveProps: (_props, _field, form) => { - const { existing, system:isSystem } = form.getState().initialValues as FormData; + const { existing, system: isSystem } = form.getState().initialValues as FormData; const isReadOnly = existing || isSystem; return { isReadOnly, @@ -166,7 +161,7 @@ const Wizard: React.FC<{ initialValues: Partial }> = ({ initialValues description: LL_ONTOLOGY_ATTR.name.description(), isRequired: true, resolveProps: (_props, _field, form) => { - const { existing, system:isSystem } = form.getState().initialValues as FormData; + const { existing, system: isSystem } = form.getState().initialValues as FormData; const isReadOnly = existing || isSystem; return { isReadOnly, @@ -232,46 +227,42 @@ const Wizard: React.FC<{ initialValues: Partial }> = ({ initialValues }, ], }, - ...GOVERNABLE_GROUPS.map((groupId): Field => { - return { - component: componentTypes.SUB_FORM, - title: groupDisplayName(groupId), - description: LL.VIEW.GOVERNANCE.wizard.groupGovernance.description(), - name: `group.${groupId}`, - fields: [ - { - component: componentTypes.SELECT, - name: `group.${groupId}.column`, - label: LL.ENTITY.AttributePolicy(), - description: LL.ENTITY.AttributePolicy_description(), - isOptional: true, - options: LENSE_OPTIONS_WITH_NULLABLE, + { + component: CustomComponentTypes.GOVERNANCE_EDIT, + name: 'groups', + fields: [ + { + component: componentTypes.SELECT, + name: `column`, + label: LL.ENTITY.AttributePolicy(), + description: LL.ENTITY.AttributePolicy_description(), + isOptional: true, + options: LENSE_OPTIONS_WITH_NULLABLE, + }, + { + component: CustomComponentTypes.CODE_EDITOR, + name: `row`, + label: LL.ENTITY.AttributeValuePolicy(), + description: LL.ENTITY.AttributeValuePolicy_description(), + mode: 'sql', + // @ts-ignore + resolveProps: (_props, _field, form) => { + const { ontologyNamespace = 'abc', name = 'attribute' } = form.getState().values; + const id = getOntologyIdString({ ontologyId: nameToIdentifier(name), ontologyNamespace }); + + return { + helpText: `eg. "${id}" > 100`, + hintText: `eg. "${id}" > 100`, + }; }, - { - component: CustomComponentTypes.CODE_EDITOR, - name: `group.${groupId}.row`, - label: LL.ENTITY.AttributeValuePolicy(), - description: LL.ENTITY.AttributeValuePolicy_description(), - mode: 'sql', - // @ts-ignore - resolveProps: (_props, _field, form) => { - const { ontologyNamespace = 'abc', name = 'attribute' } = form.getState().values; - const id = getOntologyIdString({ ontologyId: nameToIdentifier(name), ontologyNamespace }); - - return { - helpText: `eg. "${id}" > 100`, - hintText: `eg. "${id}" > 100`, - }; + validate: [ + { + type: CustomValidatorTypes.SQL_CLAUSE, }, - validate: [ - { - type: CustomValidatorTypes.SQL_CLAUSE, - }, - ], - }, - ], - }; - }), + ], + }, + ], + } ], }, ]; @@ -300,10 +291,10 @@ const useSaveOntology = () => { const [isSubmitting, setIsSubmitting] = useState(false); const { addError, addSuccess } = useNotificationContext(); - const [putAttribute] = apiHooks.usePutGovernancePolicyAttributesGroupAsync(); - const [deleteAttribute] = apiHooks.useDeleteGovernancePolicyAttributesGroupAsync(); - const [putAttributeValue] = apiHooks.usePutGovernancePolicyAttributeValuesGroupAsync(); - const [deleteAttributeValue] = apiHooks.useDeleteGovernancePolicyAttributeValuesGroupAsync(); + const [batchPutAttributes] = apiHooks.usePutGovernancePolicyAttributesAsync(); + const [batchDeleteAttributes] = apiHooks.useDeleteGovernancePolicyAttributesAsync(); + const [batchPutAttributeValues] = apiHooks.usePutGovernancePolicyAttributeValuesAsync(); + const [batchDeleteAttributeValues] = apiHooks.useDeleteGovernancePolicyAttributeValuesAsync(); const [putOntology] = apiHooks.usePutOntologyAsync(); /* eslint-disable sonarjs/cognitive-complexity */ @@ -315,7 +306,6 @@ const useSaveOntology = () => { const isExisting = formData.existing === true; const isSystem = formData.system === true; const modified = formState.modified || {}; - const { name, ontologyNamespace, description, defaultLens, updatedTimestamp, aliases } = formData; const ontologyId = nameToIdentifier(name); @@ -323,6 +313,8 @@ const useSaveOntology = () => { throw new Error(`Form name and ontologyId are inconsistent for update`); } + const namespaceAndAttributeId = buildNamespaceAndAttributeId(ontologyNamespace, ontologyId); + if (isExisting !== true) { // CREATE NEW await putOntology({ @@ -336,44 +328,47 @@ const useSaveOntology = () => { }, }); - await Promise.all( - GOVERNABLE_GROUPS.flatMap((groupId) => { - const operations: Promise[] = []; - - const columnProp = `group.${groupId}.column`; - const columnValue = get(formData, columnProp); - if (modified[columnProp] && !isEmpty(columnValue)) { - operations.push( - putAttribute({ - group: groupId, - attributeId: ontologyId, - ontologyNamespace: ontologyNamespace, - attributePolicyInput: { - lensId: columnValue, - }, - }), - ); + const attributePolicies: AttributePolicy[] = []; + const attributeValuePolicies: AttributeValuePolicy[] = []; + + (formData.groups || []).forEach((groupRecord) => { + + if (groupRecord.column && groupRecord.column !== NONE_LENS_OPTION.value) { + attributePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + lensId: groupRecord.column, + }) + } + + if (groupRecord.row && groupRecord.row !== NONE_LENS_OPTION.value) { + attributeValuePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + sqlClause: groupRecord.row, + }); + } + }); + + const operations: Promise[] = []; + + if (attributePolicies.length > 0) { + operations.push(batchPutAttributes({ + putGovernancePolicyAttributesRequest: { + policies: attributePolicies, } + })); + } - const rowProp = `group.${groupId}.row`; - const rowValue = get(formData, rowProp); - - if (modified[rowProp] && !isEmpty(rowValue)) { - operations.push( - putAttributeValue({ - group: groupId, - attributeId: ontologyId, - ontologyNamespace: ontologyNamespace, - attributeValuePolicyInput: { - sqlClause: rowValue, - }, - }), - ); + if (attributeValuePolicies.length > 0) { + operations.push(batchPutAttributeValues({ + putGovernancePolicyAttributeValuesRequest: { + policies: attributeValuePolicies, } + })) + } - return operations; - }), - ); + operations.length > 0 && await Promise.all(operations); addSuccess({ header: LL.ENTITY.Ontology__CREATED(name), @@ -407,77 +402,108 @@ const useSaveOntology = () => { }); } - await Promise.all( - GOVERNABLE_GROUPS.flatMap((groupId) => { - const operations: Promise[] = []; - - const columnProp = `group.${groupId}.column`; - const columnValue = get(formData, columnProp); - - if (modified[columnProp]) { - if (isEmpty(columnValue) || columnValue === NONE_LENS_OPTION.value) { - // DELETE if previously had value but now is empy - const initValue = formState.initialValues.group[groupId].column; - if (initValue && !isEmpty(initValue)) { - operations.push( - deleteAttribute({ - group: groupId, - attributeId: ontologyId, - ontologyNamespace, - }), - ); - } - } else { - // SET if has value and modified - operations.push( - putAttribute({ - group: groupId, - attributeId: ontologyId, - ontologyNamespace: ontologyNamespace, - attributePolicyInput: { - lensId: columnValue, - updatedTimestamp: formState.values.group[groupId].columnUpdatedTimestamp, - }, - }), - ); - } + const attributePolicies: AttributePolicy[] = []; + const attributeValuePolicies: AttributeValuePolicy[] = []; + + const deleledAttributePolicies: AttributePolicy[] = []; + const deletedAttributeValuePolicies: AttributeValuePolicy[] = []; + + (formData.groups || []).forEach((groupRecord) => { + // Original groupRecords + const initValue = formState.initialValues.groups.find((g: any) => g.groupId === groupRecord.groupId); + + if (!groupRecord.column || groupRecord.column === NONE_LENS_OPTION.value) { + // DELETE if previously had value but now is empy + if (initValue?.column) { + deleledAttributePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + lensId: initValue?.column, + }); } + } else if (initValue?.column !== groupRecord.column) { + // SET if has value and modified + attributePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + lensId: groupRecord.column, + }) + } - const rowProp = `group.${groupId}.row`; - const rowValue = get(formData, rowProp); - - if (modified[rowProp]) { - if (isEmpty(rowValue)) { - // DELETE if previously had value but now is empy - const initValue = formState.initialValues.group[groupId].row; - if (initValue && !isEmpty(initValue)) { - operations.push( - deleteAttributeValue({ - group: groupId, - attributeId: ontologyId, - ontologyNamespace, - }), - ); - } - } else { - // SET if has value and modified - operations.push( - putAttributeValue({ - group: groupId, - attributeId: ontologyId, - ontologyNamespace: ontologyNamespace, - attributeValuePolicyInput: { - sqlClause: rowValue, - updatedTimestamp: formState.values.group[groupId].rowUpdatedTimestamp, - }, - }), - ); - } + if (!groupRecord.row) { + // DELETE if previously had value but now is empy + if (initValue?.row) { + deletedAttributeValuePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + sqlClause: '', + }); + } + } else if (initValue?.row !== groupRecord.row) { + // SET if has value and modified + attributeValuePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + sqlClause: groupRecord.row, + }); + } + }); + + (formState.initialValues.groups || []) + .filter((g: any) => !formData.groups?.find(xg => xg.groupId === g.groupId)) + .forEach((groupRecord: any) => { + if (groupRecord.column) { + deleledAttributePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + lensId: groupRecord.column, + }); + } + + if (groupRecord.row) { + deletedAttributeValuePolicies.push({ + group: groupRecord.groupId, + namespaceAndAttributeId, + sqlClause: groupRecord.row, + }); } + }); + + const operations: Promise[] = []; + + if (attributePolicies.length > 0) { + operations.push(batchPutAttributes({ + putGovernancePolicyAttributesRequest: { + policies: attributePolicies, + } + })); + } + + if (attributeValuePolicies.length > 0) { + operations.push(batchPutAttributeValues({ + putGovernancePolicyAttributeValuesRequest: { + policies: attributeValuePolicies, + } + })); + } + + if (deleledAttributePolicies.length > 0) { + operations.push(batchDeleteAttributes({ + deleteGovernancePolicyAttributesRequest: { + policies: deleledAttributePolicies, + } + })); + } + + if (deletedAttributeValuePolicies.length > 0) { + operations.push(batchDeleteAttributeValues({ + deleteGovernancePolicyAttributeValuesRequest: { + policies: deletedAttributeValuePolicies, + } + })); + } - return operations; - }), - ); + operations.length > 0 && await Promise.all(operations); addSuccess({ header: LL.ENTITY.Ontology__UPDATED(name), diff --git a/source/packages/@ada/website/src/views/governance/hooks/index.tsx b/source/packages/@ada/website/src/views/governance/hooks/index.tsx index 3c7c748..8332c5c 100644 --- a/source/packages/@ada/website/src/views/governance/hooks/index.tsx +++ b/source/packages/@ada/website/src/views/governance/hooks/index.tsx @@ -1,8 +1,8 @@ /*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ +import { AttributePolicy, AttributeValuePolicy, LensEnum, OntologyIdentifier } from '@ada/api'; import { DefaultGroupIds } from '@ada/common'; import { GOVERNABLE_GROUPS } from '$common/entity/ontology'; -import { LensEnum, OntologyIdentifier } from '@ada/api'; import { apiHooks } from '$api'; import { isEmpty } from '@aws-amplify/core'; import { useMemo } from 'react'; @@ -44,6 +44,68 @@ export const useOntologyGroupGovernance = ( }, [groupId, column, isLoadingColumn, row, isLoadingRow]); }; +export const DEFAULT_RECORDS = { + [DefaultGroupIds.DEFAULT]: { + groupId: DefaultGroupIds.DEFAULT as string, + }, + [DefaultGroupIds.POWER_USER]: { + groupId: DefaultGroupIds.POWER_USER as string, + }, + [DefaultGroupIds.ADMIN]: { + groupId: DefaultGroupIds.ADMIN as string, + }, +}; + +export const useOntologyGovernanceAttribute = ( + id: OntologyIdentifier, +): [Record | undefined, { isLoading: boolean }] => { + const [column, { isLoading: isLoadingColumn }] = apiHooks.useGovernancePolicyAttributesAttribute({ + attributeId: id.ontologyId, + ontologyNamespace: id.ontologyNamespace, + }); + + const [row, { isLoading: isLoadingRow }] = apiHooks.useGovernancePolicyAttributeValuesAttribute({ + attributeId: id.ontologyId, + ontologyNamespace: id.ontologyNamespace, + }); + + const isLoading = (isLoadingColumn || isLoadingRow); + + return useMemo(() => { + if (isLoading) { + return [undefined, { isLoading }]; + } + + const columnAggregatedRecords: Record = + column?.policies.reduce((agg: Record, c: AttributePolicy) => { + return { + ...agg, + [c.group]: { + ...agg[c.group], + groupId: c.group, + column: c.lensId, + }, + } + }, {}) || {}; + + const records = row?.policies.reduce((agg: Record, r: AttributeValuePolicy) => { + return { + ...agg, + [r.group]: { + ...agg[r.group], + groupId: r.group, + row: r.sqlClause, + }, + } + }, columnAggregatedRecords) || {}; + + return [ + records, + { isLoading }, + ]; + }, [column, isLoading, row]); +}; + export const useOntologyGovernance = ( id: OntologyIdentifier, ): [Record | undefined, { isLoading: boolean }] => { diff --git a/source/packages/@ada/website/src/views/governance/utils/getSortedGroupArray.ts b/source/packages/@ada/website/src/views/governance/utils/getSortedGroupArray.ts new file mode 100644 index 0000000..8748a93 --- /dev/null +++ b/source/packages/@ada/website/src/views/governance/utils/getSortedGroupArray.ts @@ -0,0 +1,24 @@ +/*! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 */ +import { + GOVERNABLE_GROUPS, +} from '$common/entity/ontology'; +import { OntologyGovernanceGroup } from '../hooks'; + +const defaultGroupArray = (Array.from(GOVERNABLE_GROUPS) as string[]); + +export const getSortedGroupArray = (governance?: Record) => governance && + Object.keys(governance).sort((x, y) => { + const findIndexX = defaultGroupArray.findIndex(g => g === x) + 1 || 10; + const findIndexY = defaultGroupArray.findIndex(g => g === y) + 1 || 10; + + if(findIndexX === findIndexY) { + if(y > x) { + return -1; + } + + return 1; + } + + return findIndexX - findIndexY; + }).slice(0).map(k => governance[k]) || []; \ No newline at end of file diff --git a/source/packages/@ada/website/src/views/governance/views/Create/index.stories.tsx b/source/packages/@ada/website/src/views/governance/views/Create/index.stories.tsx index d88c5b7..81097ff 100644 --- a/source/packages/@ada/website/src/views/governance/views/Create/index.stories.tsx +++ b/source/packages/@ada/website/src/views/governance/views/Create/index.stories.tsx @@ -11,11 +11,11 @@ import { MemoryRouter, Route } from 'react-router-dom'; import { NONE_LENS_OPTION } from '$common/entity/ontology'; import { PutOntologyRequest } from '@ada/api'; import { act, waitFor } from '@testing-library/react'; +import { autoSuggestOptionEvent, selectOptionEvent } from '$testing/user-event'; import { delay } from '$common/utils'; import { findSQLEditor } from '$testing/sql-editor'; import { groupDisplayName } from '$common/entity/group/utils'; import { pick } from 'lodash'; -import { selectOptionEvent } from '$testing/user-event'; import { useImmediateEffect } from '$common/hooks'; import { userEvent, within } from '@storybook/testing-library'; @@ -100,9 +100,10 @@ Coverage.play = async ({ canvasElement }) => { await delay(DELAY.SHORT); }); - await selectOptionEvent(canvasElement, LL.ENTITY['Ontology@'].defaultLens.label(), NEW_ONTOLOGY.defaultLens); + await selectOptionEvent(canvasElement, LL.ENTITY['Ontology@'].defaultLens.label(), NEW_ONTOLOGY.defaultLens); for (const [groupId, column, row] of GOVERNANCE_MAP) { + await addGroupPolicy(canvasElement, groupId); column && await editGroupColumnPolicy(canvasElement, groupId, column); row && await editGroupRowPolicy(canvasElement, groupId, row); } @@ -122,11 +123,24 @@ Coverage.play = async ({ canvasElement }) => { ontologyInput: pick(NEW_ONTOLOGY, ['aliases', 'defaultLens', 'description', 'name']), } as PutOntologyRequest, undefined); - expect(API.putGovernancePolicyAttributesGroup).toBeCalledTimes(2); - expect(API.putGovernancePolicyAttributeValuesGroup).toBeCalledTimes(2); + expect(API.putGovernancePolicyAttributes).toBeCalledTimes(1); + expect(API.putGovernancePolicyAttributeValues).toBeCalledTimes(1); }) }; +async function addGroupPolicy(canvasElement: HTMLElement, groupId: string) { + const { getByText, getByTestId } = within(canvasElement); + await autoSuggestOptionEvent(getByTestId('search-custom-group'), LL.VIEW.GOVERNANCE.actions.searchGroups(), groupDisplayName(groupId)); + + await delay(DELAY.SHORT); + + await act(async () => { + userEvent.click(getByText('Add Governance Settings')); + }); + + await delay(DELAY.SHORT); +} + async function editGroupColumnPolicy(canvasElement: HTMLElement, groupId: string, value?: string) { const { getByText } = within(canvasElement); const groupContainer: HTMLElement = (getByText(groupDisplayName(groupId))).closest('.MuiBox-root')!; diff --git a/source/packages/@ada/website/src/views/governance/views/Update/index.stories.tsx b/source/packages/@ada/website/src/views/governance/views/Update/index.stories.tsx index 8aeac88..d21c2c7 100644 --- a/source/packages/@ada/website/src/views/governance/views/Update/index.stories.tsx +++ b/source/packages/@ada/website/src/views/governance/views/Update/index.stories.tsx @@ -2,16 +2,17 @@ SPDX-License-Identifier: Apache-2.0 */ import * as fixtures from '$testing/__fixtures__'; import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { DELAY } from '$testing/interaction'; import { DefaultGroupIds, LensIds } from '@ada/common'; import { LL } from '$strings'; import { MemoryRouter, Route } from 'react-router-dom'; import { NONE_LENS_OPTION } from '$common/entity/ontology'; import { UpdateOntologyView } from './index'; import { act } from '@testing-library/react'; +import { autoSuggestOptionEvent, selectOptionEvent } from '$testing/user-event'; import { delay, getOntologyIdString } from '$common/utils'; import { findSQLEditor } from '$testing/sql-editor'; import { groupDisplayName } from '$common/entity/group/utils'; -import { selectOptionEvent } from '$testing/user-event'; import { userEvent, within } from '@storybook/testing-library'; const SYSTEM_ONTOLOGY = fixtures.ONTOLOGY_PII_LOCATION; @@ -47,12 +48,18 @@ System.parameters = { export const Coverage = Template.bind({}); +const GOVERNANCE_MAP: [groupId: DefaultGroupIds, column: string | undefined, row: string | undefined][] = [ + [DefaultGroupIds.DEFAULT, undefined, 'foo > 5'], + [DefaultGroupIds.POWER_USER, LensIds.CLEAR, undefined], + [DefaultGroupIds.ADMIN, LensIds.CLEAR, undefined], +] + Coverage.play = async ({ canvasElement }) => { const { getByText, getByLabelText } = within(canvasElement); // ensure state is fully resolved await act(async () => { - await delay(10); + await delay(DELAY.SHORT); }); await userEvent.type(getByLabelText('Description'), 'Updated description', { delay: 2 }); @@ -62,21 +69,19 @@ Coverage.play = async ({ canvasElement }) => { }); await act(async () => { - await delay(10); + await delay(DELAY.SHORT); }); await selectOptionEvent(canvasElement, LL.ENTITY['Ontology@'].defaultLens.label(), LensIds.HASHED); - await editGroupColumnPolicy(canvasElement, DefaultGroupIds.DEFAULT); - await editGroupColumnPolicy(canvasElement, DefaultGroupIds.POWER_USER, LensIds.CLEAR); - await editGroupColumnPolicy(canvasElement, DefaultGroupIds.ADMIN, LensIds.CLEAR); - - await editGroupRowPolicy(canvasElement, DefaultGroupIds.DEFAULT, 'foo > 5'); - await editGroupRowPolicy(canvasElement, DefaultGroupIds.POWER_USER); - await editGroupRowPolicy(canvasElement, DefaultGroupIds.ADMIN); + for (const [groupId, column, row] of GOVERNANCE_MAP) { + await addGroupPolicy(canvasElement, groupId); + await editGroupColumnPolicy(canvasElement, groupId, column); + await editGroupRowPolicy(canvasElement, groupId, row); + } await act(async () => { - await delay(100); + await delay(DELAY.IMMEDIATE); }); await act(async () => { @@ -84,6 +89,20 @@ Coverage.play = async ({ canvasElement }) => { }); }; +async function addGroupPolicy(canvasElement: HTMLElement, groupId: string) { + const { getByText, getByTestId } = within(canvasElement); + + await autoSuggestOptionEvent(getByTestId('search-custom-group'), LL.VIEW.GOVERNANCE.actions.searchGroups(), groupDisplayName(groupId)); + + await delay(DELAY.SHORT); + + await act(async () => { + userEvent.click(getByText('Add Governance Settings')); + }); + + await delay(DELAY.SHORT); +} + async function editGroupColumnPolicy(canvasElement: HTMLElement, groupId: string, value?: string) { const { getByText } = within(canvasElement); const groupContainer: HTMLElement = (getByText(groupDisplayName(groupId))).closest('.MuiBox-root')!; @@ -96,7 +115,7 @@ async function editGroupRowPolicy(canvasElement: HTMLElement, groupId: string, v const sqlEditor = await findSQLEditor(groupContainer); await act(async () => { - await sqlEditor.setValue(value); + await sqlEditor.setValue(value || ''); await delay(10); }); diff --git a/source/packages/@ada/website/src/views/governance/views/Update/index.test.tsx b/source/packages/@ada/website/src/views/governance/views/Update/index.test.tsx index 6afba1b..2c40651 100644 --- a/source/packages/@ada/website/src/views/governance/views/Update/index.test.tsx +++ b/source/packages/@ada/website/src/views/governance/views/Update/index.test.tsx @@ -3,15 +3,12 @@ SPDX-License-Identifier: Apache-2.0 */ import * as fixtures from '$testing/__fixtures__'; import * as stories from './index.stories'; import { MOCK_API_CLIENT as API } from '@ada/api-client/mock'; +import { DELAY } from '$testing/interaction'; import { DefaultGroupIds, LensIds } from '@ada/common'; +import { LL } from '@ada/strings'; import { - DeleteGovernancePolicyAttributeValuesGroupRequest, - DeleteGovernancePolicyAttributesGroupRequest, - PutGovernancePolicyAttributeValuesGroupRequest, - PutGovernancePolicyAttributesGroupRequest, PutOntologyRequest, } from '@ada/api'; -import { LL } from '@ada/strings'; import { act, render } from '@testing-library/react'; import { composeStories } from '@storybook/testing-react'; import { delay } from '$common/utils'; @@ -38,7 +35,7 @@ describe('views/goverance/update', () => { const { container, findByText } = render(); await act(async () => { - await delay(10); + await delay(DELAY.SHORT); }); await act(async () => { @@ -46,7 +43,7 @@ describe('views/goverance/update', () => { }); await act(async () => { - await delay(100); + await delay(DELAY.SHORT); }); // notification @@ -68,53 +65,42 @@ describe('views/goverance/update', () => { ); // column policy - expect(API.putGovernancePolicyAttributesGroup).toHaveBeenCalledTimes(1); - expect(API.putGovernancePolicyAttributesGroup).toHaveBeenCalledWith( - { - group: DefaultGroupIds.POWER_USER, - ontologyNamespace: CUSTOM_ONTOLOGY.ontologyNamespace, - attributeId: CUSTOM_ONTOLOGY.ontologyId, - attributePolicyInput: { - lensId: 'clear', - updatedTimestamp: fixtures.ENTITY_CRUD.updatedTimestamp, - }, - } as PutGovernancePolicyAttributesGroupRequest, - undefined, - ); - - expect(API.deleteGovernancePolicyAttributesGroup).toHaveBeenCalledTimes(1); - expect(API.deleteGovernancePolicyAttributesGroup).toHaveBeenCalledWith( + expect(API.putGovernancePolicyAttributes).toHaveBeenCalledTimes(1); + expect(API.putGovernancePolicyAttributes).toHaveBeenCalledWith( { - group: DefaultGroupIds.DEFAULT, - ontologyNamespace: CUSTOM_ONTOLOGY.ontologyNamespace, - attributeId: CUSTOM_ONTOLOGY.ontologyId, - } as DeleteGovernancePolicyAttributesGroupRequest, - undefined, + putGovernancePolicyAttributesRequest: { + policies: [ + { + group: DefaultGroupIds.POWER_USER, + lensId: 'clear', + namespaceAndAttributeId: `${CUSTOM_ONTOLOGY.ontologyNamespace}.${CUSTOM_ONTOLOGY.ontologyId}`, + }, + { + group: DefaultGroupIds.ADMIN, + lensId: 'clear', + namespaceAndAttributeId: `${CUSTOM_ONTOLOGY.ontologyNamespace}.${CUSTOM_ONTOLOGY.ontologyId}`, + } + ] + } + }, + undefined ); // row policy - expect(API.putGovernancePolicyAttributeValuesGroup).toHaveBeenCalledTimes(1); - expect(API.putGovernancePolicyAttributeValuesGroup).toHaveBeenCalledWith( - { - group: DefaultGroupIds.DEFAULT, - attributeId: CUSTOM_ONTOLOGY.ontologyId, - ontologyNamespace: CUSTOM_ONTOLOGY.ontologyNamespace, - attributeValuePolicyInput: { - sqlClause: 'foo > 5', - updatedTimestamp: fixtures.ENTITY_CRUD.updatedTimestamp, + expect(API.putGovernancePolicyAttributeValues).toHaveBeenCalledTimes(1); + expect(API.putGovernancePolicyAttributeValues).toHaveBeenCalledWith({ + putGovernancePolicyAttributeValuesRequest: { + policies: [ + { + group: DefaultGroupIds.DEFAULT, + namespaceAndAttributeId: `${CUSTOM_ONTOLOGY.ontologyNamespace}.${CUSTOM_ONTOLOGY.ontologyId}`, + sqlClause: 'foo > 5', + }, + ] }, - } as PutGovernancePolicyAttributeValuesGroupRequest, + }, undefined, ); - expect(API.deleteGovernancePolicyAttributeValuesGroup).toHaveBeenCalledTimes(1); - expect(API.deleteGovernancePolicyAttributeValuesGroup).toHaveBeenCalledWith( - { - group: DefaultGroupIds.POWER_USER, - attributeId: CUSTOM_ONTOLOGY.ontologyId, - ontologyNamespace: CUSTOM_ONTOLOGY.ontologyNamespace, - } as DeleteGovernancePolicyAttributeValuesGroupRequest, - undefined, - ); - }, 20000); + }, 40000); }); diff --git a/source/packages/@ada/website/src/views/query/components/QueryWorkbench/context.tsx b/source/packages/@ada/website/src/views/query/components/QueryWorkbench/context.tsx index 34951f3..e020c90 100644 --- a/source/packages/@ada/website/src/views/query/components/QueryWorkbench/context.tsx +++ b/source/packages/@ada/website/src/views/query/components/QueryWorkbench/context.tsx @@ -216,7 +216,7 @@ export const QueryWorkbenchProvider: React.FC<{}> = ({ children }) => { return undefined; }, [polledQueryStatus]); - const context: IQueryWorkbenchContext = { + const context: IQueryWorkbenchContext = useMemo(() => ({ isDrawerOpen, openDrawer, closeDrawer, @@ -236,7 +236,11 @@ export const QueryWorkbenchProvider: React.FC<{}> = ({ children }) => { startQuery, cancelQuery, - }; + }), [isDrawerOpen, openDrawer, closeDrawer, toggleDrawer, getQuery, setQuery, queryStatus, + isExecutingQuery, setIsExcutingQuery, executionInfo, setExecutionInfo, + dataIntegrity, setDataIntegrity, editorRef, + layout, setLayout, startQuery, cancelQuery + ]); return {children}; }; diff --git a/source/scripts/check-licenses.ts b/source/scripts/check-licenses.ts index ebd05e1..6a0c9a1 100644 --- a/source/scripts/check-licenses.ts +++ b/source/scripts/check-licenses.ts @@ -36,7 +36,8 @@ const APPROVED_PKG_LIST: string[] = [ 'difflib', // PSF - http://docs.python.org/license.html 'dreamopt', // The MIT License (MIT) 'es5-ext', // ISC License - 'heap', // The MIT License + 'heap', // The MIT License, + "pako", // (MIT AND Zlib) from @aws-amplify ] const UNKNOWN = 'Unknown' diff --git a/source/yarn.lock b/source/yarn.lock index 3f7d2ed..f4c0afa 100644 --- a/source/yarn.lock +++ b/source/yarn.lock @@ -9,123 +9,148 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" -"@aws-amplify/analytics@5.1.10": - version "5.1.10" - resolved "https://registry.yarnpkg.com/@aws-amplify/analytics/-/analytics-5.1.10.tgz#3f09d17ff9d52e3bc45c6447594be51396d3cf0f" - integrity sha512-vZgnqsDJuaNVfdEN8xppGtsRbbf57x1y++1wZb59WHT674jg9Ch9gLVvs8FuxcHd0K5Tt6NfEJ/b0qdhdnyUzA== +"@aws-amplify/analytics@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@aws-amplify/analytics/-/analytics-6.4.1.tgz#93a3df21599ceaeb1841fb5b4f280c8224242af0" + integrity sha512-MDkkjCbDWtIqXHleJdLHbgRTi+XA4hFC3Fd4xQzozm4vCxs1SlQqr4HRkfx75iIhqd2IIfDad2/AiDehY9YIrQ== dependencies: - "@aws-amplify/cache" "4.0.32" - "@aws-amplify/core" "4.3.12" + "@aws-amplify/cache" "5.1.5" + "@aws-amplify/core" "5.7.0" "@aws-sdk/client-firehose" "3.6.1" "@aws-sdk/client-kinesis" "3.6.1" "@aws-sdk/client-personalize-events" "3.6.1" - "@aws-sdk/client-pinpoint" "3.6.1" "@aws-sdk/util-utf8-browser" "3.6.1" lodash "^4.17.20" + tslib "^1.8.0" uuid "^3.2.1" -"@aws-amplify/api-graphql@2.2.19": - version "2.2.19" - resolved "https://registry.yarnpkg.com/@aws-amplify/api-graphql/-/api-graphql-2.2.19.tgz#623a511054f8462a69cb647341e22d2c1b7f26ae" - integrity sha512-UF8eMTMel3dxn6i/sEjijI1MWeYQfKTy0cVFWds7Yu+Kwdts7ZJQ3bXJIrneZuwQygAOMdGtFE5qIP3DD/PeMg== +"@aws-amplify/api-graphql@3.4.5": + version "3.4.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/api-graphql/-/api-graphql-3.4.5.tgz#cf720fa61804816eb44855e4ee44bdfec78adac2" + integrity sha512-N14eHkKc06sP9010SxYAbcJBVNujNlHcmjnsZQIodM60sJEb9pqFf0xO9ngG5qTIYCX3UtEu5/267NUy6/xBiA== dependencies: - "@aws-amplify/api-rest" "2.0.30" - "@aws-amplify/auth" "4.3.20" - "@aws-amplify/cache" "4.0.32" - "@aws-amplify/core" "4.3.12" - "@aws-amplify/pubsub" "4.2.6" + "@aws-amplify/api-rest" "3.4.0" + "@aws-amplify/auth" "5.5.5" + "@aws-amplify/cache" "5.1.5" + "@aws-amplify/core" "5.7.0" + "@aws-amplify/pubsub" "5.4.1" graphql "15.8.0" + tslib "^1.8.0" uuid "^3.2.1" zen-observable-ts "0.8.19" -"@aws-amplify/api-rest@2.0.30": - version "2.0.30" - resolved "https://registry.yarnpkg.com/@aws-amplify/api-rest/-/api-rest-2.0.30.tgz#2b170b533bcf94573aa25e2e1cb777b523004ea4" - integrity sha512-43JXLXJvDkY7jAaoKbvPLprKGNAE2IBJJ1gNGTBlTs8SAF4EKvTzO4f2DY1bQtU1rCEBVz9lqMj2OytE/5GpEg== +"@aws-amplify/api-rest@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/api-rest/-/api-rest-3.4.0.tgz#05cb33e83db2389a018abab40d6f5eb8190ee941" + integrity sha512-IsxJoz7WNFsHROZBjFA1A9EjpYNbiuzJzDVnhFYAf6HUEw2Cx9QSqSyatZU2sFi0kmT+Vx81K4xRFKCLpEeN+A== dependencies: - "@aws-amplify/core" "4.3.12" - axios "0.21.4" + "@aws-amplify/core" "5.7.0" + axios "0.26.0" + tslib "^1.8.0" + url "0.11.0" -"@aws-amplify/api@4.0.30": - version "4.0.30" - resolved "https://registry.yarnpkg.com/@aws-amplify/api/-/api-4.0.30.tgz#8a9495f63f12fc41701900befdc6a36f9bbcae30" - integrity sha512-kRHv6r87NhSHxnFYcz7VoXyPspqQaJge14qdZSLi1qtDWevoITNHdhhFe6TKPTzXaXCXzoHBgqjWQNjJUaWiBA== +"@aws-amplify/api@5.3.5": + version "5.3.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/api/-/api-5.3.5.tgz#259d24ad778be919e84fa9aead7dadca9d806aeb" + integrity sha512-VoUmRJr76UnDmyafcfb5VSNrthJtPyNl0evEvjhyuj3jMGg/uiM8e6CGsteMfRtVW/y8nbu/SLz5Kxxiz7B5HQ== dependencies: - "@aws-amplify/api-graphql" "2.2.19" - "@aws-amplify/api-rest" "2.0.30" + "@aws-amplify/api-graphql" "3.4.5" + "@aws-amplify/api-rest" "3.4.0" + tslib "^1.8.0" -"@aws-amplify/auth@4.3.20": - version "4.3.20" - resolved "https://registry.yarnpkg.com/@aws-amplify/auth/-/auth-4.3.20.tgz#65fbdc27456f96374a29086b1e1fdf582a20c090" - integrity sha512-ODTImQa31d6ya+FiQl5hTNkgoJFmbNSCpn7Meg/N7mr9fgh7E1EPjjCABwFu4aYGo6xFFdeonMJ6Jr4U9s0FQA== +"@aws-amplify/auth@5.5.5": + version "5.5.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/auth/-/auth-5.5.5.tgz#453549de46ec0b96289191c5f47d070c6ff92573" + integrity sha512-W0cy//h62OXoWoVUMHJd4HW1wxKwEyyjDmNKBHLBs2FSAMUYujXl+8Rl17Z4UHOGYhV1UPx/LgoABOG7PxcyDw== dependencies: - "@aws-amplify/cache" "4.0.32" - "@aws-amplify/core" "4.3.12" - amazon-cognito-identity-js "5.2.4" - crypto-js "^4.1.1" + "@aws-amplify/core" "5.7.0" + amazon-cognito-identity-js "6.3.1" + tslib "^1.8.0" + url "0.11.0" -"@aws-amplify/cache@4.0.32": - version "4.0.32" - resolved "https://registry.yarnpkg.com/@aws-amplify/cache/-/cache-4.0.32.tgz#ff081c8c4d81536da98c9e774e3fe48d1b90f10f" - integrity sha512-QHSPIsqL++hx9/DU9Ff/Su53X4mW6fe50DIa9X/fyrnpx308+NW32Xv/UILUsT4q3rfzTzrB2PFkHQgI3OywFQ== +"@aws-amplify/cache@5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/cache/-/cache-5.1.5.tgz#5cbbc5808da84321ce44dbd325f8cd967d16312e" + integrity sha512-gOHZWsxjeySVMseOFRNe6CtRX/r1/j4gNvVSTWZeNCncvPB1X1iiQVtjKOCPxuY6X1DdmH65U1jnKxWV683tJQ== dependencies: - "@aws-amplify/core" "4.3.12" + "@aws-amplify/core" "5.7.0" + tslib "^1.8.0" -"@aws-amplify/core@4.3.12": - version "4.3.12" - resolved "https://registry.yarnpkg.com/@aws-amplify/core/-/core-4.3.12.tgz#06ff24090b741ab0f088ffe86894b102dee88490" - integrity sha512-HfSY6cmQ17Azhk/vkljMFJtkqWVrsdNXT2CTBVyii051MqvLOsMHBZgB+kul3lvbhtUZ2vQ5uw9GAJbI3yNcvw== +"@aws-amplify/core@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/core/-/core-5.7.0.tgz#5a0d1cccee9c8d7f62c19630797fda419611a23d" + integrity sha512-P8dk4hmxm5XBtKI59XFjiUKUMIlzrgyGapnL3DAfE+twE8JEgRa7XtiffYy4drIXt7+Nl8tYyDhHlUI9/9I3Ow== dependencies: - "@aws-crypto/sha256-js" "1.0.0-alpha.0" + "@aws-crypto/sha256-js" "1.2.2" "@aws-sdk/client-cloudwatch-logs" "3.6.1" - "@aws-sdk/client-cognito-identity" "3.6.1" - "@aws-sdk/credential-provider-cognito-identity" "3.6.1" "@aws-sdk/types" "3.6.1" "@aws-sdk/util-hex-encoding" "3.6.1" + "@types/node-fetch" "2.6.4" + isomorphic-unfetch "^3.0.0" + react-native-url-polyfill "^1.3.0" + tslib "^1.8.0" universal-cookie "^4.0.4" zen-observable-ts "0.8.19" -"@aws-amplify/datastore@3.7.4": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@aws-amplify/datastore/-/datastore-3.7.4.tgz#6f5948eac92fd54d9eda45aa61b930a6d4bf57b2" - integrity sha512-os1r33Y03HiuEok4IckVx+Kt1ZgXMsFU93q5LY3ylxyN416A8TSW5c8VwcGg9kvG47KdFwYZUz/GeOV15OYfUA== - dependencies: - "@aws-amplify/api" "4.0.30" - "@aws-amplify/auth" "4.3.20" - "@aws-amplify/core" "4.3.12" - "@aws-amplify/pubsub" "4.2.6" - amazon-cognito-identity-js "5.2.4" +"@aws-amplify/datastore@4.6.5": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/datastore/-/datastore-4.6.5.tgz#9819290cc16d99c25e39b0f8a14671abcb6e03fa" + integrity sha512-osWDuIzgA4jEL4P+xNdVMKCc0w0DrBlan38hDZyCqCjU+YiVV6DHqJMxC5XBIKcHAaan9uaO5PJZhtRi1VDM2w== + dependencies: + "@aws-amplify/api" "5.3.5" + "@aws-amplify/auth" "5.5.5" + "@aws-amplify/core" "5.7.0" + "@aws-amplify/pubsub" "5.4.1" + amazon-cognito-identity-js "6.3.1" idb "5.0.6" immer "9.0.6" ulid "2.3.0" - uuid "3.3.2" + uuid "3.4.0" zen-observable-ts "0.8.19" zen-push "0.2.1" -"@aws-amplify/geo@1.1.12": - version "1.1.12" - resolved "https://registry.yarnpkg.com/@aws-amplify/geo/-/geo-1.1.12.tgz#b5cb7e6e4059b61b60149e4c7ecc010d5a0ffac3" - integrity sha512-/cH2uDdacJNUnYoZEtrccQgqeTwVK30yIwhUVKBhJjns4eJ0BAnNFDtEIbgtCoV3x+lnkyXlE4K/LqiXdvvBRQ== +"@aws-amplify/geo@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/geo/-/geo-2.2.0.tgz#2d0e86391fc0d11fdd63dd9c625a8697f48d9c32" + integrity sha512-9aXHQzebdHucp+XfJgMO+boys757M9EdGlylASSSjgWO3MsX4RhN0NUvpZ1L8VwbqPSeUBpTdJFv6YgtXCVxJQ== dependencies: - "@aws-amplify/core" "4.3.12" - "@aws-sdk/client-location" "3.41.0" + "@aws-amplify/core" "5.7.0" + "@aws-sdk/client-location" "3.186.3" + "@turf/boolean-clockwise" "6.5.0" camelcase-keys "6.2.2" + tslib "^1.8.0" + +"@aws-amplify/interactions@5.2.5": + version "5.2.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/interactions/-/interactions-5.2.5.tgz#dba2d45bd7f45d2d442d3b04e66864565d337456" + integrity sha512-iWgeO0Jy8CfLjTCSXWstAd5ZfYrn72r5db96DpFPU89VvK96vXeRDsPRh1DHnLa+DuCu6/m1698NpmaY1kiwUg== + dependencies: + "@aws-amplify/core" "5.7.0" + "@aws-sdk/client-lex-runtime-service" "3.186.3" + "@aws-sdk/client-lex-runtime-v2" "3.186.3" + base-64 "1.0.0" + fflate "0.7.3" + pako "2.0.4" + tslib "^1.8.0" -"@aws-amplify/interactions@4.0.30": - version "4.0.30" - resolved "https://registry.yarnpkg.com/@aws-amplify/interactions/-/interactions-4.0.30.tgz#fd5a92b6b54cf7730d8ae8c4dc850061b241ee17" - integrity sha512-DGmBVEn7ryOwtjRU0Xkrc/9gsKJWajTHfybxzbt2U5NYc9sqdgQs3GN46uMOwK5tSEL07ZPEuiOvuof52TbM7A== +"@aws-amplify/notifications@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/notifications/-/notifications-1.5.0.tgz#fa4b931a8433415fb7111b3505df24f9fd4bfa5e" + integrity sha512-O0+zdy/3pTv2PtrO7OhTQDS2rXiYVJRqze8nZrZls5oqiBEA/hLAlCOY9uw5QsnOkmcgMgyNsuyI0A5RCCGkjw== dependencies: - "@aws-amplify/core" "4.3.12" - "@aws-sdk/client-lex-runtime-service" "3.6.1" + "@aws-amplify/cache" "5.1.5" + "@aws-amplify/core" "5.7.0" + "@aws-amplify/rtn-push-notification" "1.1.2" + lodash "^4.17.21" + uuid "^3.2.1" -"@aws-amplify/predictions@4.0.30": - version "4.0.30" - resolved "https://registry.yarnpkg.com/@aws-amplify/predictions/-/predictions-4.0.30.tgz#a8c084e34aba80dbf930f85baee0e2afa045210d" - integrity sha512-l8WIrkQ3j4Bhg6ub5L3Bw3xzbcnFgiLbczYpqzkH4nqZt1yhjQpiNF4vcMM/2P2h4b2wkQTo5/RoAqgfffInuQ== +"@aws-amplify/predictions@5.4.5": + version "5.4.5" + resolved "https://registry.yarnpkg.com/@aws-amplify/predictions/-/predictions-5.4.5.tgz#84093f615b92b675dcad32b48545e1946f4569f6" + integrity sha512-0cBQabxoN/7ZbPDqu1OByCaP83IKloe8N5lmo8lnwO//VCp9bPGG9V66dMyxN/wfHbISdOOSTrfwcs40t+2nZg== dependencies: - "@aws-amplify/core" "4.3.12" - "@aws-amplify/storage" "4.4.13" + "@aws-amplify/core" "5.7.0" + "@aws-amplify/storage" "5.8.0" "@aws-sdk/client-comprehend" "3.6.1" "@aws-sdk/client-polly" "3.6.1" "@aws-sdk/client-rekognition" "3.6.1" @@ -133,34 +158,41 @@ "@aws-sdk/client-translate" "3.6.1" "@aws-sdk/eventstream-marshaller" "3.6.1" "@aws-sdk/util-utf8-node" "3.6.1" + buffer "4.9.2" + tslib "^1.8.0" uuid "^3.2.1" -"@aws-amplify/pubsub@4.2.6": - version "4.2.6" - resolved "https://registry.yarnpkg.com/@aws-amplify/pubsub/-/pubsub-4.2.6.tgz#9cbafcb6c570b4b4cc00309751113c49a1be572c" - integrity sha512-F+rv79RzZ0/x0caI3/rzsb76E2zOdHxzJmcqUiAkO9NpUc455hZ2EPrm6+BQgc+shOFB0yprZ7CMBzgsI8wCaQ== +"@aws-amplify/pubsub@5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@aws-amplify/pubsub/-/pubsub-5.4.1.tgz#888eba53a708f83c14b50187fbb2de518d8fb5d2" + integrity sha512-aFGD92vI4mtaMbLjjCAzUyq7z9ezaTZ9G74KJKl45hyL45ccCge5NEFHOHljcokbtrFiMqHKoJhI1q+rCB/UnA== dependencies: - "@aws-amplify/auth" "4.3.20" - "@aws-amplify/cache" "4.0.32" - "@aws-amplify/core" "4.3.12" + "@aws-amplify/auth" "5.5.5" + "@aws-amplify/cache" "5.1.5" + "@aws-amplify/core" "5.7.0" graphql "15.8.0" - paho-mqtt "^1.1.0" + tslib "^1.8.0" + url "0.11.0" uuid "^3.2.1" zen-observable-ts "0.8.19" -"@aws-amplify/storage@4.4.13": - version "4.4.13" - resolved "https://registry.yarnpkg.com/@aws-amplify/storage/-/storage-4.4.13.tgz#c0d17ba8c7d48c3d205fbbeac5827d15d781f0b9" - integrity sha512-jE/qAPicvu1Q7afsoCSinD7VusgUpjM5GkUFumM9qfxmeRWL8RG8LN+Fvv+fKU8XYbhbyWUVe5IoSgDFAiX7iw== - dependencies: - "@aws-amplify/core" "4.3.12" - "@aws-sdk/client-s3" "3.6.1" - "@aws-sdk/s3-request-presigner" "3.6.1" - "@aws-sdk/util-create-request" "3.6.1" - "@aws-sdk/util-format-url" "3.6.1" - axios "0.21.4" +"@aws-amplify/rtn-push-notification@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@aws-amplify/rtn-push-notification/-/rtn-push-notification-1.1.2.tgz#5d4c1840d6e86f45dc1b58856a9d8d539159cc6d" + integrity sha512-hlqE76OLPljGFyZ8N6zOFf/yc6Svcc0gnjMVfN3liqlbsrA4u5eoeIi7iiMM/vUG9vCMKfu9rCfne2CQSBLyUA== + +"@aws-amplify/storage@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/storage/-/storage-5.8.0.tgz#9d40e36ef370979e6cefafb48dc214e9b59e904e" + integrity sha512-o4sc78fKNOpZOQ3SFvI8ZjCJ2GCPrheC/6i982LvxLfpJfumeP7GvKiTpzKt1oGqtBrk59ARBnGcp5bI5KMWOA== + dependencies: + "@aws-amplify/core" "5.7.0" + "@aws-sdk/md5-js" "3.6.1" + "@aws-sdk/types" "3.6.1" events "^3.1.0" - sinon "^7.5.0" + fast-xml-parser "^4.2.5" + tslib "^1.8.0" + typescript "5.0.2" "@aws-amplify/ui-components@1.9.6": version "1.9.6" @@ -177,72 +209,60 @@ dependencies: "@aws-amplify/ui-components" "1.9.6" -"@aws-amplify/ui@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@aws-amplify/ui/-/ui-2.0.5.tgz#0800938a0bf36ff51922637628b0889017da19f1" - integrity sha512-atoc/zIJRhgpoSDDKgRxbTSD7D9S4wbOzHUHMqRlcEPRKqRrQPGvd6zCUVSBS0jqdrrw6+UTJbWj7ttWCfE4pQ== +"@aws-cdk/asset-awscli-v1@^2.2.200": + version "2.2.200" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz#6ead533f73f705ad7350eb46955e2538e50cd013" + integrity sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg== -"@aws-amplify/xr@3.0.30": - version "3.0.30" - resolved "https://registry.yarnpkg.com/@aws-amplify/xr/-/xr-3.0.30.tgz#f05862417e7b8051ec20d2e8d08869e5a69cd85b" - integrity sha512-hkcMUG7GkBffDKdI/xrtCynzOODAZyenfesM8RiX+I8XBwX87hyxMoA520TDvNLz6MqBBPl3CpChnCdH2qFZiQ== - dependencies: - "@aws-amplify/core" "4.3.12" - -"@aws-cdk/asset-awscli-v1@^2.2.97": - version "2.2.139" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.139.tgz#4236502e21e96153734c3faad6e09693c89ec865" - integrity sha512-PGRtKbDfI8BmLEik4awqe/u02GKhpdyYvgI6XWGvSyn2qx+f4rVmyLqM2wiFI8wFWFt6YBAQaegKJS1cEZVe2A== - -"@aws-cdk/asset-kubectl-v20@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz#d01c1efb867fb7f2cfd8c8b230b8eae16447e156" - integrity sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw== - -"@aws-cdk/asset-node-proxy-agent-v5@^2.0.77": - version "2.0.115" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.115.tgz#e95a73089b7ba637cf2e20f2d073076f01298fc0" - integrity sha512-MJ5/tMBOo6m7Bazs5TqEijIZNo4DH9NOAuv6mXjFT9k1yNAdOAr0imzG9L3uk2JpSmKrGRDSPRkrJFOszNtSaw== - -"@aws-cdk/aws-apigatewayv2-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-alpha/-/aws-apigatewayv2-alpha-2.70.0-alpha.0.tgz#995c85d8f9b0a69c3bf47803d53229fd1dd9e9cf" - integrity sha512-CfvGy+9jgXYesURS7Epx/Vt8Hq4OBmbuW+JQjbQy56/maRnikZ9FfTYO8RvPNNvJqFjwpHShD2ow+dAY1E9f5Q== - -"@aws-cdk/aws-apigatewayv2-authorizers-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-authorizers-alpha/-/aws-apigatewayv2-authorizers-alpha-2.70.0-alpha.0.tgz#4fbefb0507ea4af4b28c9f26bb172119f87f8705" - integrity sha512-ZBZ3cVUCAuIj2Kda+eHhGamnFMAcoQzdNh1xoyc5o2Pf17iHk5qB+RO1S1tHSHu+KPMk798UlYZfujEsh+ywMQ== - -"@aws-cdk/aws-apigatewayv2-integrations-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-integrations-alpha/-/aws-apigatewayv2-integrations-alpha-2.70.0-alpha.0.tgz#6d6485e301832feb4b76e805b77359056cb8120f" - integrity sha512-5ZPEtp1vF13mfY7aIwrpy0fZVDehgWx97DFEUlSGpgBP8/v1rBgt+dGr7mnyoNK5JerdMIzLlZw+Gh6nr+4PxA== - -"@aws-cdk/aws-glue-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.70.0-alpha.0.tgz#d2af041e23bece341d557dc92b72d20b814e3d7c" - integrity sha512-o67qcmSQ+GL+3xQPcSnhQxjQtGnB0+UBofYd4wdtNmLU7KeQtfWDuEDINypBLRERmVo/T6JmL1qpuJ6rnetsNQ== - -"@aws-cdk/aws-kinesisfirehose-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-alpha/-/aws-kinesisfirehose-alpha-2.70.0-alpha.0.tgz#dc70d054fb9eafd0ab9183c5b53efbea08905980" - integrity sha512-k8IxRxwjTLjjmRGz3xnhM65GixsXBbuMrov4aYkbLQcAOxgPM4Glr5A6RymMxL/eKaYg9QilP4Uv/pJQAE/q+Q== - -"@aws-cdk/aws-kinesisfirehose-destinations-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-destinations-alpha/-/aws-kinesisfirehose-destinations-alpha-2.70.0-alpha.0.tgz#a510122c558c782484605fb65d0ce50ace0ac90f" - integrity sha512-br6bsFPlVtnq7ovUGzE72qYR+O/TqXlojDRw71DSP+AdoyvunZuJ01TIw4kGfJGnghyqVH0ViwwSfGRl4is+bg== - -"@aws-cdk/aws-lambda-python-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.70.0-alpha.0.tgz#c6cb842604f19608207c9b36e0a9acafa004a691" - integrity sha512-0tPUNb540t2GAIAzyEGrk+OiQ90rjQQ0crU+ILFsE+pAaUrWmJYQSXdnKZ3tVVYqe4OgowY/49IdGbrIJnn4YQ== - -"@aws-cdk/aws-servicecatalogappregistry-alpha@2.70.0-alpha.0": - version "2.70.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-servicecatalogappregistry-alpha/-/aws-servicecatalogappregistry-alpha-2.70.0-alpha.0.tgz#065ad88434d251a570f0888a4bdb88a5daef0926" - integrity sha512-zSl3QOo0U8MaY//alq/Hgl5o4+xN4sJE8mQtDaX81eyQee8tl1+4jzgvg+YDISHIrV3l4UWYmVRKuBm8LJ98ug== +"@aws-cdk/asset-kubectl-v20@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz#d8e20b5f5dc20128ea2000dc479ca3c7ddc27248" + integrity sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg== + +"@aws-cdk/asset-node-proxy-agent-v5@^2.0.165": + version "2.0.166" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz#467507db141cd829ff8aa9d6ea5519310a4276b8" + integrity sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg== + +"@aws-cdk/aws-apigatewayv2-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-alpha/-/aws-apigatewayv2-alpha-2.88.0-alpha.0.tgz#237fa9f4e4034cd4a18c07da73e0a4bf9a49a8e3" + integrity sha512-xCYzaXDyI+cs88MTFOMCE142KczRwEERTF0AtCqWgBwi6Se0aWd8ilwOh3jkL90sRDYquIJ01jlET2biFWmduw== + +"@aws-cdk/aws-apigatewayv2-authorizers-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-authorizers-alpha/-/aws-apigatewayv2-authorizers-alpha-2.88.0-alpha.0.tgz#d41aca6fcec0ffb1ae65fbf67ee2149f74755b35" + integrity sha512-0R3el9USkc6r24kn6GT9YtezEraf3Xm+U57nEK35JWU7ePHtxQ2qpN6wKCw+2A5oq5NKEj03a0m52mAbk1wg0Q== + +"@aws-cdk/aws-apigatewayv2-integrations-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-integrations-alpha/-/aws-apigatewayv2-integrations-alpha-2.88.0-alpha.0.tgz#32cd96f6db2f4dd8161254a2f6fd87f3059c8e8d" + integrity sha512-G7wvMnGEysfpNEJaVNUAY4PEPkD4QesMHfWyDIUNyED9lx1NiSv3hgtr87hzadJq+j2nRCCwMj9Rls8d+bBzQw== + +"@aws-cdk/aws-glue-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.88.0-alpha.0.tgz#2b6e575dff836df6807fd52e0585f8f87559d898" + integrity sha512-ozyZgSTDAkClIBEL5QM/c+WXNgCrNUk9q6v3x/VGaYaXqrT21o7DKATkoOk2wnDTR2dY4HZJL2O5yUBhvc3oFw== + +"@aws-cdk/aws-kinesisfirehose-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-alpha/-/aws-kinesisfirehose-alpha-2.88.0-alpha.0.tgz#1ae599c36ff16642cd24d9b3c40f48d1ba24e666" + integrity sha512-mYUJ6uX25k31WhPJ2kxKWWOkQhXQ7K6xfD0aWwLxXusyCJanJPlswVpt04CoDsnLiOXIf5k0Xp/cFWbi4tvCMg== + +"@aws-cdk/aws-kinesisfirehose-destinations-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose-destinations-alpha/-/aws-kinesisfirehose-destinations-alpha-2.88.0-alpha.0.tgz#249681ada4c4a38d1caaf4cf7c4067d628180f8f" + integrity sha512-/9bTGm87lBMWGQHWqE4JkSM18RrRU0dATf8izP7UrbxRchgYtlncFIrTt3AvAGaABqKz1pcb5ZBnTncVO+uLvA== + +"@aws-cdk/aws-lambda-python-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.88.0-alpha.0.tgz#9edfef326f687934c342ba41eeaaca02a3f51534" + integrity sha512-CdSLWAeHLx9uRqAt9OhaWmlsc1wrDEMIDtRWCHVwPW1oVzEjiQ1yUH3sRxZtL0O9rRXpZbJrtUdOM+3SZld64w== + +"@aws-cdk/aws-servicecatalogappregistry-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-servicecatalogappregistry-alpha/-/aws-servicecatalogappregistry-alpha-2.88.0-alpha.0.tgz#a785eebc7f56be5788f6cf53da3690a8f2357160" + integrity sha512-YodGvg4oNlcONOESuuaE0+XQGqXFSNBFT9+v+iJyVRDb9gTqp8mJf6uPJvY2tjAUTILnRRtNCO8pL7rIqPHmGQ== "@aws-cdk/cfnspec@2.33.0": version "2.33.0" @@ -252,28 +272,28 @@ fs-extra "^9.1.0" md5 "^2.3.0" -"@aws-cdk/cfnspec@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-2.70.0.tgz#16c775f97ebd8dc07e230868b8a31508214e5856" - integrity sha512-VfkS/1l9OpSRlih9Y2jDrETmdJdgLlWW1LhBMTqU4DvjoljtZ3KbrRyHVRVhH6WpukL73/4dEPBV1H4b1RPWwA== +"@aws-cdk/cfnspec@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-2.88.0-alpha.0.tgz#13af371fa6f0edd17cf160387474c5693cb2f071" + integrity sha512-pArQaqBC8mtoRwTToQGtHefeIkA5Cv8EwtbgZW/XgASjb5ZvE/RiRl3TmszXgLwthdvZx2sMMoIYwJTE50JQsA== dependencies: fs-extra "^9.1.0" md5 "^2.3.0" -"@aws-cdk/cloud-assembly-schema@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.70.0.tgz#4d5c7fa0b70306ede6c4cbab59944825a1695c7a" - integrity sha512-tfycT27rO5yGWfIF2jhEJ98D8M/JKSvHaSbQqz0lJnxfzjAzdN9pie71g1frDcb10qp8dWBlYAl9PfCi1JEesA== +"@aws-cdk/cloud-assembly-schema@2.88.0": + version "2.88.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.88.0.tgz#29c6452aa240d56063c7453e750987e20d089cab" + integrity sha512-dDcbH9g1CQmXdKe4k0eADZfJGIvNw9ZLBH6Mm4M6H1+kaHaxOir016OrZ/xt+eTCPF+uwfSvfFsu4HzUysopyg== dependencies: jsonschema "^1.4.1" - semver "^7.3.8" + semver "^7.5.4" -"@aws-cdk/cloudformation-diff@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.70.0.tgz#6f42e17de4cb146821d6b7b29988402de6542056" - integrity sha512-FarQ4Axs0dKMMLTIxKUhBCAcUr7jIoWQFAJ9y+XZcS28yAsQufJsFov2NLqJDFXiNP/rlwdkb7tbi3hsPaN8Cg== +"@aws-cdk/cloudformation-diff@2.88.0": + version "2.88.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.88.0.tgz#b93e22fffdee8811ca8c60311d61efd400a5d067" + integrity sha512-3F6xfAnV/c91/6nm3ZCk0S4rfq3OJ/fSOihSr7VTqABN2vs16e2LYtPialUQvmIXM6I46fByx9DMaBTkQFBxJA== dependencies: - "@aws-cdk/cfnspec" "2.70.0" + "@aws-cdk/cfnspec" "2.88.0-alpha.0" chalk "^4" diff "^5.1.0" fast-deep-equal "^3.1.3" @@ -293,13 +313,31 @@ string-width "^4.2.3" table "^6.8.0" -"@aws-cdk/cx-api@2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-2.70.0.tgz#3913ff06a525c9637ba59d061ef0236aaeaa06bd" - integrity sha512-ZviNNmB85kdA3bz9bK9H6rb2gFebpl+aHje0PWFjHNrixSx8ocVyfHYFM7DSBx3PRWgBl2VQT6r3K/AAufB5dg== +"@aws-cdk/cx-api@2.88.0": + version "2.88.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-2.88.0.tgz#f84423f841d47c891a678c97ea5ad9b993964cc1" + integrity sha512-Wf6ax/1eGjE42Dc7NvlMzu6QU5wraUnKIay9QvznZaJYkkcWZ7LlRwmoh95p431RTOoYME3dWzHOEsV/LBv5xQ== dependencies: - "@aws-cdk/cloud-assembly-schema" "2.70.0" - semver "^7.3.8" + "@aws-cdk/cloud-assembly-schema" "2.88.0" + semver "^7.5.4" + +"@aws-crypto/crc32@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-2.0.0.tgz#4ad432a3c03ec3087c5540ff6e41e6565d2dc153" + integrity sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA== + dependencies: + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" "@aws-crypto/crc32@^1.0.0": version "1.2.2" @@ -324,6 +362,13 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/ie11-detection@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" + integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== + dependencies: + tslib "^1.11.1" + "@aws-crypto/sha256-browser@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz#741c9024df55ec59b51e5b1f5d806a4852699fb5" @@ -338,6 +383,20 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/sha256-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" + integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + "@aws-crypto/sha256-browser@^1.0.0": version "1.2.2" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-1.2.2.tgz#004d806e3bbae130046c259ec3279a02d4a0b576" @@ -351,14 +410,14 @@ "@aws-sdk/util-locate-window" "^3.0.0" tslib "^1.11.1" -"@aws-crypto/sha256-js@1.0.0-alpha.0": - version "1.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.0.0-alpha.0.tgz#1146f6fa823001a9065ce60db5bf1afcc7c1cc3a" - integrity sha512-GidX2lccEtHZw8mXDKJQj6tea7qh3pAnsNSp1eZNxsN4MMu2OvSraPSqiB1EihsQkZBMg0IiZPpZHoACUX/QMQ== +"@aws-crypto/sha256-js@1.2.2", "@aws-crypto/sha256-js@^1.0.0", "@aws-crypto/sha256-js@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" + integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== dependencies: - "@aws-sdk/types" "^1.0.0-alpha.0" - "@aws-sdk/util-utf8-browser" "^1.0.0-alpha.0" - tslib "^1.9.3" + "@aws-crypto/util" "^1.2.2" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" "@aws-crypto/sha256-js@2.0.0", "@aws-crypto/sha256-js@^2.0.0": version "2.0.0" @@ -369,13 +428,13 @@ "@aws-sdk/types" "^3.1.0" tslib "^1.11.1" -"@aws-crypto/sha256-js@^1.0.0", "@aws-crypto/sha256-js@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" - integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" + integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== dependencies: - "@aws-crypto/util" "^1.2.2" - "@aws-sdk/types" "^3.1.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" "@aws-crypto/supports-web-crypto@^1.0.0": @@ -392,6 +451,13 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/supports-web-crypto@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" + integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== + dependencies: + tslib "^1.11.1" + "@aws-crypto/util@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" @@ -410,13 +476,22 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.40.0.tgz#e17299776782483835439d9b1b5300add24adc3f" - integrity sha512-S7LzLvNuwuf0q7r4q7zqGzxd/W2xYsn8cpZ90MMb3ObolhbkLySrikUJujmXae8k+2/KFCOr+FVC0YLrATSUgQ== +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/abort-controller@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.186.0.tgz#dfaccd296d57136930582e1a19203d6cb60debc7" + integrity sha512-JFvvvtEcbYOvVRRXasi64Dd1VcOz5kJmPvtzsJ+HzMHvPbGGs/aopOJAZQJMJttzJmJwVTay0QL6yag9Kk8nYA== + dependencies: + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/abort-controller@3.6.1": version "3.6.1" @@ -426,21 +501,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/chunked-blob-reader-native@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.6.1.tgz#21c2c8773c3cd8403c2a953fd0e9e4f69c120214" - integrity sha512-vP6bc2v9h442Srmo7t2QcIbPjk5IqLSf4jGnKDAes8z+7eyjCtKugRP3lOM1fJCfGlPIsJGYnexxYdEGw008vA== - dependencies: - "@aws-sdk/util-base64-browser" "3.6.1" - tslib "^1.8.0" - -"@aws-sdk/chunked-blob-reader@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.6.1.tgz#63363025dcecc2f9dd47ae5c282d79c01b327d82" - integrity sha512-QBGUBoD8D5nsM/EKoc0rjpApa5NE5pQVzw1caE8sG00QMMPkCXWSB/gTVKVY0GOAhJFoA/VpVPQchIlZcOrBFg== - dependencies: - tslib "^1.8.0" - "@aws-sdk/client-cloudwatch-logs@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.6.1.tgz#5e8dba495a2ba9a901b0a1a2d53edef8bd452398" @@ -478,43 +538,6 @@ "@aws-sdk/util-utf8-node" "3.6.1" tslib "^2.0.0" -"@aws-sdk/client-cognito-identity@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.6.1.tgz#36992a4fef7eff1f2b1dbee30850e30ebdfc15bb" - integrity sha512-FMj2GR9R5oCKb3/NI16GIvWeHcE4uX42fBAaQKPbjg2gALFDx9CcJYsdOtDP37V89GtPyZilLv6GJxrwJKzYGg== - dependencies: - "@aws-crypto/sha256-browser" "^1.0.0" - "@aws-crypto/sha256-js" "^1.0.0" - "@aws-sdk/config-resolver" "3.6.1" - "@aws-sdk/credential-provider-node" "3.6.1" - "@aws-sdk/fetch-http-handler" "3.6.1" - "@aws-sdk/hash-node" "3.6.1" - "@aws-sdk/invalid-dependency" "3.6.1" - "@aws-sdk/middleware-content-length" "3.6.1" - "@aws-sdk/middleware-host-header" "3.6.1" - "@aws-sdk/middleware-logger" "3.6.1" - "@aws-sdk/middleware-retry" "3.6.1" - "@aws-sdk/middleware-serde" "3.6.1" - "@aws-sdk/middleware-signing" "3.6.1" - "@aws-sdk/middleware-stack" "3.6.1" - "@aws-sdk/middleware-user-agent" "3.6.1" - "@aws-sdk/node-config-provider" "3.6.1" - "@aws-sdk/node-http-handler" "3.6.1" - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/smithy-client" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/url-parser" "3.6.1" - "@aws-sdk/url-parser-native" "3.6.1" - "@aws-sdk/util-base64-browser" "3.6.1" - "@aws-sdk/util-base64-node" "3.6.1" - "@aws-sdk/util-body-length-browser" "3.6.1" - "@aws-sdk/util-body-length-node" "3.6.1" - "@aws-sdk/util-user-agent-browser" "3.6.1" - "@aws-sdk/util-user-agent-node" "3.6.1" - "@aws-sdk/util-utf8-browser" "3.6.1" - "@aws-sdk/util-utf8-node" "3.6.1" - tslib "^2.0.0" - "@aws-sdk/client-comprehend@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/client-comprehend/-/client-comprehend-3.6.1.tgz#d640d510b49feafa94ac252cdd7942cbe5537249" @@ -553,44 +576,49 @@ tslib "^2.0.0" uuid "^3.0.0" -"@aws-sdk/client-dynamodb@^3.27.0": - version "3.42.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.42.0.tgz#306942ce4a14daacd2790654ae14352d3c6b315b" - integrity sha512-JYeigFvLOHa7yCWJqH7jlEFzGlWQnvRuFzryrEPNmVB7ga+wBJUithjRADmfuGY8VDduWoG4s0Mx0yGK+8rZ0A== - dependencies: - "@aws-crypto/sha256-browser" "2.0.0" - "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.42.0" - "@aws-sdk/config-resolver" "3.40.0" - "@aws-sdk/credential-provider-node" "3.41.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-endpoint-discovery" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-signing" "3.40.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" - "@aws-sdk/util-waiter" "3.40.0" - tslib "^2.3.0" +"@aws-sdk/client-dynamodb@^3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.370.0.tgz#6712ce2750eb2a9d0813b9bdd25ac205dac44938" + integrity sha512-qL02C4adrZljZXgPonSHYJ95qkj1IlIsZx3NxaGzMc5S3uPJua14phktk2XP8K/Ap3gD6vLWt1UVVoo/rDFOAQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.370.0" + "@aws-sdk/credential-provider-node" "3.370.0" + "@aws-sdk/middleware-endpoint-discovery" "3.370.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-signing" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + "@smithy/util-waiter" "^1.0.1" + tslib "^2.5.0" uuid "^8.3.2" "@aws-sdk/client-firehose@3.6.1": @@ -671,79 +699,130 @@ "@aws-sdk/util-waiter" "3.6.1" tslib "^2.0.0" -"@aws-sdk/client-lex-runtime-service@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-lex-runtime-service/-/client-lex-runtime-service-3.6.1.tgz#43290057858a60b7465989d63c2824512e8166d2" - integrity sha512-xi3m3f3G9KEKdziOFyynkfvN7OzdT9T8V3wkM4x+Zhid9v1K4Rg7OvbBb5oG9UicLz54tcZGkt0VN4ldEB/XLQ== +"@aws-sdk/client-lex-runtime-service@3.186.3": + version "3.186.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lex-runtime-service/-/client-lex-runtime-service-3.186.3.tgz#cc1130254d50dc1a5b85ac736e6f764b0fa145c3" + integrity sha512-YP+GDY9OxyW4rJDqjreaNpiDBvH1uzO3ShJKl57hT92Kw2auDQxttcMf//J8dQXvrVkW/fVXCLI9TmtxS7XJOQ== dependencies: - "@aws-crypto/sha256-browser" "^1.0.0" - "@aws-crypto/sha256-js" "^1.0.0" - "@aws-sdk/config-resolver" "3.6.1" - "@aws-sdk/credential-provider-node" "3.6.1" - "@aws-sdk/fetch-http-handler" "3.6.1" - "@aws-sdk/hash-node" "3.6.1" - "@aws-sdk/invalid-dependency" "3.6.1" - "@aws-sdk/middleware-content-length" "3.6.1" - "@aws-sdk/middleware-host-header" "3.6.1" - "@aws-sdk/middleware-logger" "3.6.1" - "@aws-sdk/middleware-retry" "3.6.1" - "@aws-sdk/middleware-serde" "3.6.1" - "@aws-sdk/middleware-signing" "3.6.1" - "@aws-sdk/middleware-stack" "3.6.1" - "@aws-sdk/middleware-user-agent" "3.6.1" - "@aws-sdk/node-config-provider" "3.6.1" - "@aws-sdk/node-http-handler" "3.6.1" - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/smithy-client" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/url-parser" "3.6.1" - "@aws-sdk/url-parser-native" "3.6.1" - "@aws-sdk/util-base64-browser" "3.6.1" - "@aws-sdk/util-base64-node" "3.6.1" - "@aws-sdk/util-body-length-browser" "3.6.1" - "@aws-sdk/util-body-length-node" "3.6.1" - "@aws-sdk/util-user-agent-browser" "3.6.1" - "@aws-sdk/util-user-agent-node" "3.6.1" - "@aws-sdk/util-utf8-browser" "3.6.1" - "@aws-sdk/util-utf8-node" "3.6.1" - tslib "^2.0.0" + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/client-sts" "3.186.3" + "@aws-sdk/config-resolver" "3.186.0" + "@aws-sdk/credential-provider-node" "3.186.0" + "@aws-sdk/fetch-http-handler" "3.186.0" + "@aws-sdk/hash-node" "3.186.0" + "@aws-sdk/invalid-dependency" "3.186.0" + "@aws-sdk/middleware-content-length" "3.186.0" + "@aws-sdk/middleware-host-header" "3.186.0" + "@aws-sdk/middleware-logger" "3.186.0" + "@aws-sdk/middleware-recursion-detection" "3.186.0" + "@aws-sdk/middleware-retry" "3.186.0" + "@aws-sdk/middleware-serde" "3.186.0" + "@aws-sdk/middleware-signing" "3.186.0" + "@aws-sdk/middleware-stack" "3.186.0" + "@aws-sdk/middleware-user-agent" "3.186.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/node-http-handler" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/smithy-client" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/url-parser" "3.186.0" + "@aws-sdk/util-base64-browser" "3.186.0" + "@aws-sdk/util-base64-node" "3.186.0" + "@aws-sdk/util-body-length-browser" "3.186.0" + "@aws-sdk/util-body-length-node" "3.186.0" + "@aws-sdk/util-defaults-mode-browser" "3.186.0" + "@aws-sdk/util-defaults-mode-node" "3.186.0" + "@aws-sdk/util-user-agent-browser" "3.186.0" + "@aws-sdk/util-user-agent-node" "3.186.0" + "@aws-sdk/util-utf8-browser" "3.186.0" + "@aws-sdk/util-utf8-node" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/client-location@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-location/-/client-location-3.41.0.tgz#2a32b05ad393bdb5a51d680790e69dc53d4a85cf" - integrity sha512-PnRj3UM2DSBtH6kk2d08oVzzPdHnyPAFkIXpSuMo+3xtIPC7BysSFcFC8T7qVbngFGTgakjTYNfzc+6D3ZELbg== +"@aws-sdk/client-lex-runtime-v2@3.186.3": + version "3.186.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lex-runtime-v2/-/client-lex-runtime-v2-3.186.3.tgz#7baa6772ce3fdd7265fca2daa75eb0e896f27764" + integrity sha512-4MJfSnb+qM8BYW4ToCvg7sDWN0NcEqK738hCZUV89cjp7pIHZ6osJuS/PsmZEommVj+71GviZ4buu5KUCfCGFQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.41.0" - "@aws-sdk/config-resolver" "3.40.0" - "@aws-sdk/credential-provider-node" "3.41.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-signing" "3.40.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/client-sts" "3.186.3" + "@aws-sdk/config-resolver" "3.186.0" + "@aws-sdk/credential-provider-node" "3.186.0" + "@aws-sdk/eventstream-handler-node" "3.186.0" + "@aws-sdk/eventstream-serde-browser" "3.186.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.186.0" + "@aws-sdk/eventstream-serde-node" "3.186.0" + "@aws-sdk/fetch-http-handler" "3.186.0" + "@aws-sdk/hash-node" "3.186.0" + "@aws-sdk/invalid-dependency" "3.186.0" + "@aws-sdk/middleware-content-length" "3.186.0" + "@aws-sdk/middleware-eventstream" "3.186.0" + "@aws-sdk/middleware-host-header" "3.186.0" + "@aws-sdk/middleware-logger" "3.186.0" + "@aws-sdk/middleware-recursion-detection" "3.186.0" + "@aws-sdk/middleware-retry" "3.186.0" + "@aws-sdk/middleware-serde" "3.186.0" + "@aws-sdk/middleware-signing" "3.186.0" + "@aws-sdk/middleware-stack" "3.186.0" + "@aws-sdk/middleware-user-agent" "3.186.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/node-http-handler" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/smithy-client" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/url-parser" "3.186.0" + "@aws-sdk/util-base64-browser" "3.186.0" + "@aws-sdk/util-base64-node" "3.186.0" + "@aws-sdk/util-body-length-browser" "3.186.0" + "@aws-sdk/util-body-length-node" "3.186.0" + "@aws-sdk/util-defaults-mode-browser" "3.186.0" + "@aws-sdk/util-defaults-mode-node" "3.186.0" + "@aws-sdk/util-user-agent-browser" "3.186.0" + "@aws-sdk/util-user-agent-node" "3.186.0" + "@aws-sdk/util-utf8-browser" "3.186.0" + "@aws-sdk/util-utf8-node" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/client-location@3.186.3": + version "3.186.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-location/-/client-location-3.186.3.tgz#c812ae3dabf76153ad046413298a1ab53cadee9a" + integrity sha512-LCMFgoWfvKBnZhhtl93RLhrsHCalM7huaxErHSKoqWDBUDP0i7rOX73qW8E25j/vQ4emEkT0d6ts1rDu4EnlNw== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/client-sts" "3.186.3" + "@aws-sdk/config-resolver" "3.186.0" + "@aws-sdk/credential-provider-node" "3.186.0" + "@aws-sdk/fetch-http-handler" "3.186.0" + "@aws-sdk/hash-node" "3.186.0" + "@aws-sdk/invalid-dependency" "3.186.0" + "@aws-sdk/middleware-content-length" "3.186.0" + "@aws-sdk/middleware-host-header" "3.186.0" + "@aws-sdk/middleware-logger" "3.186.0" + "@aws-sdk/middleware-recursion-detection" "3.186.0" + "@aws-sdk/middleware-retry" "3.186.0" + "@aws-sdk/middleware-serde" "3.186.0" + "@aws-sdk/middleware-signing" "3.186.0" + "@aws-sdk/middleware-stack" "3.186.0" + "@aws-sdk/middleware-user-agent" "3.186.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/node-http-handler" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/smithy-client" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/url-parser" "3.186.0" + "@aws-sdk/util-base64-browser" "3.186.0" + "@aws-sdk/util-base64-node" "3.186.0" + "@aws-sdk/util-body-length-browser" "3.186.0" + "@aws-sdk/util-body-length-node" "3.186.0" + "@aws-sdk/util-defaults-mode-browser" "3.186.0" + "@aws-sdk/util-defaults-mode-node" "3.186.0" + "@aws-sdk/util-user-agent-browser" "3.186.0" + "@aws-sdk/util-user-agent-node" "3.186.0" + "@aws-sdk/util-utf8-browser" "3.186.0" + "@aws-sdk/util-utf8-node" "3.186.0" + tslib "^2.3.1" "@aws-sdk/client-personalize-events@3.6.1": version "3.6.1" @@ -782,43 +861,6 @@ "@aws-sdk/util-utf8-node" "3.6.1" tslib "^2.0.0" -"@aws-sdk/client-pinpoint@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-pinpoint/-/client-pinpoint-3.6.1.tgz#6b93f46475ae2667d77053be51ea62f52e330155" - integrity sha512-dueBedp91EKAHxcWLR3aNx/eUEdxdF9niEQTzOO2O4iJL2yvO2Hh7ZYiO7B3g7FuuICTpWSHd//Y9mGmSVLMCg== - dependencies: - "@aws-crypto/sha256-browser" "^1.0.0" - "@aws-crypto/sha256-js" "^1.0.0" - "@aws-sdk/config-resolver" "3.6.1" - "@aws-sdk/credential-provider-node" "3.6.1" - "@aws-sdk/fetch-http-handler" "3.6.1" - "@aws-sdk/hash-node" "3.6.1" - "@aws-sdk/invalid-dependency" "3.6.1" - "@aws-sdk/middleware-content-length" "3.6.1" - "@aws-sdk/middleware-host-header" "3.6.1" - "@aws-sdk/middleware-logger" "3.6.1" - "@aws-sdk/middleware-retry" "3.6.1" - "@aws-sdk/middleware-serde" "3.6.1" - "@aws-sdk/middleware-signing" "3.6.1" - "@aws-sdk/middleware-stack" "3.6.1" - "@aws-sdk/middleware-user-agent" "3.6.1" - "@aws-sdk/node-config-provider" "3.6.1" - "@aws-sdk/node-http-handler" "3.6.1" - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/smithy-client" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/url-parser" "3.6.1" - "@aws-sdk/url-parser-native" "3.6.1" - "@aws-sdk/util-base64-browser" "3.6.1" - "@aws-sdk/util-base64-node" "3.6.1" - "@aws-sdk/util-body-length-browser" "3.6.1" - "@aws-sdk/util-body-length-node" "3.6.1" - "@aws-sdk/util-user-agent-browser" "3.6.1" - "@aws-sdk/util-user-agent-node" "3.6.1" - "@aws-sdk/util-utf8-browser" "3.6.1" - "@aws-sdk/util-utf8-node" "3.6.1" - tslib "^2.0.0" - "@aws-sdk/client-polly@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/client-polly/-/client-polly-3.6.1.tgz#869deb186e57fca29737bfa7af094599d7879841" @@ -894,169 +936,205 @@ "@aws-sdk/util-waiter" "3.6.1" tslib "^2.0.0" -"@aws-sdk/client-s3@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.6.1.tgz#aab1e0e92b353d9d51152d9347b7e1809f3593d0" - integrity sha512-59cTmZj92iwgNoAeJirK5sZNQNXLc/oI3luqrEHRNLuOh70bjdgad70T0a5k2Ysd/v/QNamqJxnCJMPuX1bhgw== - dependencies: - "@aws-crypto/sha256-browser" "^1.0.0" - "@aws-crypto/sha256-js" "^1.0.0" - "@aws-sdk/config-resolver" "3.6.1" - "@aws-sdk/credential-provider-node" "3.6.1" - "@aws-sdk/eventstream-serde-browser" "3.6.1" - "@aws-sdk/eventstream-serde-config-resolver" "3.6.1" - "@aws-sdk/eventstream-serde-node" "3.6.1" - "@aws-sdk/fetch-http-handler" "3.6.1" - "@aws-sdk/hash-blob-browser" "3.6.1" - "@aws-sdk/hash-node" "3.6.1" - "@aws-sdk/hash-stream-node" "3.6.1" - "@aws-sdk/invalid-dependency" "3.6.1" - "@aws-sdk/md5-js" "3.6.1" - "@aws-sdk/middleware-apply-body-checksum" "3.6.1" - "@aws-sdk/middleware-bucket-endpoint" "3.6.1" - "@aws-sdk/middleware-content-length" "3.6.1" - "@aws-sdk/middleware-expect-continue" "3.6.1" - "@aws-sdk/middleware-host-header" "3.6.1" - "@aws-sdk/middleware-location-constraint" "3.6.1" - "@aws-sdk/middleware-logger" "3.6.1" - "@aws-sdk/middleware-retry" "3.6.1" - "@aws-sdk/middleware-sdk-s3" "3.6.1" - "@aws-sdk/middleware-serde" "3.6.1" - "@aws-sdk/middleware-signing" "3.6.1" - "@aws-sdk/middleware-ssec" "3.6.1" - "@aws-sdk/middleware-stack" "3.6.1" - "@aws-sdk/middleware-user-agent" "3.6.1" - "@aws-sdk/node-config-provider" "3.6.1" - "@aws-sdk/node-http-handler" "3.6.1" - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/smithy-client" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/url-parser" "3.6.1" - "@aws-sdk/url-parser-native" "3.6.1" - "@aws-sdk/util-base64-browser" "3.6.1" - "@aws-sdk/util-base64-node" "3.6.1" - "@aws-sdk/util-body-length-browser" "3.6.1" - "@aws-sdk/util-body-length-node" "3.6.1" - "@aws-sdk/util-user-agent-browser" "3.6.1" - "@aws-sdk/util-user-agent-node" "3.6.1" - "@aws-sdk/util-utf8-browser" "3.6.1" - "@aws-sdk/util-utf8-node" "3.6.1" - "@aws-sdk/util-waiter" "3.6.1" - "@aws-sdk/xml-builder" "3.6.1" - fast-xml-parser "^3.16.0" - tslib "^2.0.0" - -"@aws-sdk/client-sso@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.41.0.tgz#33d49e926ef6fff08278b256454241f1f982d8de" - integrity sha512-xDvcy7wv3KdHhOpl5fZN+Ydw+dHBmsCZwMFI1ZdJVCSGO+ZKgl5KVWi1LCif6vjZP1pUuGl44oDOZz1ACqOzTg== +"@aws-sdk/client-sso-oidc@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.370.0.tgz#db03c04cb6a23888dc60016eb67505a41ede410b" + integrity sha512-jAYOO74lmVXylQylqkPrjLzxvUnMKw476JCUTvCO6Q8nv3LzCWd76Ihgv/m9Q4M2Tbqi1iP2roVK5bstsXzEjA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + tslib "^2.5.0" + +"@aws-sdk/client-sso@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.186.0.tgz#233bdd1312dbf88ef9452f8a62c3c3f1ac580330" + integrity sha512-qwLPomqq+fjvp42izzEpBEtGL2+dIlWH5pUCteV55hTEwHgo+m9LJPIrMWkPeoMBzqbNiu5n6+zihnwYlCIlEA== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.40.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/config-resolver" "3.186.0" + "@aws-sdk/fetch-http-handler" "3.186.0" + "@aws-sdk/hash-node" "3.186.0" + "@aws-sdk/invalid-dependency" "3.186.0" + "@aws-sdk/middleware-content-length" "3.186.0" + "@aws-sdk/middleware-host-header" "3.186.0" + "@aws-sdk/middleware-logger" "3.186.0" + "@aws-sdk/middleware-recursion-detection" "3.186.0" + "@aws-sdk/middleware-retry" "3.186.0" + "@aws-sdk/middleware-serde" "3.186.0" + "@aws-sdk/middleware-stack" "3.186.0" + "@aws-sdk/middleware-user-agent" "3.186.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/node-http-handler" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/smithy-client" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/url-parser" "3.186.0" + "@aws-sdk/util-base64-browser" "3.186.0" + "@aws-sdk/util-base64-node" "3.186.0" + "@aws-sdk/util-body-length-browser" "3.186.0" + "@aws-sdk/util-body-length-node" "3.186.0" + "@aws-sdk/util-defaults-mode-browser" "3.186.0" + "@aws-sdk/util-defaults-mode-node" "3.186.0" + "@aws-sdk/util-user-agent-browser" "3.186.0" + "@aws-sdk/util-user-agent-node" "3.186.0" + "@aws-sdk/util-utf8-browser" "3.186.0" + "@aws-sdk/util-utf8-node" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/client-sts@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.41.0.tgz#38bde53d0cd1254894d0b27b4cc3f056f5d2692e" - integrity sha512-XTjmr53kMbXuVhH3B+g2jEYuhNralptsMSd4RcSHCB7BX1NmAMnMFKKTmVlmc5NizWi4x1CzExu86Q0YSqp0og== +"@aws-sdk/client-sso@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.370.0.tgz#68aea97ecb2e5e6c817dfd3a1dd9fa4e09ff6e1c" + integrity sha512-0Ty1iHuzNxMQtN7nahgkZr4Wcu1XvqGfrQniiGdKKif9jG/4elxsQPiydRuQpFqN6b+bg7wPP7crFP1uTxx2KQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + tslib "^2.5.0" + +"@aws-sdk/client-sts@3.186.3": + version "3.186.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.186.3.tgz#1c12355cb9d3cadc64ab74c91c3d57515680dfbd" + integrity sha512-mnttdyYBtqO+FkDtOT3F1FGi8qD11fF5/3zYLaNuFFULqKneaIwW2YIsjFlgvPGpmoyo/tNplnZwhQ9xQtT3Sw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.40.0" - "@aws-sdk/credential-provider-node" "3.41.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-sdk-sts" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-signing" "3.40.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" + "@aws-sdk/config-resolver" "3.186.0" + "@aws-sdk/credential-provider-node" "3.186.0" + "@aws-sdk/fetch-http-handler" "3.186.0" + "@aws-sdk/hash-node" "3.186.0" + "@aws-sdk/invalid-dependency" "3.186.0" + "@aws-sdk/middleware-content-length" "3.186.0" + "@aws-sdk/middleware-host-header" "3.186.0" + "@aws-sdk/middleware-logger" "3.186.0" + "@aws-sdk/middleware-recursion-detection" "3.186.0" + "@aws-sdk/middleware-retry" "3.186.0" + "@aws-sdk/middleware-sdk-sts" "3.186.0" + "@aws-sdk/middleware-serde" "3.186.0" + "@aws-sdk/middleware-signing" "3.186.0" + "@aws-sdk/middleware-stack" "3.186.0" + "@aws-sdk/middleware-user-agent" "3.186.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/node-http-handler" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/smithy-client" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/url-parser" "3.186.0" + "@aws-sdk/util-base64-browser" "3.186.0" + "@aws-sdk/util-base64-node" "3.186.0" + "@aws-sdk/util-body-length-browser" "3.186.0" + "@aws-sdk/util-body-length-node" "3.186.0" + "@aws-sdk/util-defaults-mode-browser" "3.186.0" + "@aws-sdk/util-defaults-mode-node" "3.186.0" + "@aws-sdk/util-user-agent-browser" "3.186.0" + "@aws-sdk/util-user-agent-node" "3.186.0" + "@aws-sdk/util-utf8-browser" "3.186.0" + "@aws-sdk/util-utf8-node" "3.186.0" entities "2.2.0" - fast-xml-parser "3.19.0" - tslib "^2.3.0" + fast-xml-parser "4.2.5" + tslib "^2.3.1" -"@aws-sdk/client-sts@3.42.0": - version "3.42.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.42.0.tgz#0de16e5d258d722e4d7457a251556b77c49e0e2b" - integrity sha512-jDklT7MoD8RxaPzUqEuCYmwhkSPpkVzLbmbMaR1oc95REuiAljVzgmEHBX/5Rk6xsFxAv2xk2P07DDmECv9fTg== - dependencies: - "@aws-crypto/sha256-browser" "2.0.0" - "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.40.0" - "@aws-sdk/credential-provider-node" "3.41.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-sdk-sts" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-signing" "3.40.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" - entities "2.2.0" - fast-xml-parser "3.19.0" - tslib "^2.3.0" +"@aws-sdk/client-sts@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.370.0.tgz#65879fa35b396035dcab446c782056ef768f48af" + integrity sha512-utFxOPWIzbN+3kc415Je2o4J72hOLNhgR2Gt5EnRSggC3yOnkC4GzauxG8n7n5gZGBX45eyubHyPOXLOIyoqQA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/credential-provider-node" "3.370.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-sdk-sts" "3.370.0" + "@aws-sdk/middleware-signing" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + fast-xml-parser "4.2.5" + tslib "^2.5.0" "@aws-sdk/client-textract@3.6.1": version "3.6.1" @@ -1133,15 +1211,16 @@ tslib "^2.0.0" uuid "^3.0.0" -"@aws-sdk/config-resolver@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.40.0.tgz#d7bd3180aebced797800661a2ed778a5db8ac7e5" - integrity sha512-QYy6J2k31QL6J74hPBfptnLW1kQYdN+xjwH4UQ1mv7EUhRoJN9ZY2soStJowFy4at6IIOOVWbyG5dyqvrbEovg== +"@aws-sdk/config-resolver@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.186.0.tgz#68bbf82b572f03ee3ec9ac84d000147e1050149b" + integrity sha512-l8DR7Q4grEn1fgo2/KvtIfIHJS33HGKPQnht8OPxkl0dMzOJ0jxjOw/tMbrIcPnr2T3Fi7LLcj3dY1Fo1poruQ== dependencies: - "@aws-sdk/signature-v4" "3.40.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-config-provider" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/signature-v4" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-config-provider" "3.186.0" + "@aws-sdk/util-middleware" "3.186.0" + tslib "^2.3.1" "@aws-sdk/config-resolver@3.6.1": version "3.6.1" @@ -1152,24 +1231,24 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-cognito-identity@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.6.1.tgz#df928951612a34832c2df15fb899251d828c2df3" - integrity sha512-uJ9q+yq+Dhdo32gcv0p/AT7sKSAUH0y4ts9XRK/vx0dW9Q3XJy99mOJlq/6fkh4LfWeavJJlaCo9lSHNMWXx4w== +"@aws-sdk/credential-provider-env@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.186.0.tgz#55dec9c4c29ebbdff4f3bce72de9e98f7a1f92e1" + integrity sha512-N9LPAqi1lsQWgxzmU4NPvLPnCN5+IQ3Ai1IFf3wM6FFPNoSUd1kIA2c6xaf0BE7j5Kelm0raZOb4LnV3TBAv+g== dependencies: - "@aws-sdk/client-cognito-identity" "3.6.1" - "@aws-sdk/property-provider" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/credential-provider-env@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.40.0.tgz#0ca7611f13520dd6654e8eac7fa3e767d027ede6" - integrity sha512-qHZdf2vxhzZkSygjw2I4SEYFL2dMZxxYvO4QlkqQouKY81OVxs/j69oiNCjPasQzGz5jaZZKI8xEAIfkSyr1lg== +"@aws-sdk/credential-provider-env@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.370.0.tgz#edd507a88b36b967da048255f4a478ad92d1c5aa" + integrity sha512-raR3yP/4GGbKFRPP5hUBNkEmTnzxI9mEc2vJAJrcv4G4J4i/UP6ELiLInQ5eO2/VcV/CeKGZA3t7d1tsJ+jhCg== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/credential-provider-env@3.6.1": version "3.6.1" @@ -1180,16 +1259,16 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-imds@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.40.0.tgz#7c324eff731f85d4d40763c484e78673aa5dedfb" - integrity sha512-Ty/wVa+BQrCFrP06AGl5S1CeLifDt68YrlYXUnkRn603SX4DvxBgVO7XFeDH58G8ziDCiqxfmVl4yjbncPPeSw== +"@aws-sdk/credential-provider-imds@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.186.0.tgz#73e0f62832726c7734b4f6c50a02ab0d869c00e1" + integrity sha512-iJeC7KrEgPPAuXjCZ3ExYZrRQvzpSdTZopYgUm5TnNZ8S1NU/4nvv5xVy61JvMj3JQAeG8UDYYgC421Foc8wQw== dependencies: - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/url-parser" "3.186.0" + tslib "^2.3.1" "@aws-sdk/credential-provider-imds@3.6.1": version "3.6.1" @@ -1200,20 +1279,35 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-ini@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.41.0.tgz#a212444f6e4d03c0683ed1b6479bca72eab782dd" - integrity sha512-98CGEHg7Tb6HxK5ZIdbAcijvD3IpLe0ddse1xMe/Ilhjz770FS/L2UNprOP6PZTqrSfBffiMrvfThUSuUaTlIQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.40.0" - "@aws-sdk/credential-provider-imds" "3.40.0" - "@aws-sdk/credential-provider-sso" "3.41.0" - "@aws-sdk/credential-provider-web-identity" "3.41.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" - tslib "^2.3.0" +"@aws-sdk/credential-provider-ini@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.186.0.tgz#3b3873ccae855ee3f6f15dcd8212c5ca4ec01bf3" + integrity sha512-ecrFh3MoZhAj5P2k/HXo/hMJQ3sfmvlommzXuZ/D1Bj2yMcyWuBhF1A83Fwd2gtYrWRrllsK3IOMM5Jr8UIVZA== + dependencies: + "@aws-sdk/credential-provider-env" "3.186.0" + "@aws-sdk/credential-provider-imds" "3.186.0" + "@aws-sdk/credential-provider-sso" "3.186.0" + "@aws-sdk/credential-provider-web-identity" "3.186.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/shared-ini-file-loader" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-ini@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.370.0.tgz#4e569b8054b4fba2f0a0a7fa88af84b1f8d78c0b" + integrity sha512-eJyapFKa4NrC9RfTgxlXnXfS9InG/QMEUPPVL+VhG7YS6nKqetC1digOYgivnEeu+XSKE0DJ7uZuXujN2Y7VAQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.370.0" + "@aws-sdk/credential-provider-process" "3.370.0" + "@aws-sdk/credential-provider-sso" "3.370.0" + "@aws-sdk/credential-provider-web-identity" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/credential-provider-imds" "^1.0.1" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/credential-provider-ini@3.6.1": version "3.6.1" @@ -1225,22 +1319,38 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-node@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.41.0.tgz#ab4fc10ea6c7a2b42c903f4bdb68fea8ada5f5dd" - integrity sha512-5FW6+wNJgyDCsbAd+mLm/1DBTDkyIYOMVzcxbr6Vi3pM4UrMFdeLdAP62edYW8usg78Xg+c6vaAoEv/M3zkS0Q== - dependencies: - "@aws-sdk/credential-provider-env" "3.40.0" - "@aws-sdk/credential-provider-imds" "3.40.0" - "@aws-sdk/credential-provider-ini" "3.41.0" - "@aws-sdk/credential-provider-process" "3.40.0" - "@aws-sdk/credential-provider-sso" "3.41.0" - "@aws-sdk/credential-provider-web-identity" "3.41.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" - tslib "^2.3.0" +"@aws-sdk/credential-provider-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.186.0.tgz#0be58623660b41eed3a349a89b31a01d4cc773ea" + integrity sha512-HIt2XhSRhEvVgRxTveLCzIkd/SzEBQfkQ6xMJhkBtfJw1o3+jeCk+VysXM0idqmXytctL0O3g9cvvTHOsUgxOA== + dependencies: + "@aws-sdk/credential-provider-env" "3.186.0" + "@aws-sdk/credential-provider-imds" "3.186.0" + "@aws-sdk/credential-provider-ini" "3.186.0" + "@aws-sdk/credential-provider-process" "3.186.0" + "@aws-sdk/credential-provider-sso" "3.186.0" + "@aws-sdk/credential-provider-web-identity" "3.186.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/shared-ini-file-loader" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-node@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.370.0.tgz#74605644ccbd9e8237223318a7955f4ab2ff0d86" + integrity sha512-gkFiotBFKE4Fcn8CzQnMeab9TAR06FEAD02T4ZRYW1xGrBJOowmje9dKqdwQFHSPgnWAP+8HoTA8iwbhTLvjNA== + dependencies: + "@aws-sdk/credential-provider-env" "3.370.0" + "@aws-sdk/credential-provider-ini" "3.370.0" + "@aws-sdk/credential-provider-process" "3.370.0" + "@aws-sdk/credential-provider-sso" "3.370.0" + "@aws-sdk/credential-provider-web-identity" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/credential-provider-imds" "^1.0.1" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/credential-provider-node@3.6.1": version "3.6.1" @@ -1256,16 +1366,26 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-process@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.40.0.tgz#b4f16e43ca9c855002e833ac9dc8e409b3c7ca23" - integrity sha512-qsaNCDesW2GasDbzpeOA371gxugi05JWxt3EKonLbUfkGKBK7kmmL6EgLIxZuNm2/Ve4RS07PKp8yBGm4xIx9w== +"@aws-sdk/credential-provider-process@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.186.0.tgz#e3be60983261a58c212f5c38b6fb76305bbb8ce7" + integrity sha512-ATRU6gbXvWC1TLnjOEZugC/PBXHBoZgBADid4fDcEQY1vF5e5Ux1kmqkJxyHtV5Wl8sE2uJfwWn+FlpUHRX67g== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/shared-ini-file-loader" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-process@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.370.0.tgz#f7b94d2ccfda3b067cb23ea832b10c692c831855" + integrity sha512-0BKFFZmUO779Xdw3u7wWnoWhYA4zygxJbgGVSyjkOGBvdkbPSTTcdwT1KFkaQy2kOXYeZPl+usVVRXs+ph4ejg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/credential-provider-process@3.6.1": version "3.6.1" @@ -1278,34 +1398,75 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-sso@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.41.0.tgz#66c83a776ec42f08b4ea6d619351f0240d57f76a" - integrity sha512-9s7SWu3RVIQ/MTcBCt35EMzxNQm3avivrbpSOKfJwxR5L+oNKPsV+gSqMlkNZGwOVJyUicIsZGcq/4ON6CjrOg== +"@aws-sdk/credential-provider-sso@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.186.0.tgz#e1aa466543b3b0877d45b885a1c11b329232df22" + integrity sha512-mJ+IZljgXPx99HCmuLgBVDPLepHrwqnEEC/0wigrLCx6uz3SrAWmGZsNbxSEtb2CFSAaczlTHcU/kIl7XZIyeQ== dependencies: - "@aws-sdk/client-sso" "3.41.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/client-sso" "3.186.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/shared-ini-file-loader" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/credential-provider-web-identity@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.41.0.tgz#7f0e9cc5650eaf6ac32ef359fb0e0dea2ca0ce78" - integrity sha512-VqvVoEh9C8xTXl4stKyJC5IKQhS8g1Gi5k6B9HPHLIxFRRfKxkE73DT4pMN6npnus7o0yi0MTFGQFQGYSrFO2g== +"@aws-sdk/credential-provider-sso@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.370.0.tgz#4c57f93d73f198d7e1e53fbfcdf72c053bc9c682" + integrity sha512-PFroYm5hcPSfC/jkZnCI34QFL3I7WVKveVk6/F3fud/cnP8hp6YjA9NiTNbqdFSzsyoiN/+e5fZgNKih8vVPTA== + dependencies: + "@aws-sdk/client-sso" "3.370.0" + "@aws-sdk/token-providers" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-web-identity@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.186.0.tgz#db43f37f7827b553490dd865dbaa9a2c45f95494" + integrity sha512-KqzI5eBV72FE+8SuOQAu+r53RXGVHg4AuDJmdXyo7Gc4wS/B9FNElA8jVUjjYgVnf0FSiri+l41VzQ44dCopSA== + dependencies: + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-web-identity@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.370.0.tgz#c5831bb656bea1fe3b300e495e19a33bc90f4d84" + integrity sha512-CFaBMLRudwhjv1sDzybNV93IaT85IwS+L8Wq6VRMa0mro1q9rrWsIZO811eF+k0NEPfgU1dLH+8Vc2qhw4SARQ== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" -"@aws-sdk/endpoint-cache@3.36.0": - version "3.36.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.36.0.tgz#73425c91bc3236ab32b3a3149067a08454477528" - integrity sha512-riqT+0ETKJQyp86K8eZQZdbnZmswHpEEz4VdSoXfj+VpGe3UtasUbyqsTIW2gCi2SFypSNbjrRk3QMFmWQJxXA== +"@aws-sdk/endpoint-cache@3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.310.0.tgz#e6f84bfcd55462966811390ef797145559bab15a" + integrity sha512-y3wipforet41EDTI0vnzxILqwAGll1KfI5qcdX9pXF/WF1f+3frcOtPiWtQEZQpy4czRogKm3BHo70QBYAZxlQ== dependencies: mnemonist "0.38.3" - tslib "^2.3.0" + tslib "^2.5.0" + +"@aws-sdk/eventstream-codec@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.186.0.tgz#9da9608866b38179edf72987f2bc3b865d11db13" + integrity sha512-3kLcJ0/H+zxFlhTlE1SGoFpzd/SitwXOsTSlYVwrwdISKRjooGg0BJpm1CSTkvmWnQIUlYijJvS96TAJ+fCPIA== + dependencies: + "@aws-crypto/crc32" "2.0.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-hex-encoding" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/eventstream-handler-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.186.0.tgz#d58aec9a8617ed1a9a3800d5526333deb3efebb2" + integrity sha512-S8eAxCHyFAGSH7F6GHKU2ckpiwFPwJUQwMzewISLg3wzLQeu6lmduxBxVaV3/SoEbEMsbNmrgw9EXtw3Vt/odQ== + dependencies: + "@aws-sdk/eventstream-codec" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/eventstream-marshaller@3.6.1": version "3.6.1" @@ -1317,6 +1478,15 @@ "@aws-sdk/util-hex-encoding" "3.6.1" tslib "^1.8.0" +"@aws-sdk/eventstream-serde-browser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.186.0.tgz#2a0bd942f977b3e2f1a77822ac091ddebe069475" + integrity sha512-0r2c+yugBdkP5bglGhGOgztjeHdHTKqu2u6bvTByM0nJShNO9YyqWygqPqDUOE5axcYQE1D0aFDGzDtP3mGJhw== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + "@aws-sdk/eventstream-serde-browser@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.6.1.tgz#1253bd5215745f79d534fc9bc6bd006ee7a0f239" @@ -1327,6 +1497,14 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" +"@aws-sdk/eventstream-serde-config-resolver@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.186.0.tgz#6c277058bb0fa14752f0b6d7043576e0b5f13da4" + integrity sha512-xhwCqYrAX5c7fg9COXVw6r7Sa3BO5cCfQMSR5S1QisE7do8K1GDKEHvUCheOx+RLon+P3glLjuNBMdD0HfCVNA== + dependencies: + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + "@aws-sdk/eventstream-serde-config-resolver@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.6.1.tgz#ebb5c1614f55d0ebb225defac1f76c420e188086" @@ -1335,6 +1513,15 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" +"@aws-sdk/eventstream-serde-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.186.0.tgz#dabeab714f447790c5dd31d401c5a3822b795109" + integrity sha512-9p/gdukJYfmA+OEYd6MfIuufxrrfdt15lBDM3FODuc9j09LSYSRHSxthkIhiM5XYYaaUM+4R0ZlSMdaC3vFDFQ== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + "@aws-sdk/eventstream-serde-node@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.6.1.tgz#705e12bea185905a198d7812af10e3a679dfc841" @@ -1345,6 +1532,15 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" +"@aws-sdk/eventstream-serde-universal@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.186.0.tgz#85a88a2cd5c336b1271976fa8db70654ec90fbf4" + integrity sha512-rIgPmwUxn2tzainBoh+cxAF+b7o01CcW+17yloXmawsi0kiR7QK7v9m/JTGQPWKtHSsPOrtRzuiWQNX57SlcsQ== + dependencies: + "@aws-sdk/eventstream-codec" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + "@aws-sdk/eventstream-serde-universal@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.6.1.tgz#5be6865adb55436cbc90557df3a3c49b53553470" @@ -1354,16 +1550,16 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/fetch-http-handler@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.40.0.tgz#5e6ecfb7fe1f32a5709e4e9c13b0536073477737" - integrity sha512-w1HiZromoU+/bbEo89uO81l6UO/M+c2uOMnXntZqe6t3ZHUUUo3AbvhKh0QGVFqRQa+Oi0+95KqWmTHa72/9Iw== +"@aws-sdk/fetch-http-handler@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.186.0.tgz#c1adc5f741e1ba9ad9d3fb13c9c2afdc88530a85" + integrity sha512-k2v4AAHRD76WnLg7arH94EvIclClo/YfuqO7NoQ6/KwOxjRhs4G6TgIsAZ9E0xmqoJoV81Xqy8H8ldfy9F8LEw== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/querystring-builder" "3.40.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/querystring-builder" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-base64-browser" "3.186.0" + tslib "^2.3.1" "@aws-sdk/fetch-http-handler@3.6.1": version "3.6.1" @@ -1376,24 +1572,14 @@ "@aws-sdk/util-base64-browser" "3.6.1" tslib "^1.8.0" -"@aws-sdk/hash-blob-browser@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.6.1.tgz#f44a1857b75769e21cd6091211171135e03531e6" - integrity sha512-9jPaZ/e3F8gf9JZd44DD6MvbYV6bKnn99rkG3GFIINOy9etoxPrLehp2bH2DK/j0ow60RNuwgUjj5qHV/zF67g== +"@aws-sdk/hash-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.186.0.tgz#8cb13aae8f46eb360fed76baf5062f66f27dfb70" + integrity sha512-G3zuK8/3KExDTxqrGqko+opOMLRF0BwcwekV/wm3GKIM/NnLhHblBs2zd/yi7VsEoWmuzibfp6uzxgFpEoJ87w== dependencies: - "@aws-sdk/chunked-blob-reader" "3.6.1" - "@aws-sdk/chunked-blob-reader-native" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" - -"@aws-sdk/hash-node@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.40.0.tgz#bf4d31a41652cbc3c937055087c80096cfab67ae" - integrity sha512-yOXXK85DdGDktdnQtXgMdaVKii4wtMjEhJ1mrvx2A9nMFNaPhxvERkVVIUKSWlJRa9ZujOw5jWOx8d2R51/Kjg== - dependencies: - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-buffer-from" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-buffer-from" "3.186.0" + tslib "^2.3.1" "@aws-sdk/hash-node@3.6.1": version "3.6.1" @@ -1404,21 +1590,13 @@ "@aws-sdk/util-buffer-from" "3.6.1" tslib "^1.8.0" -"@aws-sdk/hash-stream-node@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.6.1.tgz#91c77e382ef3d0472160a49b1109395a4a70c801" - integrity sha512-ePaWjCItIWxuSxA/UnUM/keQ3IAOsQz3FYSxu0KK8K0e1bKTEUgDIG9oMLBq7jIl9TzJG0HBXuPfMe73QHUNug== +"@aws-sdk/invalid-dependency@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.186.0.tgz#aa6331ccf404cb659ec38483116080e4b82b0663" + integrity sha512-hjeZKqORhG2DPWYZ776lQ9YO3gjw166vZHZCZU/43kEYaCZHsF4mexHwHzreAY6RfS25cH60Um7dUh1aeVIpkw== dependencies: - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" - -"@aws-sdk/invalid-dependency@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.40.0.tgz#023e37abfb2882676c3cef02da630342634aa429" - integrity sha512-axIWtDwCBDDqEgAJipX1FB1ZNpWYXquVwKDMo+7G+ftPBZ4FEq4M1ELhXJL3hhNJ9ZmCQzv+4F6Wnt8dwuzUaQ== - dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/invalid-dependency@3.6.1": version "3.6.1" @@ -1428,12 +1606,12 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/is-array-buffer@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.37.0.tgz#aa87619f8172b1a2a7ac8d573032025d98ae6c50" - integrity sha512-XLjA/a6AuGnCvcJZLsMTy2jxF2upgGhqCCkoIJgLlzzXHSihur13KcmPvW/zcaGnCRj0SvKWXiJHl4vDlW75VQ== +"@aws-sdk/is-array-buffer@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.186.0.tgz#7700e36f29d416c2677f4bf8816120f96d87f1b7" + integrity sha512-fObm+P6mjWYzxoFY4y2STHBmSdgKbIAXez0xope563mox62I8I4hhVPUCaDVydXvDpJv8tbedJMk0meJl22+xA== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" "@aws-sdk/is-array-buffer@3.6.1": version "3.6.1" @@ -1451,34 +1629,14 @@ "@aws-sdk/util-utf8-browser" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-apply-body-checksum@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-3.6.1.tgz#dece86e489531981b8aa2786dafbbef69edce1d6" - integrity sha512-IncmXR1MPk6aYvmD37It8dP6wVMzaxxzgrkIU2ACkN5UVwA+/0Sr3ZNd9dNwjpyoH1AwpL9BetnlJaWtT6K5ew== +"@aws-sdk/middleware-content-length@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.186.0.tgz#8cc7aeec527738c46fdaf4a48b17c5cbfdc7ce58" + integrity sha512-Ol3c1ks3IK1s+Okc/rHIX7w2WpXofuQdoAEme37gHeml+8FtUlWH/881h62xfMdf+0YZpRuYv/eM7lBmJBPNJw== dependencies: - "@aws-sdk/is-array-buffer" "3.6.1" - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" - -"@aws-sdk/middleware-bucket-endpoint@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.6.1.tgz#7ebdd79fac0f78d8af549f4fd799d4f7d02e78de" - integrity sha512-Frcqn2RQDNHy+e2Q9hv3ejT3mQWtGlfZESbXEF6toR4M0R8MmEVqIB/ohI6VKBj11lRmGwvpPsR6zz+PJ8HS7A== - dependencies: - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/util-arn-parser" "3.6.1" - tslib "^1.8.0" - -"@aws-sdk/middleware-content-length@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.40.0.tgz#affe235fc0eb43c7b8e21189f85a238fdd0b4c3f" - integrity sha512-sybAJb8v7I/vvL08R3+TI/XDAg9gybQTZ2treC24Ap4+jAOz4QBTHJPMKaUlEeFlMUcq4rj6/u2897ebYH6opw== - dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/middleware-content-length@3.6.1": version "3.6.1" @@ -1489,44 +1647,44 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-endpoint-discovery@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.40.0.tgz#2032bcf0466fd3d6e54ba231582192a2659b5de5" - integrity sha512-6jWcSL17V57jqQZNYJCm4PUwDjE6D8kP2+O5gx+ey9znerRWUiYzZibVH27wwVuBSj7lZ+C9YU09urxPWH6RXg== +"@aws-sdk/middleware-endpoint-discovery@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.370.0.tgz#b9165d8d8319136047071114f2f154a299bc7f14" + integrity sha512-CxTo+AUW1XIT0U1COzBjdQ39eWbWk5Sv9OmA73g1vHwwvy9M3vFl78cnaKnauGv7BI/NtM5IeRy0w5T22BtWgg== dependencies: - "@aws-sdk/config-resolver" "3.40.0" - "@aws-sdk/endpoint-cache" "3.36.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/endpoint-cache" "3.310.0" + "@aws-sdk/types" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" -"@aws-sdk/middleware-expect-continue@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.6.1.tgz#56e56db572f81dd4fa8803e85bd1f36005f9fffa" - integrity sha512-vvMOqVYU3uvdJzg/X6NHewZUEBZhSqND1IEcdahLb6RmvDhsS39iS97VZmEFsjj/UFGoePtYjrrdEgRG9Rm1kQ== +"@aws-sdk/middleware-eventstream@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.186.0.tgz#64a66102ed2e182182473948f131f23dda84e729" + integrity sha512-7yjFiitTGgfKL6cHK3u3HYFnld26IW5aUAFuEd6ocR/FjliysfBd8g0g1bw3bRfIMgCDD8OIOkXK8iCk2iYGWQ== dependencies: - "@aws-sdk/middleware-header-default" "3.6.1" - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/middleware-header-default@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-header-default/-/middleware-header-default-3.6.1.tgz#a3a108d22cbdd1e1754910625fafb2f2a67fbcfc" - integrity sha512-YD137iIctXVH8Eut0WOBalvvA+uL0jM0UXZ9N2oKrC8kPQPpqjK9lYGFKZQFsl/XlQHAjJi+gCAFrYsBntRWJQ== +"@aws-sdk/middleware-host-header@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.186.0.tgz#fce4f1219ce1835e2348c787d8341080b0024e34" + integrity sha512-5bTzrRzP2IGwyF3QCyMGtSXpOOud537x32htZf344IvVjrqZF/P8CDfGTkHkeBCIH+wnJxjK+l/QBb3ypAMIqQ== dependencies: - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/middleware-host-header@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.40.0.tgz#a6a1d52ab0da7f8e65a199c27d71750f8329eccc" - integrity sha512-/wocR7JFOLM7/+BQM1DgAd6KCFYcdxYu1P7AhI451GlVNuYa5f89zh7p0gt3SRC6monI5lXgpL7RudhDm8fTrA== +"@aws-sdk/middleware-host-header@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.370.0.tgz#645472416efd16b22a66b0aa1d52f48cf5699feb" + integrity sha512-CPXOm/TnOFC7KyXcJglICC7OiA7Kj6mT3ChvEijr56TFOueNHvJdV4aNIFEQy0vGHOWtY12qOWLNto/wYR1BAQ== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/middleware-host-header@3.6.1": version "3.6.1" @@ -1537,21 +1695,22 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-location-constraint@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.6.1.tgz#6fc2dd6a42968f011eb060ca564e9f749649eb01" - integrity sha512-nFisTc0O5D+4I+sRxiiLPasC/I4NDc3s+hgbPPt/b3uAdrujJjhwFBOSaTx8qQvz/xJPAA8pUA/bfWIyeZKi/w== +"@aws-sdk/middleware-logger@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.186.0.tgz#8a027fbbb1b8098ccc888bce51f34b000c0a0550" + integrity sha512-/1gGBImQT8xYh80pB7QtyzA799TqXtLZYQUohWAsFReYB7fdh5o+mu2rX0FNzZnrLIh2zBUNs4yaWGsnab4uXg== dependencies: - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/middleware-logger@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.40.0.tgz#29d9616bd39dafa1493cef333a32363e4df2c607" - integrity sha512-19kx0Xg5ymVRKoupmhdmfTBkROcv3DZj508agpyG2YAo0abOObMlIP4Jltg0VD4PhNjGzNh0jFGJnvhjdwv4/A== +"@aws-sdk/middleware-logger@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.370.0.tgz#c9f694d7e1dd47b5e6e8eab94793fc1e272b1e26" + integrity sha512-cQMq9SaZ/ORmTJPCT6VzMML7OxFdQzNkhMAgKpTDl+tdPWynlHF29E5xGoSzROnThHlQPCjogU0NZ8AxI0SWPA== dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.370.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/middleware-logger@3.6.1": version "3.6.1" @@ -1561,15 +1720,35 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-retry@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.40.0.tgz#5cffe046b1fd208a62a09495de6659be48ef86f3" - integrity sha512-SMUJrukugLL7YJE5X8B2ToukxMWMPwnf7jAFr84ptycCe8bdWv8x8klQ3EtVWpyqochtNlbTi6J/tTQBniUX7A== +"@aws-sdk/middleware-recursion-detection@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.186.0.tgz#9d9d3212e9a954b557840bb80415987f4484487e" + integrity sha512-Za7k26Kovb4LuV5tmC6wcVILDCt0kwztwSlB991xk4vwNTja8kKxSt53WsYG8Q2wSaW6UOIbSoguZVyxbIY07Q== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/service-error-classification" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-recursion-detection@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.370.0.tgz#e5e8fd1d2ff1ade91135295dabcaa81c311ce00b" + integrity sha512-L7ZF/w0lAAY/GK1khT8VdoU0XB7nWHk51rl/ecAg64J70dHnMOAg8n+5FZ9fBu/xH1FwUlHOkwlodJOgzLJjtg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-retry@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.186.0.tgz#0ff9af58d73855863683991a809b40b93c753ad1" + integrity sha512-/VI9emEKhhDzlNv9lQMmkyxx3GjJ8yPfXH3HuAeOgM1wx1BjCTLRYEWnTbQwq7BDzVENdneleCsGAp7yaj80Aw== + dependencies: + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/service-error-classification" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-middleware" "3.186.0" + tslib "^2.3.1" uuid "^8.3.2" "@aws-sdk/middleware-retry@3.6.1": @@ -1584,35 +1763,35 @@ tslib "^1.8.0" uuid "^3.0.0" -"@aws-sdk/middleware-sdk-s3@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.6.1.tgz#371f8991ac82432982153c035ab9450d8df14546" - integrity sha512-HEA9kynNTsOSIIz8p5GEEAH03pnn+SSohwPl80sGqkmI1yl1tzjqgYZRii0e6acJTh4j9655XFzSx36hYPeB2w== +"@aws-sdk/middleware-sdk-sts@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.186.0.tgz#18f3d6b7b42c1345b5733ac3e3119d370a403e94" + integrity sha512-GDcK0O8rjtnd+XRGnxzheq1V2jk4Sj4HtjrxW/ROyhzLOAOyyxutBt+/zOpDD6Gba3qxc69wE+Cf/qngOkEkDw== dependencies: - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/util-arn-parser" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/middleware-signing" "3.186.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/signature-v4" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/middleware-sdk-sts@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.40.0.tgz#3efefc29176d5078915b61d17105f8bbee86ff5e" - integrity sha512-TcrbCvj1PkabFZiNczT3yePZtuEm2fAIw1OVnQyLcF2KW+p62Hv5YkK4MPOfx3LA/0lzjOUO1RNl2x7gzV443Q== - dependencies: - "@aws-sdk/middleware-signing" "3.40.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/signature-v4" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" +"@aws-sdk/middleware-sdk-sts@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.370.0.tgz#0599a624fe5cabe75cd7d9e7420927b102356fa2" + integrity sha512-ykbsoVy0AJtVbuhAlTAMcaz/tCE3pT8nAp0L7CQQxSoanRCvOux7au0KwMIQVhxgnYid4dWVF6d00SkqU5MXRA== + dependencies: + "@aws-sdk/middleware-signing" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" -"@aws-sdk/middleware-serde@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.40.0.tgz#90124ff60a7f23963bbcd00a5cc95862b29dddd9" - integrity sha512-uOWfZjlAoBy6xPqp0d4ka83WNNbEVCWn9WwfqBUXThyoTdTooYSpXe5y2YzN0BJa8b+tEZTyWpgamnBpFLp47g== +"@aws-sdk/middleware-serde@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.186.0.tgz#f7944241ad5fb31cb15cd250c9e92147942b9ec6" + integrity sha512-6FEAz70RNf18fKL5O7CepPSwTKJEIoyG9zU6p17GzKMgPeFsxS5xO94Hcq5tV2/CqeHliebjqhKY7yi+Pgok7g== dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/middleware-serde@3.6.1": version "3.6.1" @@ -1622,16 +1801,30 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-signing@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.40.0.tgz#bcbf5558a91db85a87918d5861ce98f306e40a88" - integrity sha512-RqK5nPbfma0qInMvjtpVkDYY/KkFS6EKlOv3DWTdxbXJ4YuOxgKiuUromhmBUoyjFag0JO7LUWod07H+/DawoA== +"@aws-sdk/middleware-signing@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.186.0.tgz#37633bf855667b4841464e0044492d0aec5778b9" + integrity sha512-riCJYG/LlF/rkgVbHkr4xJscc0/sECzDivzTaUmfb9kJhAwGxCyNqnTvg0q6UO00kxSdEB9zNZI2/iJYVBijBQ== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/signature-v4" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/signature-v4" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-middleware" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-signing@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.370.0.tgz#c094026251faa17a24f61630d56152f7b073e6cf" + integrity sha512-Dwr/RTCWOXdm394wCwICGT2VNOTMRe4IGPsBRJAsM24pm+EEqQzSS3Xu/U/zF4exuxqpMta4wec4QpSarPNTxA== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/protocol-http" "^1.1.0" + "@smithy/signature-v4" "^1.0.1" + "@smithy/types" "^1.1.0" + "@smithy/util-middleware" "^1.0.1" + tslib "^2.5.0" "@aws-sdk/middleware-signing@3.6.1": version "3.6.1" @@ -1643,20 +1836,12 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-ssec@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.6.1.tgz#c7dd80e4c1e06be9050c742af7879619b400f0d1" - integrity sha512-svuH6s91uKUTORt51msiL/ZBjtYSW32c3uVoWxludd/PEf6zO5wCmUEsKoyVwa88L7rrCq+81UBv5A8S5kc3Cw== +"@aws-sdk/middleware-stack@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.186.0.tgz#da3445fe74b867ee6d7eec4f0dde28aaca1125d6" + integrity sha512-fENMoo0pW7UBrbuycPf+3WZ+fcUgP9PnQ0jcOK3WWZlZ9d2ewh4HNxLh4EE3NkNYj4VIUFXtTUuVNHlG8trXjQ== dependencies: - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" - -"@aws-sdk/middleware-stack@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.40.0.tgz#5aa614e49a4fc76cc63986fb45302f7afab6db87" - integrity sha512-hby9HvESUYJxpdALX+6Dn2LPmS5jtMVurGB/+j3MWOvIcDYB4bcSXgVRvXzYnTKwbSupIdbX9zOE2ZAx2SJpUQ== - dependencies: - tslib "^2.3.0" + tslib "^2.3.1" "@aws-sdk/middleware-stack@3.6.1": version "3.6.1" @@ -1665,14 +1850,25 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/middleware-user-agent@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.40.0.tgz#bf03d2deddc00689c85e7eadd9b4e02f24b61c08" - integrity sha512-dzC2fxWnanetFJ1oYgil8df3N36bR1yc/OCOpbdfQNiUk1FrXiCXqH5rHNO8zCvnwJAj8GHFwpFGd9a2Qube2w== +"@aws-sdk/middleware-user-agent@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.186.0.tgz#6d881e9cea5fe7517e220f3a47c2f3557c7f27fc" + integrity sha512-fb+F2PF9DLKOVMgmhkr+ltN8ZhNJavTla9aqmbd01846OLEaN1n5xEnV7p8q5+EznVBWDF38Oz9Ae5BMt3Hs7w== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-user-agent@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.370.0.tgz#a2bf71baf6407654811a02e4d276a2eec3996fdb" + integrity sha512-2+3SB6MtMAq1+gVXhw0Y3ONXuljorh6ijnxgTpv+uQnBW5jHCUiAS8WDYiDEm7i9euJPbvJfM8WUrSMDMU6Cog== + dependencies: + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/middleware-user-agent@3.6.1": version "3.6.1" @@ -1683,15 +1879,15 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/node-config-provider@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.40.0.tgz#54a8abc4f6d78503093b270e6dff3d6174c59f95" - integrity sha512-AmokjgUDECG8osoMfdRsPNweqI+L1pn4bYGk5iTLmzbBi0o4ot0U1FdX8Rf0qJZZwS4t1TXc3s8/PDVknmPxKg== +"@aws-sdk/node-config-provider@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.186.0.tgz#64259429d39f2ef5a76663162bf2e8db6032a322" + integrity sha512-De93mgmtuUUeoiKXU8pVHXWKPBfJQlS/lh1k2H9T2Pd9Tzi0l7p5ttddx4BsEx4gk+Pc5flNz+DeptiSjZpa4A== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/shared-ini-file-loader" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/node-config-provider@3.6.1": version "3.6.1" @@ -1703,16 +1899,16 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/node-http-handler@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.40.0.tgz#26491f11dabbd673c6318376d06af154adc123df" - integrity sha512-qjda6IbxDhbYr8NHmrMurKkbjgLUkfTMVgagDErDK24Nm3Dn5VaO6J4n6c0Q4OLHlmFaRcUfZSTrOo5DAubqCw== +"@aws-sdk/node-http-handler@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.186.0.tgz#8be1598a9187637a767dc337bf22fe01461e86eb" + integrity sha512-CbkbDuPZT9UNJ4dAZJWB3BV+Z65wFy7OduqGkzNNrKq6ZYMUfehthhUOTk8vU6RMe/0FkN+J0fFXlBx/bs/cHw== dependencies: - "@aws-sdk/abort-controller" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/querystring-builder" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/abort-controller" "3.186.0" + "@aws-sdk/protocol-http" "3.186.0" + "@aws-sdk/querystring-builder" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/node-http-handler@3.6.1": version "3.6.1" @@ -1725,13 +1921,13 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/property-provider@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.40.0.tgz#243cb1e87e36b1123ddc66d40d344e7580f80470" - integrity sha512-Mx4lkShjsYRwW9ujHA1pcnuubrWQ4kF5/DXWNfUiXuSIO/0Lojp1qTLheyBm4vzkJIlx5umyP6NvRAUkEHSN4Q== +"@aws-sdk/property-provider@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.186.0.tgz#af41e615662a2749d3ff7da78c41f79f4be95b3b" + integrity sha512-nWKqt36UW3xV23RlHUmat+yevw9up+T+953nfjcmCBKtgWlCWu/aUzewTRhKj3VRscbN+Wer95SBw9Lr/MMOlQ== dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/property-provider@3.6.1": version "3.6.1" @@ -1741,13 +1937,13 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/protocol-http@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.40.0.tgz#ce6c7170a59e0a0eb63df5cd7cec87fe05bae680" - integrity sha512-f4ea7/HZkjpvGBrnRIuzc/bhrExWrgDv7eulj4htPukZGHdTqSJD3Jk8lEXWvFuX2vUKQDGhEhCDsqup7YWJQQ== +"@aws-sdk/protocol-http@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.186.0.tgz#99115870846312dd4202b5e2cc68fe39324b9bfa" + integrity sha512-l/KYr/UBDUU5ginqTgHtFfHR3X6ljf/1J1ThIiUg3C3kVC/Zwztm7BEOw8hHRWnWQGU/jYasGYcrcPLdQqFZyQ== dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/protocol-http@3.6.1": version "3.6.1" @@ -1757,14 +1953,14 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/querystring-builder@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.40.0.tgz#f57212e60519d2d79ce6173cbe00fbe17a69bc0d" - integrity sha512-gO24oipnNaxJRBXB7lhLfa96vIMOd8gtMBqJTjelTjS2e1ZP1YY12CNKKTWwafSk8Ge021erZAG/YTOaXGpv+g== +"@aws-sdk/querystring-builder@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.186.0.tgz#a380db0e1c71004932d9e2f3e6dc6761d1165c47" + integrity sha512-mweCpuLufImxfq/rRBTEpjGuB4xhQvbokA+otjnUxlPdIobytLqEs7pCGQfLzQ7+1ZMo8LBXt70RH4A2nSX/JQ== dependencies: - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-uri-escape" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-uri-escape" "3.186.0" + tslib "^2.3.1" "@aws-sdk/querystring-builder@3.6.1": version "3.6.1" @@ -1775,13 +1971,13 @@ "@aws-sdk/util-uri-escape" "3.6.1" tslib "^1.8.0" -"@aws-sdk/querystring-parser@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.40.0.tgz#5a5ba9c095ad3125a0daf37c33ed1cc8a600d53e" - integrity sha512-XZIyaKQIiZAM6zelCBcsLHhVDOLafi7XIOd3jy6SymGN8ajj3HqUJ/vdQ5G6ISTk18OrqgqcCOI9oNzv+nrBcA== +"@aws-sdk/querystring-parser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.186.0.tgz#4db6d31ad4df0d45baa2a35e371fbaa23e45ddd2" + integrity sha512-0iYfEloghzPVXJjmnzHamNx1F1jIiTW9Svy5ZF9LVqyr/uHZcQuiWYsuhWloBMLs8mfWarkZM02WfxZ8buAuhg== dependencies: - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/querystring-parser@3.6.1": version "3.6.1" @@ -1791,35 +1987,35 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/s3-request-presigner@3.6.1": +"@aws-sdk/service-error-classification@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.186.0.tgz#6e4e1d4b53d68bd28c28d9cf0b3b4cb6a6a59dbb" + integrity sha512-DRl3ORk4tF+jmH5uvftlfaq0IeKKpt0UPAOAFQ/JFWe+TjOcQd/K+VC0iiIG97YFp3aeFmH1JbEgsNxd+8fdxw== + +"@aws-sdk/service-error-classification@3.6.1": version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.6.1.tgz#ec83c70171692862a7f7ebbd151242a5af443695" - integrity sha512-OI7UHCKBwuiO/RmHHewBKnL2NYqdilXRmpX67TJ4tTszIrWP2+vpm3lIfrx/BM8nf8nKTzgkO98uFhoJsEhmTg== - dependencies: - "@aws-sdk/protocol-http" "3.6.1" - "@aws-sdk/signature-v4" "3.6.1" - "@aws-sdk/smithy-client" "3.6.1" - "@aws-sdk/types" "3.6.1" - "@aws-sdk/util-create-request" "3.6.1" - "@aws-sdk/util-format-url" "3.6.1" - tslib "^1.8.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.6.1.tgz#296fe62ac61338341e8a009c9a2dab013a791903" + integrity sha512-kZ7ZhbrN1f+vrSRkTJvXsu7BlOyZgym058nPA745+1RZ1Rtv4Ax8oknf2RvJyj/1qRUi8LBaAREjzQ3C8tmLBA== -"@aws-sdk/service-error-classification@3.40.0", "@aws-sdk/service-error-classification@^3.4.1": +"@aws-sdk/service-error-classification@^3.4.1": version "3.40.0" resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.40.0.tgz#c98cbb781bd50e5d90649742ff954d754201c44d" integrity sha512-c8btKmkvjXczWudXubGdbO3JgmjySBUVC/gCrZDNfwNGsG8RYJJQYYcnmt1gWjelUZsgMDl/2PIzxTlxVF91rA== -"@aws-sdk/service-error-classification@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.6.1.tgz#296fe62ac61338341e8a009c9a2dab013a791903" - integrity sha512-kZ7ZhbrN1f+vrSRkTJvXsu7BlOyZgym058nPA745+1RZ1Rtv4Ax8oknf2RvJyj/1qRUi8LBaAREjzQ3C8tmLBA== +"@aws-sdk/shared-ini-file-loader@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.186.0.tgz#a2d285bb3c4f8d69f7bfbde7a5868740cd3f7795" + integrity sha512-2FZqxmICtwN9CYid4dwfJSz/gGFHyStFQ3HCOQ8DsJUf2yREMSBsVmKqsyWgOrYcQ98gPcD5GIa7QO5yl3XF6A== + dependencies: + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/shared-ini-file-loader@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.37.0.tgz#ca595d9745150f46805f68be6a6c1607d618ad94" - integrity sha512-+vRBSlfa48R9KL7DpQt3dsu5/+5atjRgoCISblWo3SLpjrx41pKcjKneo7a1u0aP1Xc2oG2TfIyqTWZuOXsmEQ== +"@aws-sdk/shared-ini-file-loader@3.56.0": + version "3.56.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.56.0.tgz#3c1664048d16166094581581fb821cf2855fbbd8" + integrity sha512-dCy3mXqYKK76iep9rn2inFrPOlGURvoO+B0Ygem0jgkDuxIF8t5wa10WHWB2ee8qZRlfwPYtcVdpEm2398St3g== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" "@aws-sdk/shared-ini-file-loader@3.6.1": version "3.6.1" @@ -1828,16 +2024,17 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/signature-v4@3.40.0", "@aws-sdk/signature-v4@^3.30.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.40.0.tgz#9de1b4e1130f68394df3232882805896c2d20e45" - integrity sha512-Q1GNZJRCS3W2qsRtDsX/b6EOSfMXfr6TW46N3LnLTGYZ3KAN2SOSJ1DsW59AuGpEZyRmOhJ9L/Q5U403+bZMXQ== +"@aws-sdk/signature-v4@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.186.0.tgz#bbd56e71af95548abaeec6307ea1dfe7bd26b4e4" + integrity sha512-18i96P5c4suMqwSNhnEOqhq4doqqyjH4fn0YV3F8TkekHPIWP4mtIJ0PWAN4eievqdtcKgD/GqVO6FaJG9texw== dependencies: - "@aws-sdk/is-array-buffer" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-hex-encoding" "3.37.0" - "@aws-sdk/util-uri-escape" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/is-array-buffer" "3.186.0" + "@aws-sdk/types" "3.186.0" + "@aws-sdk/util-hex-encoding" "3.186.0" + "@aws-sdk/util-middleware" "3.186.0" + "@aws-sdk/util-uri-escape" "3.186.0" + tslib "^2.3.1" "@aws-sdk/signature-v4@3.6.1": version "3.6.1" @@ -1850,14 +2047,22 @@ "@aws-sdk/util-uri-escape" "3.6.1" tslib "^1.8.0" -"@aws-sdk/smithy-client@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.41.0.tgz#61154b4813a01dc079e7083805a20e1bc05d3199" - integrity sha512-ldhS0Pf3v6yHCd//kk5DvKcdyeUkKEwxNDRanAp+ekTW68J3XcYgKaPC9sNDhVTDH1zrywTvtEz5zWHEvXjQow== +"@aws-sdk/signature-v4@^3.370.0": + version "3.374.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.374.0.tgz#bd727f4c392acb81bc667aa4cfceeba608250771" + integrity sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ== dependencies: - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@smithy/signature-v4" "^1.0.1" + tslib "^2.5.0" + +"@aws-sdk/smithy-client@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.186.0.tgz#67514544fb55d7eff46300e1e73311625cf6f916" + integrity sha512-rdAxSFGSnrSprVJ6i1BXi65r4X14cuya6fYe8dSdgmFSa+U2ZevT97lb3tSINCUxBGeMXhENIzbVGkRZuMh+DQ== + dependencies: + "@aws-sdk/middleware-stack" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/smithy-client@3.6.1": version "3.6.1" @@ -1868,20 +2073,40 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/types@3.40.0", "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.4.1": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.40.0.tgz#a9d7926fcb9b699bc46be975033559d2293e60d1" - integrity sha512-KpILcfvRaL88TLvo3SY4OuCCg90SvcNLPyjDwUuBqiOyWODjrKShHtAPJzej4CLp92lofh+ul0UnBfV9Jb/5PA== +"@aws-sdk/token-providers@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.370.0.tgz#e5229f2d116887c90ec103e024583be05c1f506c" + integrity sha512-EyR2ZYr+lJeRiZU2/eLR+mlYU9RXLQvNyGFSAekJKgN13Rpq/h0syzXVFLP/RSod/oZenh/fhVZ2HwlZxuGBtQ== + dependencies: + "@aws-sdk/client-sso-oidc" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + +"@aws-sdk/types@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.186.0.tgz#f6fb6997b6a364f399288bfd5cd494bc680ac922" + integrity sha512-NatmSU37U+XauMFJCdFI6nougC20JUFZar+ump5wVv0i54H+2Refg1YbFDxSs0FY28TSB9jfhWIpfFBmXgL5MQ== + +"@aws-sdk/types@3.370.0", "@aws-sdk/types@^3.222.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.370.0.tgz#79e0e4927529c957b5c5c2a00f7590a76784a5e4" + integrity sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ== + dependencies: + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/types@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.6.1.tgz#00686db69e998b521fcd4a5f81ef0960980f80c4" integrity sha512-4Dx3eRTrUHLxhFdLJL8zdNGzVsJfAxtxPYYGmIddUkO2Gj3WA1TGjdfG4XN/ClI6e1XonCHafQX3UYO/mgnH3g== -"@aws-sdk/types@^1.0.0-alpha.0": - version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-1.0.0-rc.10.tgz#729127fbfac5da1a3368ffe6ec2e90acc9ad69c3" - integrity sha512-9gwhYnkTNuYZ+etCtM4T8gjpZ0SWSXbzQxY34UjSS+dt3C/UnbX0J22tMahp/9Z1yCa9pihtXrkD+nO2xn7nVQ== +"@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.4.1": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.40.0.tgz#a9d7926fcb9b699bc46be975033559d2293e60d1" + integrity sha512-KpILcfvRaL88TLvo3SY4OuCCg90SvcNLPyjDwUuBqiOyWODjrKShHtAPJzej4CLp92lofh+ul0UnBfV9Jb/5PA== "@aws-sdk/url-parser-native@3.6.1": version "3.6.1" @@ -1893,14 +2118,14 @@ tslib "^1.8.0" url "^0.11.0" -"@aws-sdk/url-parser@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.40.0.tgz#9ccd00a2026605d5eaef630e94b6632cc9598ec3" - integrity sha512-HwNV+HX7bHgLk5FzTOgdXANsC0SeVz5PMC4Nh+TLz2IoeQnrw4H8dsA4YNonncjern5oC5veKRjQeOoCL5SlSQ== +"@aws-sdk/url-parser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.186.0.tgz#e42f845cd405c1920fdbdcc796a350d4ace16ae9" + integrity sha512-jfdJkKqJZp8qjjwEjIGDqbqTuajBsddw02f86WiL8bPqD8W13/hdqbG4Fpwc+Bm6GwR6/4MY6xWXFnk8jDUKeA== dependencies: - "@aws-sdk/querystring-parser" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/querystring-parser" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" "@aws-sdk/url-parser@3.6.1": version "3.6.1" @@ -1911,34 +2136,20 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/util-arn-parser@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.6.1.tgz#aa60b1bfa752ad3fa331f22fea4f703b741d1d6d" - integrity sha512-NFdYeuhaSrgnBG6Pt3zHNU7QwvhHq6sKUTWZShUayLMJYYbQr6IjmYVlPST4c84b+lyDoK68y/Zga621VfIdBg== - dependencies: - tslib "^1.8.0" - -"@aws-sdk/util-arn-parser@^3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz#56b6ae4699c3140bb27dcede5146876fef04e823" - integrity sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA== +"@aws-sdk/util-arn-parser@^3.310.0": + version "3.310.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz#861ff8810851be52a320ec9e4786f15b5fc74fba" + integrity sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA== dependencies: - tslib "^2.3.1" + tslib "^2.5.0" -"@aws-sdk/util-arn-parser@^3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.55.0.tgz#6672eb2975e798a460bedfaf6b5618d4e4b262e1" - integrity sha512-76KJxp4MRWufHYWys7DFl64znr5yeJ3AIQNAPCKKw1sP0hzO7p6Kx0PaJnw9x+CPSzOrT4NbuApL6/srYhKDGg== +"@aws-sdk/util-base64-browser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.186.0.tgz#0310482752163fa819718ce9ea9250836b20346d" + integrity sha512-TpQL8opoFfzTwUDxKeon/vuc83kGXpYqjl6hR8WzmHoQgmFfdFlV+0KXZOohra1001OP3FhqvMqaYbO8p9vXVQ== dependencies: tslib "^2.3.1" -"@aws-sdk/util-base64-browser@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.37.0.tgz#4bf105de91e5e17ded644557dac6851c30e992d2" - integrity sha512-o4s/rHVm5k8eC/T7grJQINyYA/mKfDmEWKMA9wk5iBroXlI2rUm7x649TBk5hzoddufk/mffEeNz/1wM7yTmlg== - dependencies: - tslib "^2.3.0" - "@aws-sdk/util-base64-browser@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.6.1.tgz#eddea1311b41037fc3fddd889d3e0a9882363215" @@ -1946,13 +2157,13 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/util-base64-node@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-3.37.0.tgz#81ff164d227db8faeb910af33ff5f861269d6d67" - integrity sha512-1UPxly1GPrGZtlIWvbNCDIAund4Oyp8cFi9neA43TeNACvrmEQu/nG01pDbOoo0ENoVSVJrNAVBeqKEpqjH2GA== +"@aws-sdk/util-base64-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-3.186.0.tgz#500bd04b1ef7a6a5c0a2d11c0957a415922e05c7" + integrity sha512-wH5Y/EQNBfGS4VkkmiMyZXU+Ak6VCoFM1GKWopV+sj03zR2D4FHexi4SxWwEBMpZCd6foMtihhbNBuPA5fnh6w== dependencies: - "@aws-sdk/util-buffer-from" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/util-buffer-from" "3.186.0" + tslib "^2.3.1" "@aws-sdk/util-base64-node@3.6.1": version "3.6.1" @@ -1962,12 +2173,12 @@ "@aws-sdk/util-buffer-from" "3.6.1" tslib "^1.8.0" -"@aws-sdk/util-body-length-browser@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.37.0.tgz#2e3a375ac191a9bacd40a6b3479ee402dcb5769d" - integrity sha512-tClmH1uYelqWT43xxmnOsVFbCQJiIwizp6y4E109G2LIof07inxrO0L8nbwBpjhugVplx6NZr9IaqTFqbdM1gA== +"@aws-sdk/util-body-length-browser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.186.0.tgz#a898eda9f874f6974a9c5c60fcc76bcb6beac820" + integrity sha512-zKtjkI/dkj9oGkjo+7fIz+I9KuHrVt1ROAeL4OmDESS8UZi3/O8uMDFMuCp8jft6H+WFuYH6qRVWAVwXMiasXw== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" "@aws-sdk/util-body-length-browser@3.6.1": version "3.6.1" @@ -1976,12 +2187,12 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/util-body-length-node@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.37.0.tgz#d6170dafd351799687d583f818a4a3924b61cbec" - integrity sha512-aY3mXdbEajruRi9CHgq/heM89R+Gectj/Xrs1naewmamaN8NJrvjDm3s+cw//lqqSOW903LYHXDgm7wvCzUnFA== +"@aws-sdk/util-body-length-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.186.0.tgz#95efbacbd13cb739b942c126c5d16ecf6712d4db" + integrity sha512-U7Ii8u8Wvu9EnBWKKeuwkdrWto3c0j7LG677Spe6vtwWkvY70n9WGfiKHTgBpVeLNv8jvfcx5+H0UOPQK1o9SQ== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" "@aws-sdk/util-body-length-node@3.6.1": version "3.6.1" @@ -1990,13 +2201,13 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/util-buffer-from@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.37.0.tgz#298d4a925b9f0ca23f99617648cd9fb3896b573c" - integrity sha512-aa3SBwjLwImuJoE4+hxDIWQ9REz3UFb3p7KFPe9qopdXb/yB12RTcbrXVb4whUux4i4mO6KRij0ZNjFZrjrKPg== +"@aws-sdk/util-buffer-from@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.186.0.tgz#01f7edb683d2f40374d0ca8ef2d16346dc8040a1" + integrity sha512-be2GCk2lsLWg/2V5Y+S4/9pOMXhOQo4DR4dIqBdR2R+jrMMHN9Xsr5QrkT6chcqLaJ/SBlwiAEEi3StMRmCOXA== dependencies: - "@aws-sdk/is-array-buffer" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/is-array-buffer" "3.186.0" + tslib "^2.3.1" "@aws-sdk/util-buffer-from@3.6.1": version "3.6.1" @@ -2006,46 +2217,57 @@ "@aws-sdk/is-array-buffer" "3.6.1" tslib "^1.8.0" -"@aws-sdk/util-config-provider@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.40.0.tgz#acefff264d6650450a1f8b056a63830a454b756d" - integrity sha512-NjZGrA4mqhpr6gkVCAUweurP0Z9d3vFyXJCtulC0BFbpKAnKCf/crSK56NwUaNhAEMCkSuBvjRFzkbfT+HO8bA== +"@aws-sdk/util-config-provider@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.186.0.tgz#52ce3711edceadfac1b75fccc7c615e90c33fb2f" + integrity sha512-71Qwu/PN02XsRLApyxG0EUy/NxWh/CXxtl2C7qY14t+KTiRapwbDkdJ1cMsqYqghYP4BwJoj1M+EFMQSSlkZQQ== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" -"@aws-sdk/util-create-request@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-create-request/-/util-create-request-3.6.1.tgz#ecc4364551c7b3d0d9834ca3f56528fb8b083838" - integrity sha512-jR1U8WpwXl+xZ9ThS42Jr5MXuegQ7QioHsZjQn3V5pbm8CXTkBF0B2BcULQu/2G1XtHOJb8qUZQlk/REoaORfQ== +"@aws-sdk/util-credentials@^3.56.0": + version "3.56.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-credentials/-/util-credentials-3.56.0.tgz#b2ea97a5e90a95c91ea05a103417fecb036e2728" + integrity sha512-haKqXtEm5dNQx4NBe8mOiBtxTDQkjMfvayECrMbVo6WaFmL13/k+reVkfGM5ux9EXCYeqHCJI244LogUyEaBXA== dependencies: - "@aws-sdk/middleware-stack" "3.6.1" - "@aws-sdk/smithy-client" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/shared-ini-file-loader" "3.56.0" + tslib "^2.3.1" -"@aws-sdk/util-credentials@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-credentials/-/util-credentials-3.37.0.tgz#76261c3d7c20bee5d28e5c17741adf19558b3b67" - integrity sha512-zcLhSZDKgBLhUjSU5HoQpuQiP3v8oE86NmV/tiZVPEaO6YVULEAB2Cfj1hpM/b/JXWzjSHfT06KXT7QUODKS+A== +"@aws-sdk/util-defaults-mode-browser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.186.0.tgz#d30b2f572e273d7d98287274c37c9ee00b493507" + integrity sha512-U8GOfIdQ0dZ7RRVpPynGteAHx4URtEh+JfWHHVfS6xLPthPHWTbyRhkQX++K/F8Jk+T5U8Anrrqlea4TlcO2DA== dependencies: - "@aws-sdk/shared-ini-file-loader" "3.37.0" - tslib "^2.3.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/types" "3.186.0" + bowser "^2.11.0" + tslib "^2.3.1" -"@aws-sdk/util-format-url@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.6.1.tgz#a011444aed0c47698d65095bcce95d7b4716324b" - integrity sha512-FvhcXcqLyJ0j0WdlmGs7PtjCCv8NaY4zBuXYO2iwAmqoy2SIZXQL63uAvmilqWj25q47ASAsUwSFLReCCfMklQ== +"@aws-sdk/util-defaults-mode-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.186.0.tgz#8572453ba910fd2ab08d2cfee130ce5a0db83ba7" + integrity sha512-N6O5bpwCiE4z8y7SPHd7KYlszmNOYREa+mMgtOIXRU3VXSEHVKVWTZsHKvNTTHpW0qMqtgIvjvXCo3vsch5l3A== dependencies: - "@aws-sdk/querystring-builder" "3.6.1" - "@aws-sdk/types" "3.6.1" - tslib "^1.8.0" + "@aws-sdk/config-resolver" "3.186.0" + "@aws-sdk/credential-provider-imds" "3.186.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/property-provider" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" -"@aws-sdk/util-hex-encoding@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.37.0.tgz#40ce21b5ff682e811e98ac7476692ee55ae61493" - integrity sha512-tn5UpfaeM+rZWqynoNqB8lwtcAXil5YYO3HLGH9himpWAdft/2Z7LK6bsYDpctaAI1WHgMDcL0bw3Id04ZUbhA== +"@aws-sdk/util-endpoints@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.370.0.tgz#bf1f4653c3afc89d4e79aa4895dd3dffbb56c930" + integrity sha512-5ltVAnM79nRlywwzZN5i8Jp4tk245OCGkKwwXbnDU+gq7zT3CIOsct1wNZvmpfZEPGt/bv7/NyRcjP+7XNsX/g== dependencies: - tslib "^2.3.0" + "@aws-sdk/types" "3.370.0" + tslib "^2.5.0" + +"@aws-sdk/util-hex-encoding@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.186.0.tgz#7ed58b923997c6265f4dce60c8704237edb98895" + integrity sha512-UL9rdgIZz1E/jpAfaKH8QgUxNK9VP5JPgoR0bSiaefMjnsoBh0x/VVMsfUyziOoJCMLebhJzFowtwrSKEGsxNg== + dependencies: + tslib "^2.3.1" "@aws-sdk/util-hex-encoding@3.6.1": version "3.6.1" @@ -2061,12 +2283,19 @@ dependencies: tslib "^2.3.0" -"@aws-sdk/util-uri-escape@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.37.0.tgz#42b8393a51dcc04f228e70d1c94c2fe38a738994" - integrity sha512-8pKf4YJTELP5lm/CEgYw2atyJBB1RWWqFa0sZx6YJmTlOtLF5G6raUdAi4iDa2hldGt2B6IAdIIyuusT8zeU8Q== +"@aws-sdk/util-middleware@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.186.0.tgz#ba2e286b206cbead306b6d2564f9d0495f384b40" + integrity sha512-fddwDgXtnHyL9mEZ4s1tBBsKnVQHqTUmFbZKUUKPrg9CxOh0Y/zZxEa5Olg/8dS/LzM1tvg0ATkcyd4/kEHIhg== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" + +"@aws-sdk/util-uri-escape@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.186.0.tgz#1752a93dfe58ec88196edb6929806807fd8986da" + integrity sha512-imtOrJFpIZAipAg8VmRqYwv1G/x4xzyoxOJ48ZSn1/ZGnKEEnB6n6E9gwYRebi4mlRuMSVeZwCPLq0ey5hReeQ== + dependencies: + tslib "^2.3.1" "@aws-sdk/util-uri-escape@3.6.1": version "3.6.1" @@ -2075,14 +2304,24 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/util-user-agent-browser@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.40.0.tgz#d9f4f49af35895df260598a333a8b792b56e9f76" - integrity sha512-C69sTI26bV2EprTv3DTXu9XP7kD9Wu4YVPBzqztOYArd2GDYw3w+jS8SEg3XRbjAKY/mOPZ2Thw4StjpZlWZiA== +"@aws-sdk/util-user-agent-browser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.186.0.tgz#02e214887d30a69176c6a6c2d6903ce774b013b4" + integrity sha512-fbRcTTutMk4YXY3A2LePI4jWSIeHOT8DaYavpc/9Xshz/WH9RTGMmokeVOcClRNBeDSi5cELPJJ7gx6SFD3ZlQ== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.186.0" bowser "^2.11.0" - tslib "^2.3.0" + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-browser@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.370.0.tgz#df144f5f1a65578842b79d49555c754a531d85f0" + integrity sha512-028LxYZMQ0DANKhW+AKFQslkScZUeYlPmSphrCIXgdIItRZh6ZJHGzE7J/jDsEntZOrZJsjI4z0zZ5W2idj04w== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/types" "^1.1.0" + bowser "^2.11.0" + tslib "^2.5.0" "@aws-sdk/util-user-agent-browser@3.6.1": version "3.6.1" @@ -2093,14 +2332,24 @@ bowser "^2.11.0" tslib "^1.8.0" -"@aws-sdk/util-user-agent-node@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.40.0.tgz#76240a4ee05e409ad1267854761c53e746e9bcdf" - integrity sha512-cjIzd0hRZFTTh7iLJD6Bciu++Em1iaM1clyG02xRl0JD5DEtDSR1zO02uu+AeM7GSLGOxIvwOkK2j8ySPAOmBA== +"@aws-sdk/util-user-agent-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.186.0.tgz#1ef74973442c8650c7b64ff2fd15cf3c09d8c004" + integrity sha512-oWZR7hN6NtOgnT6fUvHaafgbipQc2xJCRB93XHiF9aZGptGNLJzznIOP7uURdn0bTnF73ejbUXWLQIm8/6ue6w== dependencies: - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" + "@aws-sdk/node-config-provider" "3.186.0" + "@aws-sdk/types" "3.186.0" + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-node@3.370.0": + version "3.370.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.370.0.tgz#96d8420b42cbebd498de8b94886340d11c97a34b" + integrity sha512-33vxZUp8vxTT/DGYIR3PivQm07sSRGWI+4fCv63Rt7Q++fO24E0kQtmVAlikRY810I10poD6rwILVtITtFSzkg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" "@aws-sdk/util-user-agent-node@3.6.1": version "3.6.1" @@ -2111,12 +2360,12 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/util-utf8-browser@3.37.0", "@aws-sdk/util-utf8-browser@^3.0.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.37.0.tgz#d896899f4c475ceeaf8b77c5d7cdc453e5fe6b83" - integrity sha512-tuiOxzfqet1kKGYzlgpMGfhr64AHJnYsFx2jZiH/O6Yq8XQg43ryjQlbJlim/K/XHGNzY0R+nabeJg34q3Ua1g== +"@aws-sdk/util-utf8-browser@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.186.0.tgz#5fee6385cfc3effa2be704edc2998abfd6633082" + integrity sha512-n+IdFYF/4qT2WxhMOCeig8LndDggaYHw3BJJtfIBZRiS16lgwcGYvOUmhCkn0aSlG1f/eyg9YZHQG0iz9eLdHQ== dependencies: - tslib "^2.3.0" + tslib "^2.3.1" "@aws-sdk/util-utf8-browser@3.6.1": version "3.6.1" @@ -2125,21 +2374,21 @@ dependencies: tslib "^1.8.0" -"@aws-sdk/util-utf8-browser@^1.0.0-alpha.0": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-rc.8.tgz#bf1f1cfed8c024f43a7c43b643fdf2b4523b5973" - integrity sha512-clncPMJ23rxCIkZ9LoUC8SowwZGxWyN2TwRb0XvW/Cv9EavkRgRCOrCpneGyC326lqtMKx36onnpaSRHxErUYw== - dependencies: - tslib "^1.8.0" - -"@aws-sdk/util-utf8-node@3.37.0": +"@aws-sdk/util-utf8-browser@^3.0.0": version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.37.0.tgz#300912cce55d72c18213190237d6ab943e17b5bf" - integrity sha512-fUAgd7UTCULL36j9/vnXHxVhxvswnq23mYgTCIT8NQ7wHN30q2a89ym1e9DwGeQkJEBOkOcKLn6nsMsN7YQMDQ== + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.37.0.tgz#d896899f4c475ceeaf8b77c5d7cdc453e5fe6b83" + integrity sha512-tuiOxzfqet1kKGYzlgpMGfhr64AHJnYsFx2jZiH/O6Yq8XQg43ryjQlbJlim/K/XHGNzY0R+nabeJg34q3Ua1g== dependencies: - "@aws-sdk/util-buffer-from" "3.37.0" tslib "^2.3.0" +"@aws-sdk/util-utf8-node@3.186.0": + version "3.186.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.186.0.tgz#722d9b0f5675ae2e9d79cf67322126d9c9d8d3d8" + integrity sha512-7qlE0dOVdjuRbZTb7HFywnHHCrsN7AeQiTnsWT63mjXGDbPeUWQQw3TrdI20um3cxZXnKoeudGq8K6zbXyQ4iA== + dependencies: + "@aws-sdk/util-buffer-from" "3.186.0" + tslib "^2.3.1" + "@aws-sdk/util-utf8-node@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.6.1.tgz#18534c2069b61f5739ee4cdc70060c9f4b4c4c4f" @@ -2148,15 +2397,6 @@ "@aws-sdk/util-buffer-from" "3.6.1" tslib "^1.8.0" -"@aws-sdk/util-waiter@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.40.0.tgz#91c537efc9d0129fb24d9bdab86acbfd797ddf1f" - integrity sha512-jdxwNEZdID49ZvyAnxaeNm5w2moIfMLOwj/q6TxKlxYoXMs16FQWkhyfGue0vEASzchS49ewbyt+KBqpT31Ebg== - dependencies: - "@aws-sdk/abort-controller" "3.40.0" - "@aws-sdk/types" "3.40.0" - tslib "^2.3.0" - "@aws-sdk/util-waiter@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.6.1.tgz#5c66c2da33ff98468726fefddc2ca7ac3352c17d" @@ -2166,13 +2406,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/xml-builder@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.6.1.tgz#d85d7db5e8e30ba74de93ddf0cf6197e6e4b15ea" - integrity sha512-+HOCH4a0XO+I09okd0xdVP5Q5c9ZsEsDvnogiOcBQxoMivWhPUCo9pjXP3buCvVKP2oDHXQplBKSjGHvGaKFdg== - dependencies: - tslib "^1.8.0" - "@babel/code-frame@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -4412,10 +4645,10 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== -"@cypress/request@^2.88.10": - version "2.88.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== +"@cypress/request@^2.88.10", "@cypress/request@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.0.tgz#7f58dfda087615ed4e6aab1b25fffe7630d6dd85" + integrity sha512-GKFCqwZwMYmL3IBoNeR2MM1SnxRIGERsQOTWeQKoYBt2JLqcqiy7JXqO894FLrpjZYqGxW92MNwRH2BN56obdQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -4430,9 +4663,9 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.5.2" + qs "~6.10.3" safe-buffer "^5.1.2" - tough-cookie "~2.5.0" + tough-cookie "^4.1.3" tunnel-agent "^0.6.0" uuid "^8.3.2" @@ -6281,78 +6514,405 @@ resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== dependencies: - "@rollup/pluginutils" "^3.0.8" - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.14.2" + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/plugin-replace@^2.3.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@shelf/jest-dynamodb@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@shelf/jest-dynamodb/-/jest-dynamodb-2.1.0.tgz#6dc1c40e5fdb47b03382189bb916ed6ec24287a0" + integrity sha512-+rCXcJGBIBTv4uC8ZH++eICya9zsfC0ssTKYycB+db3/3ZcPnXWSlnuSOcfuJISEwXwGaYkAmnffxeITD5Tplw== + dependencies: + cwd "0.10.0" + debug "4.1.1" + dynamodb-local "0.0.31" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@smithy/abort-controller@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-1.0.2.tgz#74caac052ecea15c5460438272ad8d43a6ccbc53" + integrity sha512-tb2h0b+JvMee+eAxTmhnyqyNk51UXIK949HnE14lFeezKsVJTB30maan+CO2IMwnig2wVYQH84B5qk6ylmKCuA== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/config-resolver@^1.0.1", "@smithy/config-resolver@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-1.0.2.tgz#d4f556a44292b41b5c067662a4bd5049dea40e35" + integrity sha512-8Bk7CgnVKg1dn5TgnjwPz2ebhxeR7CjGs5yhVYH3S8x0q8yPZZVWwpRIglwXaf5AZBzJlNO1lh+lUhMf2e73zQ== + dependencies: + "@smithy/types" "^1.1.1" + "@smithy/util-config-provider" "^1.0.2" + "@smithy/util-middleware" "^1.0.2" + tslib "^2.5.0" + +"@smithy/credential-provider-imds@^1.0.1", "@smithy/credential-provider-imds@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.2.tgz#7aa797c0d95448eb3dccb988b40e62db8989576f" + integrity sha512-fLjCya+JOu2gPJpCiwSUyoLvT8JdNJmOaTOkKYBZoGf7CzqR6lluSyI+eboZnl/V0xqcfcqBG4tgqCISmWS3/w== + dependencies: + "@smithy/node-config-provider" "^1.0.2" + "@smithy/property-provider" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/url-parser" "^1.0.2" + tslib "^2.5.0" + +"@smithy/eventstream-codec@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-1.0.2.tgz#06d1b6e2510cb2475a39b3a20b0c75e751917c59" + integrity sha512-eW/XPiLauR1VAgHKxhVvgvHzLROUgTtqat2lgljztbH8uIYWugv7Nz+SgCavB+hWRazv2iYgqrSy74GvxXq/rg== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@smithy/types" "^1.1.1" + "@smithy/util-hex-encoding" "^1.0.2" + tslib "^2.5.0" + +"@smithy/fetch-http-handler@^1.0.1", "@smithy/fetch-http-handler@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.2.tgz#4186ee6451de22e867f43c05236dcff43eca6e91" + integrity sha512-kynyofLf62LvR8yYphPPdyHb8fWG3LepFinM/vWUTG2Q1pVpmPCM530ppagp3+q2p+7Ox0UvSqldbKqV/d1BpA== + dependencies: + "@smithy/protocol-http" "^1.1.1" + "@smithy/querystring-builder" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/util-base64" "^1.0.2" + tslib "^2.5.0" + +"@smithy/hash-node@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-1.0.2.tgz#dc65203a348d29e45c493ead3e772e4f7dfb5bc0" + integrity sha512-K6PKhcUNrJXtcesyzhIvNlU7drfIU7u+EMQuGmPw6RQDAg/ufUcfKHz4EcUhFAodUmN+rrejhRG9U6wxjeBOQA== + dependencies: + "@smithy/types" "^1.1.1" + "@smithy/util-buffer-from" "^1.0.2" + "@smithy/util-utf8" "^1.0.2" + tslib "^2.5.0" + +"@smithy/invalid-dependency@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-1.0.2.tgz#0a9d82d1a14e5bdbdc0bd2cef5f457c85a942920" + integrity sha512-B1Y3Tsa6dfC+Vvb+BJMhTHOfFieeYzY9jWQSTR1vMwKkxsymD0OIAnEw8rD/RiDj/4E4RPGFdx9Mdgnyd6Bv5Q== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/is-array-buffer@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-1.0.2.tgz#224702a2364d698f0a36ecb2c240c0c9541ecfb6" + integrity sha512-pkyBnsBRpe+c/6ASavqIMRBdRtZNJEVJOEzhpxZ9JoAXiZYbkfaSMRA/O1dUxGdJ653GHONunnZ4xMo/LJ7utQ== + dependencies: + tslib "^2.5.0" + +"@smithy/middleware-content-length@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-1.0.2.tgz#63099f8d01b3419b65e21cfd07b0c2ef47d1f473" + integrity sha512-pa1/SgGIrSmnEr2c9Apw7CdU4l/HW0fK3+LKFCPDYJrzM0JdYpqjQzgxi31P00eAkL0EFBccpus/p1n2GF9urw== + dependencies: + "@smithy/protocol-http" "^1.1.1" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/middleware-endpoint@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.3.tgz#ff4b1c0a83eb8d8b8d3937f434a95efbbf43e1cd" + integrity sha512-GsWvTXMFjSgl617PCE2km//kIjjtvMRrR2GAuRDIS9sHiLwmkS46VWaVYy+XE7ubEsEtzZ5yK2e8TKDR6Qr5Lw== + dependencies: + "@smithy/middleware-serde" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/url-parser" "^1.0.2" + "@smithy/util-middleware" "^1.0.2" + tslib "^2.5.0" + +"@smithy/middleware-retry@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-1.0.4.tgz#8e9de0713dac7f7af405477d46bd4525ca7b9ea8" + integrity sha512-G7uRXGFL8c3F7APnoIMTtNAHH8vT4F2qVnAWGAZaervjupaUQuRRHYBLYubK0dWzOZz86BtAXKieJ5p+Ni2Xpg== + dependencies: + "@smithy/protocol-http" "^1.1.1" + "@smithy/service-error-classification" "^1.0.3" + "@smithy/types" "^1.1.1" + "@smithy/util-middleware" "^1.0.2" + "@smithy/util-retry" "^1.0.4" + tslib "^2.5.0" + uuid "^8.3.2" + +"@smithy/middleware-serde@^1.0.1", "@smithy/middleware-serde@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-1.0.2.tgz#87b3a0211602ae991d9b756893eb6bf2e3e5f711" + integrity sha512-T4PcdMZF4xme6koUNfjmSZ1MLi7eoFeYCtodQNQpBNsS77TuJt1A6kt5kP/qxrTvfZHyFlj0AubACoaUqgzPeg== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/middleware-stack@^1.0.1", "@smithy/middleware-stack@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-1.0.2.tgz#d241082bf3cb315c749dda57e233039a9aed804e" + integrity sha512-H7/uAQEcmO+eDqweEFMJ5YrIpsBwmrXSP6HIIbtxKJSQpAcMGY7KrR2FZgZBi1FMnSUOh+rQrbOyj5HQmSeUBA== + dependencies: + tslib "^2.5.0" + +"@smithy/node-config-provider@^1.0.1", "@smithy/node-config-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-1.0.2.tgz#2d391b96a9e10072e7e0a3698427400f4ef17ec4" + integrity sha512-HU7afWpTToU0wL6KseGDR2zojeyjECQfr8LpjAIeHCYIW7r360ABFf4EaplaJRMVoC3hD9FeltgI3/NtShOqCg== + dependencies: + "@smithy/property-provider" "^1.0.2" + "@smithy/shared-ini-file-loader" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/node-http-handler@^1.0.2", "@smithy/node-http-handler@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-1.0.3.tgz#89b556ca2bdcce7a994a9da1ea265094d76d4791" + integrity sha512-PcPUSzTbIb60VCJCiH0PU0E6bwIekttsIEf5Aoo/M0oTfiqsxHTn0Rcij6QoH6qJy6piGKXzLSegspXg5+Kq6g== + dependencies: + "@smithy/abort-controller" "^1.0.2" + "@smithy/protocol-http" "^1.1.1" + "@smithy/querystring-builder" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/property-provider@^1.0.1", "@smithy/property-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-1.0.2.tgz#f99f104cbd6576c9aca9f56cb72819b4a65208e1" + integrity sha512-pXDPyzKX8opzt38B205kDgaxda6LHcTfPvTYQZnwP6BAPp1o9puiCPjeUtkKck7Z6IbpXCPUmUQnzkUzWTA42Q== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/protocol-http@^1.1.0", "@smithy/protocol-http@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-1.1.1.tgz#10977cf71631eed4f5ad1845408920238d52cdba" + integrity sha512-mFLFa2sSvlUxm55U7B4YCIsJJIMkA6lHxwwqOaBkral1qxFz97rGffP/mmd4JDuin1EnygiO5eNJGgudiUgmDQ== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/querystring-builder@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-1.0.2.tgz#ce861f6cbd14792c83aa19b4967a19923bd0706e" + integrity sha512-6P/xANWrtJhMzTPUR87AbXwSBuz1SDHIfL44TFd/GT3hj6rA+IEv7rftEpPjayUiWRocaNnrCPLvmP31mobOyA== + dependencies: + "@smithy/types" "^1.1.1" + "@smithy/util-uri-escape" "^1.0.2" + tslib "^2.5.0" + +"@smithy/querystring-parser@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-1.0.2.tgz#559d09c46b21e6fbda71e95deda4bcd8a46bdecc" + integrity sha512-IWxwxjn+KHWRRRB+K2Ngl+plTwo2WSgc2w+DvLy0DQZJh9UGOpw40d6q97/63GBlXIt4TEt5NbcFrO30CKlrsA== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/service-error-classification@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-1.0.3.tgz#c620c1562610d3351985eb6dd04262ca2657ae67" + integrity sha512-2eglIYqrtcUnuI71yweu7rSfCgt6kVvRVf0C72VUqrd0LrV1M0BM0eYN+nitp2CHPSdmMI96pi+dU9U/UqAMSA== + +"@smithy/shared-ini-file-loader@^1.0.1", "@smithy/shared-ini-file-loader@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.2.tgz#c6e79991d87925bd18e0adae00c97da6c8ecae1e" + integrity sha512-bdQj95VN+lCXki+P3EsDyrkpeLn8xDYiOISBGnUG/AGPYJXN8dmp4EhRRR7XOoLoSs8anZHR4UcGEOzFv2jwGw== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/signature-v4@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-1.0.2.tgz#3a7b10ac66c337b404aa061e5f268f0550729680" + integrity sha512-rpKUhmCuPmpV5dloUkOb9w1oBnJatvKQEjIHGmkjRGZnC3437MTdzWej9TxkagcZ8NRRJavYnEUixzxM1amFig== + dependencies: + "@smithy/eventstream-codec" "^1.0.2" + "@smithy/is-array-buffer" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/util-hex-encoding" "^1.0.2" + "@smithy/util-middleware" "^1.0.2" + "@smithy/util-uri-escape" "^1.0.2" + "@smithy/util-utf8" "^1.0.2" + tslib "^2.5.0" + +"@smithy/smithy-client@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-1.0.4.tgz#96d03d123d117a637c679a79bb8eae96e3857bd9" + integrity sha512-gpo0Xl5Nyp9sgymEfpt7oa9P2q/GlM3VmQIdm+FeH0QEdYOQx3OtvwVmBYAMv2FIPWxkMZlsPYRTnEiBTK5TYg== + dependencies: + "@smithy/middleware-stack" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/util-stream" "^1.0.2" + tslib "^2.5.0" + +"@smithy/types@^1.1.0", "@smithy/types@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-1.1.1.tgz#949394a22e13e7077471bae0d18c146e5f62c456" + integrity sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g== + dependencies: + tslib "^2.5.0" + +"@smithy/url-parser@^1.0.1", "@smithy/url-parser@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-1.0.2.tgz#fb59be6f2283399443d9e7afe08ebf63b3c266bb" + integrity sha512-0JRsDMQe53F6EHRWksdcavKDRjyqp8vrjakg8EcCUOa7PaFRRB1SO/xGZdzSlW1RSTWQDEksFMTCEcVEKmAoqA== + dependencies: + "@smithy/querystring-parser" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/util-base64@^1.0.1", "@smithy/util-base64@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-1.0.2.tgz#6cdd5a9356dafad3c531123c12cd77d674762da0" + integrity sha512-BCm15WILJ3SL93nusoxvJGMVfAMWHZhdeDZPtpAaskozuexd0eF6szdz4kbXaKp38bFCSenA6bkUHqaE3KK0dA== + dependencies: + "@smithy/util-buffer-from" "^1.0.2" + tslib "^2.5.0" + +"@smithy/util-body-length-browser@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.2.tgz#4a9a49497634b5f25ab5ff73f1a8498010b0024a" + integrity sha512-Xh8L06H2anF5BHjSYTg8hx+Itcbf4SQZnVMl4PIkCOsKtneMJoGjPRLy17lEzfoh/GOaa0QxgCP6lRMQWzNl4w== + dependencies: + tslib "^2.5.0" + +"@smithy/util-body-length-node@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-1.0.2.tgz#bc4969022f7d9ffcb239d626d80a85138e986df6" + integrity sha512-nXHbZsUtvZeyfL4Ceds9nmy2Uh2AhWXohG4vWHyjSdmT8cXZlJdmJgnH6SJKDjyUecbu+BpKeVvSrA4cWPSOPA== + dependencies: + tslib "^2.5.0" -"@rollup/plugin-replace@^2.3.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== +"@smithy/util-buffer-from@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-1.0.2.tgz#27e19573d721962bd2443f23d4edadb8206b2cb5" + integrity sha512-lHAYIyrBO9RANrPvccnPjU03MJnWZ66wWuC5GjWWQVfsmPwU6m00aakZkzHdUT6tGCkGacXSgArP5wgTgA+oCw== dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" + "@smithy/is-array-buffer" "^1.0.2" + tslib "^2.5.0" -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== +"@smithy/util-config-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-1.0.2.tgz#4d2e867df1cc7b4010d1278bd5767ce1b679dae9" + integrity sha512-HOdmDm+3HUbuYPBABLLHtn8ittuRyy+BSjKOA169H+EMc+IozipvXDydf+gKBRAxUa4dtKQkLraypwppzi+PRw== dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" + tslib "^2.5.0" -"@shelf/jest-dynamodb@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shelf/jest-dynamodb/-/jest-dynamodb-2.1.0.tgz#6dc1c40e5fdb47b03382189bb916ed6ec24287a0" - integrity sha512-+rCXcJGBIBTv4uC8ZH++eICya9zsfC0ssTKYycB+db3/3ZcPnXWSlnuSOcfuJISEwXwGaYkAmnffxeITD5Tplw== +"@smithy/util-defaults-mode-browser@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.2.tgz#31ad7b9bce7e38fd57f4a370ee416373b4fbd432" + integrity sha512-J1u2PO235zxY7dg0+ZqaG96tFg4ehJZ7isGK1pCBEA072qxNPwIpDzUVGnLJkHZvjWEGA8rxIauDtXfB0qxeAg== dependencies: - cwd "0.10.0" - debug "4.1.1" - dynamodb-local "0.0.31" + "@smithy/property-provider" "^1.0.2" + "@smithy/types" "^1.1.1" + bowser "^2.11.0" + tslib "^2.5.0" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@smithy/util-defaults-mode-node@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.2.tgz#b295fe2a18568c1e21a85b6557e2b769452b4d95" + integrity sha512-9/BN63rlIsFStvI+AvljMh873Xw6bbI6b19b+PVYXyycQ2DDQImWcjnzRlHW7eP65CCUNGQ6otDLNdBQCgMXqg== + dependencies: + "@smithy/config-resolver" "^1.0.2" + "@smithy/credential-provider-imds" "^1.0.2" + "@smithy/node-config-provider" "^1.0.2" + "@smithy/property-provider" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@smithy/util-hex-encoding@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.2.tgz#5b9f2162f2a59b2d2aa39992bd2c7f65b6616ab6" + integrity sha512-Bxydb5rMJorMV6AuDDMOxro3BMDdIwtbQKHpwvQFASkmr52BnpDsWlxgpJi8Iq7nk1Bt4E40oE1Isy/7ubHGzg== dependencies: - type-detect "4.0.8" + tslib "^2.5.0" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@smithy/util-middleware@^1.0.1", "@smithy/util-middleware@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-1.0.2.tgz#c3d4c7a6cd31bde33901e54abd7700c8ca73dab3" + integrity sha512-vtXK7GOR2BoseCX8NCGe9SaiZrm9M2lm/RVexFGyPuafTtry9Vyv7hq/vw8ifd/G/pSJ+msByfJVb1642oQHKw== dependencies: - "@sinonjs/commons" "^1.7.0" + tslib "^2.5.0" -"@sinonjs/formatio@^3.2.1": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" - integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== +"@smithy/util-retry@^1.0.3", "@smithy/util-retry@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-1.0.4.tgz#9d95df3884981414163d5f780d38e3529384d9ad" + integrity sha512-RnZPVFvRoqdj2EbroDo3OsnnQU8eQ4AlnZTOGusbYKybH3269CFdrZfZJloe60AQjX7di3J6t/79PjwCLO5Khw== dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" + "@smithy/service-error-classification" "^1.0.3" + tslib "^2.5.0" -"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== +"@smithy/util-stream@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-1.0.2.tgz#2d33aa5168e51d1dd7937c32a09c8334d2da44d9" + integrity sha512-qyN2M9QFMTz4UCHi6GnBfLOGYKxQZD01Ga6nzaXFFC51HP/QmArU72e4kY50Z/EtW8binPxspP2TAsGbwy9l3A== + dependencies: + "@smithy/fetch-http-handler" "^1.0.2" + "@smithy/node-http-handler" "^1.0.3" + "@smithy/types" "^1.1.1" + "@smithy/util-base64" "^1.0.2" + "@smithy/util-buffer-from" "^1.0.2" + "@smithy/util-hex-encoding" "^1.0.2" + "@smithy/util-utf8" "^1.0.2" + tslib "^2.5.0" + +"@smithy/util-uri-escape@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-1.0.2.tgz#c69a5423c9baa7a045a79372320bd40a437ac756" + integrity sha512-k8C0BFNS9HpBMHSgUDnWb1JlCQcFG+PPlVBq9keP4Nfwv6a9Q0yAfASWqUCtzjuMj1hXeLhn/5ADP6JxnID1Pg== dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" + tslib "^2.5.0" -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@smithy/util-utf8@^1.0.1", "@smithy/util-utf8@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-1.0.2.tgz#b34c27b4efbe4f0edb6560b6d4f743088302671f" + integrity sha512-V4cyjKfJlARui0dMBfWJMQAmJzoW77i4N3EjkH/bwnE2Ngbl4tqD2Y0C/xzpzY/J1BdxeCKxAebVFk8aFCaSCw== + dependencies: + "@smithy/util-buffer-from" "^1.0.2" + tslib "^2.5.0" + +"@smithy/util-waiter@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-1.0.2.tgz#3b1498a2d4b92e78eafacc8c76f314e30eb7a5e9" + integrity sha512-+jq4/Vd9ejPzR45qwYSePyjQbqYP9QqtyZYsFVyfzRnbGGC0AjswOh7txcxroafuEBExK4qE+L/QZA8wWXsJYw== + dependencies: + "@smithy/abort-controller" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" "@storybook/addon-actions@6.5.14", "@storybook/addon-actions@^6.5.14": version "6.5.14" @@ -7454,6 +8014,31 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@turf/boolean-clockwise@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/boolean-clockwise/-/boolean-clockwise-6.5.0.tgz#34573ecc18f900080f00e4ff364631a8b1135794" + integrity sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/invariant" "^6.5.0" + +"@turf/helpers@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" + integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== + +"@turf/invariant@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/invariant/-/invariant-6.5.0.tgz#970afc988023e39c7ccab2341bd06979ddc7463f" + integrity sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg== + dependencies: + "@turf/helpers" "^6.5.0" + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -7931,6 +8516,14 @@ dependencies: "@types/node" "*" +"@types/node-fetch@2.6.4": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node-fetch@^2.5.7", "@types/node-fetch@^2.5.8": version "2.5.12" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" @@ -8853,13 +9446,20 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" @@ -8951,13 +9551,13 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -amazon-cognito-identity-js@5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-5.2.4.tgz#9b0168a59bd1b933e89b560840f1c50902b87269" - integrity sha512-CTRG5LKBfMYmNrqAU0l7X0SA4OOXsPFdHmkW0Ky3NOZZo767W5GZecm5uPz3YyAVde1OHaUyLXYzhXEmnn+VcQ== +amazon-cognito-identity-js@6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.1.tgz#d9a4c1a92f4b059330df8ea075f65106d2605409" + integrity sha512-PxBdufgS8uZShrcIFAsRjmqNXsh/4fXOWUGQOUhKLHWWK1pcp/y+VeFF48avXIWefM8XwsT3JlN6m9J2eHt4LA== dependencies: + "@aws-crypto/sha256-js" "1.2.2" buffer "4.9.2" - crypto-js "^4.1.1" fast-base64-decode "^1.0.0" isomorphic-unfetch "^3.0.0" js-cookie "^2.2.1" @@ -9232,11 +9832,6 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -9359,7 +9954,7 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -ast-types@^0.13.2: +ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== @@ -9474,47 +10069,48 @@ await-spawn@^4.0.2: dependencies: bl "^4.0.3" -aws-amplify@^4.3.12: - version "4.3.12" - resolved "https://registry.yarnpkg.com/aws-amplify/-/aws-amplify-4.3.12.tgz#f30ab3e9d0bdd8621d681eb0a4ac76940ff78500" - integrity sha512-WA7m3yin3bdhZFt1B1BiQkzaFrsa73mHvCVXy74r2HXCTqrxm0p2WxdXihL3SHuVSJwo72r4ps+K6H3GSc42Wg== - dependencies: - "@aws-amplify/analytics" "5.1.10" - "@aws-amplify/api" "4.0.30" - "@aws-amplify/auth" "4.3.20" - "@aws-amplify/cache" "4.0.32" - "@aws-amplify/core" "4.3.12" - "@aws-amplify/datastore" "3.7.4" - "@aws-amplify/geo" "1.1.12" - "@aws-amplify/interactions" "4.0.30" - "@aws-amplify/predictions" "4.0.30" - "@aws-amplify/pubsub" "4.2.6" - "@aws-amplify/storage" "4.4.13" - "@aws-amplify/ui" "2.0.5" - "@aws-amplify/xr" "3.0.30" - -aws-cdk-lib@2.70.0: - version "2.70.0" - resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.70.0.tgz#207422bf8766caf56c76956f9f2263cdbe97ef67" - integrity sha512-q/Go/3VERycIMJp3LfVtjRCLnIJHXJ0gfev5qM5yPyuvoDgZaKuaGA54T0IebgXDyZzS6We3j/DhuP/nPR8sPw== - dependencies: - "@aws-cdk/asset-awscli-v1" "^2.2.97" - "@aws-cdk/asset-kubectl-v20" "^2.1.1" - "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.77" +aws-amplify@^5.3.5: + version "5.3.5" + resolved "https://registry.yarnpkg.com/aws-amplify/-/aws-amplify-5.3.5.tgz#0290a740fd9e55e475b31fb834887f9f98d326f6" + integrity sha512-3xUJqHdQMoyOYDlq6K1z1kXQnlsOx0cN/R4WpfcbGBeiixsxEpxTk+OGQijOQwE1CIOJ4OXPCNz5m2yRofTTyw== + dependencies: + "@aws-amplify/analytics" "6.4.1" + "@aws-amplify/api" "5.3.5" + "@aws-amplify/auth" "5.5.5" + "@aws-amplify/cache" "5.1.5" + "@aws-amplify/core" "5.7.0" + "@aws-amplify/datastore" "4.6.5" + "@aws-amplify/geo" "2.2.0" + "@aws-amplify/interactions" "5.2.5" + "@aws-amplify/notifications" "1.5.0" + "@aws-amplify/predictions" "5.4.5" + "@aws-amplify/pubsub" "5.4.1" + "@aws-amplify/storage" "5.8.0" + tslib "^2.0.0" + +aws-cdk-lib@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.88.0.tgz#72d165cb7dc168c5fa3b22caaacd8d33364866fc" + integrity sha512-bmhokh30HVeqlotWaoEmK7mKB9SJbJwpbsiVgmYe3JcMu8DposHQqaIPI7LnC+dg015tZaxUsExxOYBEw+vntQ== + dependencies: + "@aws-cdk/asset-awscli-v1" "^2.2.200" + "@aws-cdk/asset-kubectl-v20" "^2.1.2" + "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.165" "@balena/dockerignore" "^1.0.2" case "1.6.3" - fs-extra "^9.1.0" + fs-extra "^11.1.1" ignore "^5.2.4" jsonschema "^1.4.1" minimatch "^3.1.2" punycode "^2.3.0" - semver "^7.3.8" + semver "^7.5.4" + table "^6.8.1" yaml "1.10.2" -aws-cdk@2.70.0: - version "2.70.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.70.0.tgz#95377f7ddc8f5a0a625f5feb15e610b32b70e3cf" - integrity sha512-B12e+h8FNNS2BGgBKzKrU541shC/9CWeC1Z/CwX2NKxPgbeP2eGtgR1hCfT/VaotcfJ8+dSd4I32nNNc+wz+QA== +aws-cdk@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.88.0.tgz#2e1adfa0d13145c44ff8a81705d962e861bf29f1" + integrity sha512-7Tj0uusA2nsEOsqkd4kB5vmzciz7l/eGBN5a+Ce4/CCcoe4ZCvT85L+T6tK0aohUTLZTAlTPBceH34RN5iMYpA== optionalDependencies: fsevents "2.3.2" @@ -9552,7 +10148,7 @@ aws-northstar@^1.3.10: use-debounce "^7.0.0" uuid "^8.3.2" -aws-sdk@^2.1329.0, aws-sdk@^2.1358.0: +aws-sdk@^2.1358.0: version "2.1358.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1358.0.tgz#86996622bc6c6ca6aed460273a168d6aeea27086" integrity sha512-ZolqFlnm0mDNgub7FGrVi7r5A1rw+58zZziKhlis3IxOtIpHdx4BQU5pH4htAMuD0Ct557p/dC/wmnZH/1Rc9Q== @@ -9568,6 +10164,22 @@ aws-sdk@^2.1329.0, aws-sdk@^2.1358.0: uuid "8.0.0" xml2js "0.5.0" +aws-sdk@^2.1417.0: + version "2.1420.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1420.0.tgz#ae49a7b8e54fbcd72bfdd4a94473ccf25ca8c984" + integrity sha512-BvGzkKGgOXNj9WAeazvOLu48sCbU52mKLGIY5AjBKX4EuY8APcKKvl1R54kdUoJDnMwv0HwQpGvrVvLTDdOv/A== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + util "^0.12.4" + uuid "8.0.0" + xml2js "0.5.0" + aws-sdk@^2.865.0: version "2.1036.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1036.0.tgz#47f0d0a38b5bfbd4a7a382a6756a6aa7af627aad" @@ -9641,13 +10253,6 @@ axe-core@^4.3.5: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== -axios@0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@0.24.0, axios@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" @@ -9655,6 +10260,13 @@ axios@0.24.0, axios@^0.24.0: dependencies: follow-redirects "^1.14.4" +axios@0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" + integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== + dependencies: + follow-redirects "^1.14.8" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -9936,6 +10548,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-64@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" + integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== + base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -9954,6 +10571,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + batch-processor@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" @@ -10385,7 +11007,7 @@ buffer@4.9.2, buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -10682,20 +11304,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001280: - version "1.0.30001283" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" - integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== - -caniuse-lite@^1.0.30001286: - version "1.0.30001286" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" - integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== - -caniuse-lite@^1.0.30001400: - version "1.0.30001436" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" - integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001280, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001400: + version "1.0.30001482" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz" + integrity sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ== capture-exit@^2.0.0: version "2.0.0" @@ -10734,15 +11346,15 @@ ccount@^2.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -cdk-assets@2.70.0: - version "2.70.0" - resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-2.70.0.tgz#c5047358326f9f63994bce7377e26216fd019650" - integrity sha512-Qk1tXJ7GwfgNbnK/v8wF075a/2K+ZSd3GChq8N61+0dcClf62Yg0BCJmVXfTSEqbD1nGAKcztMvqFgCNIKVU/g== +cdk-assets@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-2.88.0.tgz#300290fb98369f459467e40eed45ce3875b621b7" + integrity sha512-qt5rfsG2Ek7V9GH2z7epF4y0MOLt+Z/2n4ApbgQweLaq5bwptiIfkos5mAA0z+gOcd080yqvsZGPQKytTdlx+A== dependencies: - "@aws-cdk/cloud-assembly-schema" "2.70.0" - "@aws-cdk/cx-api" "2.70.0" + "@aws-cdk/cloud-assembly-schema" "2.88.0" + "@aws-cdk/cx-api" "2.88.0" archiver "^5.3.1" - aws-sdk "^2.1329.0" + aws-sdk "^2.1417.0" glob "^7.2.3" mime "^2.6.0" yargs "^16.2.0" @@ -11917,11 +12529,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-js@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== - crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -12403,10 +13010,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-uri-to-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" + integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== data-urls@^2.0.0: version "2.0.0" @@ -12629,15 +13236,14 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -degenerator@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b" - integrity sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ== +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: - ast-types "^0.13.2" - escodegen "^1.8.1" - esprima "^4.0.0" - vm2 "^3.9.3" + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" del@^4.1.1: version "4.1.1" @@ -12778,11 +13384,6 @@ diff-sequences@^27.0.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -13695,27 +14296,26 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -14098,7 +14698,7 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -14513,17 +15113,19 @@ fast-url-parser@1.1.3: dependencies: punycode "^1.3.2" -fast-xml-parser@3.19.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz#cb637ec3f3999f51406dd8ff0e6fc4d83e520d01" - integrity sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg== +fast-xml-parser@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz#a6747a09296a6cb34f2ae634019bf1738f3b421f" + integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== + dependencies: + strnum "^1.0.5" -fast-xml-parser@^3.16.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz#152a1d51d445380f7046b304672dd55d15c9e736" - integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg== +fast-xml-parser@^4.2.5: + version "4.2.6" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.6.tgz#30ad37b014c16e31eec0e01fbf90a85cedb4eacf" + integrity sha512-Xo1qV++h/Y3Ng8dphjahnYe+rGHaaNdsYOBWL9Y9GCPKpNKilJtilvWkLcI9f9X2DoKTLsZsGYAls5+JL5jfLA== dependencies: - strnum "^1.0.4" + strnum "^1.0.5" fastify-warning@^0.2.0: version "0.2.0" @@ -14570,6 +15172,11 @@ fetch-retry@^5.0.2: resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.3.tgz#edfa3641892995f9afee94f25b168827aa97fe3d" integrity sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw== +fflate@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.3.tgz#288b034ff0e9c380eaa2feff48c787b8371b7fa5" + integrity sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw== + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -14624,11 +15231,6 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - filesize@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" @@ -14847,7 +15449,7 @@ folder-hash@^4.0.1: graceful-fs "~4.2.0" minimatch "~3.0.4" -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.4, follow-redirects@^1.14.8: +follow-redirects@^1.0.0, follow-redirects@^1.14.4, follow-redirects@^1.14.8: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -15032,6 +15634,15 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -15117,14 +15728,6 @@ fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ== - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -15275,17 +15878,15 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-uri@3: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== +get-uri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" + integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" + basic-ftp "^5.0.2" + data-uri-to-buffer "^5.0.1" + debug "^4.3.4" fs-extra "^8.1.0" - ftp "^0.3.10" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -16229,7 +16830,7 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: +http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== @@ -16247,6 +16848,14 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http-proxy-middleware@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" @@ -16294,14 +16903,6 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@5: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -16310,6 +16911,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" + integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -16658,6 +17267,11 @@ ip@^1.1.0, ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +ip@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" @@ -18459,11 +19073,6 @@ just-diff@^5.0.1: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.0.3.tgz#4c9c514dec5526b25ab977590e3c39a0cf271554" integrity sha512-a8p80xcpJ6sdurk5PxDKb4mav9MeKjA3zFKZpCWBIfvg8mznfnmb13MKZvlrwJ+Lhis0wM3uGAzE0ArhFHvIcg== -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== - jwa@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" @@ -19077,18 +19686,6 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== -lolex@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" - integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== - -lolex@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" - longest-streak@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" @@ -19161,6 +19758,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.13.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" @@ -20632,7 +21234,7 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== -netmask@^2.0.1: +netmask@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== @@ -20652,17 +21254,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" - integrity sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ== - dependencies: - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^5.0.1" - path-to-regexp "^1.7.0" - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -21653,29 +22244,28 @@ p-waterfall@^2.1.1: dependencies: p-reduce "^2.0.0" -pac-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e" - integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ== +pac-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz#db42120c64292685dafaf2bd921e223c56bfb13b" + integrity sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA== dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - get-uri "3" - http-proxy-agent "^4.0.1" - https-proxy-agent "5" - pac-resolver "^5.0.0" - raw-body "^2.2.0" - socks-proxy-agent "5" + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.1" -pac-resolver@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.0.tgz#1d717a127b3d7a9407a16d6e1b012b13b9ba8dc0" - integrity sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA== +pac-resolver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" + integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== dependencies: - degenerator "^3.0.1" - ip "^1.1.5" - netmask "^2.0.1" + degenerator "^5.0.0" + ip "^1.1.8" + netmask "^2.0.2" package-hash@^4.0.0: version "4.0.0" @@ -21724,10 +22314,10 @@ pacote@^13.0.3, pacote@^13.0.5, pacote@^13.6.1: ssri "^9.0.0" tar "^6.1.11" -paho-mqtt@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/paho-mqtt/-/paho-mqtt-1.1.0.tgz#8c10e29eb162e966fb15188d965c3dce505de9d9" - integrity sha512-KPbL9KAB0ASvhSDbOrZBaccXS+/s7/LIofbPyERww8hM5Ko71GUJQ6Nmg0BWqj8phAIT8zdf/Sd/RftHU9i2HA== +pako@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== pako@~1.0.5: version "1.0.11" @@ -23188,26 +23778,26 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b" - integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g== +proxy-agent@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" + integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== dependencies: - agent-base "^6.0.0" - debug "4" - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^5.0.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^5.0.0" + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.1" proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -23229,7 +23819,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -23341,7 +23931,7 @@ qrcode@^1.4.4: pngjs "^5.0.0" yargs "^15.3.1" -qs@6.11.0, qs@6.7.0, qs@^6.10.0, qs@^6.7.3, qs@~6.5.2: +qs@6.11.0, qs@6.7.0, qs@^6.10.0, qs@^6.7.3, qs@~6.10.3, qs@~6.5.2: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -23460,7 +24050,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.1, raw-body@^2.2.0: +raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -23735,6 +24325,13 @@ react-native-get-random-values@^1.4.0: dependencies: fast-base64-decode "^1.0.0" +react-native-url-polyfill@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-native-url-polyfill/-/react-native-url-polyfill-1.3.0.tgz#c1763de0f2a8c22cc3e959b654c8790622b6ef6a" + integrity sha512-w9JfSkvpqqlix9UjDvJjm1EjSt652zVQ6iwCIj1cVVkwXf4jQhQgTNXY6EVTwuAmUjg6BC6k9RHCBynoLFo3IQ== + dependencies: + whatwg-url-without-unicode "8.0.0-3" + react-query@^3.29.0: version "3.33.7" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.33.7.tgz#6ab1b2cb39e2e925a4fc44e8a269c7691e7eb2f3" @@ -24129,16 +24726,6 @@ read@1, read@^1.0.4, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -25136,9 +25723,9 @@ semver-diff@^3.1.1: semver "^6.3.0" "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@7.0.0: version "7.0.0" @@ -25150,38 +25737,17 @@ semver@7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@7.3.4, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.0.0, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== send@0.18.0: version "0.18.0" @@ -25434,19 +26000,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sinon@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" - integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== - dependencies: - "@sinonjs/commons" "^1.4.0" - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.3" - diff "^3.5.0" - lolex "^4.2.0" - nise "^1.5.2" - supports-color "^5.5.0" - sirv@^1.0.7: version "1.0.18" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.18.tgz#105fab52fb656ce8a2bebbf36b11052005952899" @@ -25558,7 +26111,7 @@ sockjs@^0.3.21: uuid "^3.4.0" websocket-driver "^0.7.4" -socks-proxy-agent@5, socks-proxy-agent@^5.0.0: +socks-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== @@ -25585,6 +26138,15 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" +socks-proxy-agent@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" + integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== + dependencies: + agent-base "^7.0.1" + debug "^4.3.4" + socks "^2.7.1" + socks@^2.3.3, socks@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" @@ -25601,6 +26163,14 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" +socks@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + sonic-boom@^1.0.2: version "1.4.1" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" @@ -26253,10 +26823,10 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strnum@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.4.tgz#e97e36a7d6ba9f93d0d6b496b2ed0678d422832b" - integrity sha512-lMzNMfDpaQOLt4B2mEbfzYS0+T7dvCXeojnlGf6f1AygvWDMcWyXYaLbyICfjVu29sErR8fnRagQfBW/N/hGgw== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== strong-log-transformer@^2.1.0: version "2.1.0" @@ -26763,22 +27333,15 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@^2.0.0, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^2.0.0, tough-cookie@^4.0.0, tough-cookie@^4.1.3, tough-cookie@~2.5.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^2.1.0: version "2.1.0" @@ -26965,6 +27528,11 @@ tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + tslib@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" @@ -27138,6 +27706,11 @@ typescript@4.3.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.2.tgz#891e1a90c5189d8506af64b9ef929fca99ba1ee5" + integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw== + typescript@^3.8.3: version "3.9.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" @@ -27441,11 +28014,16 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -27591,10 +28169,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== +url-parse@^1.4.3, url-parse@^1.5.3, url-parse@^1.5.9: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -27607,7 +28185,7 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" -url@^0.11.0: +url@0.11.0, url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= @@ -27714,6 +28292,11 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@3.4.0, uuid@^3.0.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" @@ -27724,11 +28307,6 @@ uuid@8.3.2, uuid@^8.2.0, uuid@^8.3.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^3.0.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uvu@^0.5.0: version "0.5.4" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.4.tgz#5a37482ade580b7d817569e0b2c013712857293c" @@ -27901,7 +28479,7 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vm2@^3.9.17, vm2@^3.9.3: +vm2@^3.9.17: version "3.9.17" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.17.tgz#251b165ff8a0e034942b5181057305e39570aeab" integrity sha512-AqwtCnZ/ERcX+AVj9vUsphY56YANXxRuqMb7GsDtAr0m0PcQX3u0Aj3KWiXM0YAHy7i6JEeHrwOnwXbGYgRpAw== @@ -28277,6 +28855,15 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url-without-unicode@8.0.0-3: + version "8.0.0-3" + resolved "https://registry.yarnpkg.com/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b" + integrity sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig== + dependencies: + buffer "^5.4.3" + punycode "^2.1.1" + webidl-conversions "^5.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -28358,14 +28945,14 @@ widest-line@^3.1.0: string-width "^4.0.0" word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== workbox-background-sync@^5.1.4: version "5.1.4" @@ -28688,11 +29275,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"