diff --git a/.github/workflows/PR-validation.yml b/.github/workflows/PR-validation.yml index 97540100..9967feec 100644 --- a/.github/workflows/PR-validation.yml +++ b/.github/workflows/PR-validation.yml @@ -115,6 +115,114 @@ jobs: name: webui_deps_lock path: webui/package-lock.json if-no-files-found: error + shared-aws-infra-update-dependency-lock-files: + name: shared_aws_infra update and upload dependency lock file + runs-on: ubuntu-22.04 + defaults: + run: + shell: bash + working-directory: ./shared_aws_infra/ + steps: + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Check out repository code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + shared_aws_infra/ + - name: Update lock files + if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-deps-lock-updates') }} + shell: bash + run: | + make pip-tools update-deps-lock update-test-deps-lock + - name: Upload updated (main) lock file as artifact + uses: actions/upload-artifact@v4 + with: + name: shared_aws_infra_deps_lock + path: shared_aws_infra/requirements.txt + if-no-files-found: error + - name: Upload updated (test) lock file as artifact + uses: actions/upload-artifact@v4 + with: + name: shared_aws_infra_test_deps_lock + path: shared_aws_infra/tests/requirements.txt + if-no-files-found: error + shared-aws-infra-code-checks: + name: shared_aws_infra code checks + needs: + - shared-aws-infra-update-dependency-lock-files + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: ./shared_aws_infra + steps: + - name: Check out repository code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + shared_aws_infra/ + - name: Download updated shared_aws_infra (main) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_deps_lock + path: shared_aws_infra + - name: Download updated shared_aws_infra (test) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_test_deps_lock + path: shared_aws_infra/tests + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Code typing test + run: | + make run-type-checks + - name: Code style test + run: | + make run-style-checks + - name: Unit tests + run: make run-unit-tests + shared-aws-infra-package-build: + name: shared_aws_infra python package build + needs: + - shared-aws-infra-code-checks + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: ./shared_aws_infra + steps: + - name: Check out repository code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + shared_aws_infra/ + - name: Download updated shared_aws_infra (main) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_deps_lock + path: shared_aws_infra + - name: Download updated shared_aws_infra (test) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_test_deps_lock + path: shared_aws_infra/tests + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Build package + run: | + make clean build + - name: Upload package as artifact + uses: actions/upload-artifact@v4 + with: + name: shared_aws_infra_package + path: shared_aws_infra/dist/pavi_shared_aws_infra-0.0.0-py3-none-any.whl pipeline-aws-infra-update-dependency-lock-files: name: pipeline/aws_infra update and upload dependency lock file needs: @@ -197,13 +305,15 @@ jobs: name: api_aws_infra_tests_deps_lock path: api/aws_infra/tests/requirements.txt if-no-files-found: error - shared-aws-infra-update-dependency-lock-files: - name: shared_aws_infra update and upload dependency lock file + webui-aws-infra-update-dependency-lock-files: + name: webui/aws_infra update and upload dependency lock file + needs: + - shared-aws-infra-package-build runs-on: ubuntu-22.04 defaults: run: shell: bash - working-directory: ./shared_aws_infra/ + working-directory: ./webui/aws_infra/ steps: - uses: actions/setup-python@v5 with: @@ -213,7 +323,12 @@ jobs: with: fetch-depth: 0 sparse-checkout: | - shared_aws_infra/ + webui/aws_infra/ + - name: Download shared AWS infra package + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_package + path: /tmp/ - name: Update lock files if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-deps-lock-updates') }} shell: bash @@ -222,89 +337,15 @@ jobs: - name: Upload updated (main) lock file as artifact uses: actions/upload-artifact@v4 with: - name: shared_aws_infra_deps_lock - path: shared_aws_infra/requirements.txt + name: webui_aws_infra_deps_lock + path: webui/aws_infra/requirements.txt if-no-files-found: error - name: Upload updated (test) lock file as artifact uses: actions/upload-artifact@v4 with: - name: shared_aws_infra_test_deps_lock - path: shared_aws_infra/tests/requirements.txt + name: webui_aws_infra_tests_deps_lock + path: webui/aws_infra/tests/requirements.txt if-no-files-found: error - shared-aws-infra-code-checks: - name: shared_aws_infra code checks - needs: - - shared-aws-infra-update-dependency-lock-files - runs-on: ubuntu-22.04 - defaults: - run: - working-directory: ./shared_aws_infra - steps: - - name: Check out repository code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - sparse-checkout: | - shared_aws_infra/ - - name: Download updated shared_aws_infra (main) dependencies lock file - uses: actions/download-artifact@v4 - with: - name: shared_aws_infra_deps_lock - path: shared_aws_infra - - name: Download updated shared_aws_infra (test) dependencies lock file - uses: actions/download-artifact@v4 - with: - name: shared_aws_infra_test_deps_lock - path: shared_aws_infra/tests - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - name: Code typing test - run: | - make run-type-checks - - name: Code style test - run: | - make run-style-checks - - name: Unit tests - run: make run-unit-tests - shared-aws-infra-package-build: - name: shared_aws_infra python package build - needs: - - shared-aws-infra-code-checks - runs-on: ubuntu-22.04 - defaults: - run: - working-directory: ./shared_aws_infra - steps: - - name: Check out repository code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - sparse-checkout: | - shared_aws_infra/ - - name: Download updated shared_aws_infra (main) dependencies lock file - uses: actions/download-artifact@v4 - with: - name: shared_aws_infra_deps_lock - path: shared_aws_infra - - name: Download updated shared_aws_infra (test) dependencies lock file - uses: actions/download-artifact@v4 - with: - name: shared_aws_infra_test_deps_lock - path: shared_aws_infra/tests - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - name: Build package - run: | - make build - - name: Upload package as artifact - uses: actions/upload-artifact@v4 - with: - name: shared_aws_infra_package - path: shared_aws_infra/dist/pavi_shared_aws_infra-0.0.0-py3-none-any.whl pipeline-seq-retrieval-container-image-build: name: pipeline/seq_retrieval container-image build needs: @@ -806,6 +847,65 @@ jobs: aws-region: us-east-1 - name: Validate production CDK stack code run: make validate-all + webui-aws-infra-code-checks: + name: webui/aws_infra code checks + needs: + - webui-aws-infra-update-dependency-lock-files + - shared-aws-infra-package-build + permissions: + id-token: write # This is required for requesting the JWT for gaining permissions to assume the IAM role to perform AWS actions + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: ./webui/aws_infra + steps: + - name: Check out repository code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + webui/aws_infra/ + - name: Download updated webui/aws_infra (main) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: webui_aws_infra_deps_lock + path: webui/aws_infra + - name: Download updated webui/aws_infra (test) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: webui_aws_infra_tests_deps_lock + path: webui/aws_infra/tests + - name: Download shared AWS infra package + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_package + path: /tmp/ + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Code typing test + run: | + make run-type-checks + - name: Code style test + run: | + make run-style-checks + - name: Setup node.js (CDK requirement) + uses: actions/setup-node@v4 + with: + node-version: "18" + - name: Install CDK CLI + run: npm install -g aws-cdk + - name: Install CDK stack dependencies + run: pip install -r requirements.txt + - name: AWS credentials configuration + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{secrets.GH_ACTIONS_AWS_ROLE}} + role-session-name: gh-actions-${{github.run_id}}.${{github.run_number}}.${{github.run_attempt}}-cdk-test + aws-region: us-east-1 + - name: Validate production CDK stack code + run: make validate-all webui-code-checks: name: webUI code checks needs: @@ -870,19 +970,21 @@ jobs: runs-on: ubuntu-22.04 #Only commit updated lock files on successfull validation (to prevent PR cluttering) needs: - - pipeline-seq-retrieval-update-dependency-lock-files - - pipeline-seq-retrieval-code-checks - shared-aws-infra-update-dependency-lock-files - shared-aws-infra-package-build - - pipeline-aws-infra-update-dependency-lock-files - - pipeline-aws-infra-code-checks - - pipeline-workflow-integration-testing - api-aws-infra-update-dependency-lock-files - api-aws-infra-code-checks + - pipeline-aws-infra-update-dependency-lock-files + - pipeline-aws-infra-code-checks + - webui-aws-infra-update-dependency-lock-files + - webui-aws-infra-code-checks - api-update-dependency-lock-files - api-container-integration-testing - api-unit-integration-testing - api-code-checks + - pipeline-seq-retrieval-update-dependency-lock-files + - pipeline-seq-retrieval-code-checks + - pipeline-workflow-integration-testing - webui-update-dependency-lock-files - webui-code-checks - webui-container-image-build @@ -892,6 +994,7 @@ jobs: - uses: actions/checkout@v4 with: ref: ${{ github.head_ref }} + fetch-depth: 0 - name: Download updated seq_retrieval (main) dependencies lock file uses: actions/download-artifact@v4 with: @@ -942,14 +1045,46 @@ jobs: with: name: api_aws_infra_tests_deps_lock path: api/aws_infra/tests + - name: Download updated webui/aws_infra (main) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: webui_aws_infra_deps_lock + path: webui/aws_infra + - name: Download updated webui/aws_infra (test) dependencies lock file + uses: actions/download-artifact@v4 + with: + name: webui_aws_infra_tests_deps_lock + path: webui/aws_infra/tests - name: Download updated webui dependencies lock file uses: actions/download-artifact@v4 with: name: webui_deps_lock path: webui - # Commit all changed dependency lock files back to the open PR - - uses: stefanzweifel/git-auto-commit-action@v5 + # Independent shared_aws_infra lock files commit required to pin hash representing the package + # to be included in depending aws_infra components' lock files. + - name: commit shared_aws_infra dependency lock file changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: Auto-updated pavi_shared_aws_infra deps lock files + file_pattern: 'shared_aws_infra/requirements.txt shared_aws_infra/tests/requirements.txt' + disable_globbing: true + # Build pavi_shared_aws_infra package (to ensure hash includes latest commit date) + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Build and install the pavi_shared_aws_infra package + working-directory: ./shared_aws_infra + run: | + make clean build install + - name: Update pavi_shared_aws_infra dependencies + run: | + make -C api/aws_infra/ pip-tools update-deps-lock-shared-aws-infra-only update-test-deps-lock-shared-aws-infra-only + make -C pipeline/aws_infra/ pip-tools update-deps-lock-shared-aws-infra-only update-test-deps-lock-shared-aws-infra-only + make -C webui/aws_infra/ pip-tools update-deps-lock-shared-aws-infra-only update-test-deps-lock-shared-aws-infra-only + - name: commit remaining dependency lock file changes + uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Auto-updated deps lock files - file_pattern: '*requirements.txt' + file_pattern: '*requirements.txt *package-lock.json' disable_globbing: true diff --git a/.github/workflows/main-build-and-deploy.yml b/.github/workflows/main-build-and-deploy.yml index 58e08777..993dea2a 100644 --- a/.github/workflows/main-build-and-deploy.yml +++ b/.github/workflows/main-build-and-deploy.yml @@ -78,7 +78,7 @@ jobs: aws-region: us-east-1 - name: CDK validations (resource assertions and cdk diff) run: make validate - - name: cdk deploy + - name: Deploy CDK Stack run: make deploy ADD_CDK_ARGS="--require-approval never" api-deploy-image-repo: name: Deploy/update container image repository stack for API @@ -117,8 +117,47 @@ jobs: aws-region: us-east-1 - name: CDK validations (resource assertions and cdk diff) run: make validate-image-stack - - name: cdk deploy - run: cdk deploy PaviApiImageRepoCdkStack --require-approval never + - name: Deploy CDK stack + run: make deploy-image-stack ADD_CDK_ARGS="--require-approval never" + webui-deploy-image-repo: + name: Deploy/update container image repository stack for API + needs: [shared-aws-infra-package-build] + permissions: + id-token: write # This is required for requesting the JWT for gaining permissions to assume the IAM role to perform AWS actions + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: webui/aws_infra + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Setup node.js (CDK requirement) + uses: actions/setup-node@v4 + with: + node-version: "18" + - name: Install CDK + run: npm install -g aws-cdk + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Download shared AWS infra package + uses: actions/download-artifact@v4 + with: + name: shared_aws_infra_package + path: /tmp/ + - name: Install CDK stack dependencies + run: pip install -r requirements.txt + - name: AWS credentials configuration + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{secrets.GH_ACTIONS_AWS_ROLE}} + role-session-name: gh-actions-${{github.run_id}}.${{github.run_number}}.${{github.run_attempt}}-cdk-deploy + aws-region: us-east-1 + - name: CDK validations (resource assertions and cdk diff) + run: make validate-image-stack + - name: Deploy CDK stack + run: make deploy-image-stack ADD_CDK_ARGS="--require-approval never" pipeline-seq-retrieval-build-and-push-docker-image: needs: [on-merge-and-deploy, pipeline-deploy-aws-infra] permissions: @@ -211,7 +250,7 @@ jobs: uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: ${{secrets.GH_ACTIONS_AWS_ROLE}} - role-session-name: gh-actions-${{github.run_id}}.${{github.run_number}}.${{github.run_attempt}}-build-image-pipeline-seq-retrieval + role-session-name: gh-actions-${{github.run_id}}.${{github.run_number}}.${{github.run_attempt}}-build-image-api aws-region: us-east-1 - name: Amazon ECR login id: login-ecr @@ -226,6 +265,40 @@ jobs: ${{ steps.login-ecr.outputs.registry }}/agr_pavi/api:${{ env.tagname }} ${{ steps.login-ecr.outputs.registry }}/agr_pavi/api:${{ github.event.pull_request.base.ref }} platforms: linux/amd64 + webui-build-and-push-docker-image: + needs: [on-merge-and-deploy, webui-deploy-image-repo] + permissions: + id-token: write # This is required for requesting the JWT for gaining permissions to assume the IAM role to perform AWS actions + runs-on: ubuntu-22.04 + steps: + - name: Check out repository code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Store release tag in env + shell: bash + run: | + echo "tagname=$(git describe --tags)" >> $GITHUB_ENV + # This step will configure environment variables to be used by all steps + # involving AWS interaction further down + - name: AWS credentials configuration + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{secrets.GH_ACTIONS_AWS_ROLE}} + role-session-name: gh-actions-${{github.run_id}}.${{github.run_number}}.${{github.run_attempt}}-build-image-webui + aws-region: us-east-1 + - name: Amazon ECR login + id: login-ecr + uses: aws-actions/amazon-ecr-login@v2 + - name: Build and push container image + uses: docker/build-push-action@v5 + with: + context: ./webui/ + push: true + tags: | + ${{ steps.login-ecr.outputs.registry }}/agr_pavi/webui:${{ env.tagname }} + ${{ steps.login-ecr.outputs.registry }}/agr_pavi/webui:${{ github.event.pull_request.base.ref }} + platforms: linux/amd64 api-deploy-application: name: Deploy application (version) for API needs: @@ -278,4 +351,4 @@ jobs: run: make deploy-application PAVI_DEPLOY_VERSION_LABEL="${{ env.tagname }}" ADD_CDK_ARGS="--require-approval never" - name: Deploy to main environment run: make deploy-environment PAVI_DEPLOY_VERSION_LABEL="${{ env.tagname }}" PAVI_IMAGE_TAG="${{ env.tagname }}" \ - DEPLOY_ENVIRONMENT=PaviApiEbMainStack ADD_CDK_ARGS="--require-approval never" + EB_ENV_CDK_STACK_NAME=PaviApiEbMainStack ADD_CDK_ARGS="--require-approval never" diff --git a/api/Makefile b/api/Makefile index 2a5163bf..c64d5b68 100644 --- a/api/Makefile +++ b/api/Makefile @@ -1,8 +1,9 @@ CONTAINER_NAME=agr_pavi/api TAG_NAME?=latest ADDITIONAL_BUILD_ARGS= +EXTRA_PIP_COMPILE_ARGS ?= -.PHONY: check-venv-active pip-tools +.PHONY: check-% clean install-% pip-tools run-% update-% _vars-% _write-lock-file clean: $(eval ADDITIONAL_BUILD_ARGS := --no-cache) @@ -53,16 +54,28 @@ pip-tools: pip install pip-tools==7.4.1 requirements.txt: - pip-compile --generate-hashes --no-strip-extras -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" tests/requirements.txt: - pip-compile --generate-hashes --no-strip-extras --extra=test -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-deps-lock: - pip-compile --generate-hashes --no-strip-extras --upgrade -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-test-deps-lock: - pip-compile --generate-hashes --no-strip-extras --extra=test --upgrade -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" install-deps: requirements.txt pip install -r requirements.txt @@ -90,3 +103,18 @@ run-integration-test-container: install-test-deps python -m pytest tests/b_integration \ || (echo "Container logs:" && docker logs agr.pavi.dev-local.api.server && exit 1) docker-compose -f docker-compose-dev.yml down + +_vars-main-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=-o requirements.txt" + +_vars-test-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=--extra=test -o tests/requirements.txt" + +_vars-no-upgrade: + @echo "EXTRA_PIP_COMPILE_ARGS+=--no-upgrade" + +_vars-upgrade-all: + @echo "EXTRA_PIP_COMPILE_ARGS+=--upgrade" + +_write-lock-file: + pip-compile --generate-hashes --no-strip-extras -q ${EXTRA_PIP_COMPILE_ARGS} diff --git a/api/aws_infra/.ebextensions/loadbalancer.yml.config b/api/aws_infra/.ebextensions/loadbalancer.yml.config index 5a063b96..ae08b0b7 100644 --- a/api/aws_infra/.ebextensions/loadbalancer.yml.config +++ b/api/aws_infra/.ebextensions/loadbalancer.yml.config @@ -2,15 +2,6 @@ Resources: AWSEBV2LoadBalancerListener: Type: 'AWS::ElasticLoadBalancingV2::Listener' Properties: - DefaultActions: - - Type: redirect - RedirectConfig: - Protocol: HTTPS - Port: '443' - Host: '#{host}' - Path: '/#{path}' - Query: '#{query}' - StatusCode: HTTP_301 LoadBalancerArn: Ref: AWSEBV2LoadBalancer Port: 80 @@ -24,9 +15,8 @@ option_settings: # # https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-alb.html#environments-cfg-alb-namespaces - aws:elbv2:listener:443: - SSLCertificateArns: arn:aws:acm:us-east-1:100225593120:certificate/047a56a2-09dd-4857-9f28-32d23650d4da - Protocol: HTTPS + aws:elbv2:listener:80: + Protocol: HTTP DefaultProcess: api aws:elasticbeanstalk:environment:process:api: Port: '8080' diff --git a/api/aws_infra/Makefile b/api/aws_infra/Makefile index 67b051ff..f68fd330 100644 --- a/api/aws_infra/Makefile +++ b/api/aws_infra/Makefile @@ -1,15 +1,18 @@ -.PHONY: check-venv-active check-node pip-tools - SUPPORTED_NODE := ^v18\. AWS_DEFAULT_REGION := us-east-1 AWS_ACCT_NR := 100225593120 PAVI_DEPLOY_VERSION_LABEL ?= $(shell git describe --tags --dirty)-$(shell git rev-parse --abbrev-ref HEAD)-$(shell date +%Y%m%d-%H%M%S) -DEPLOY_ENVIRONMENT ?= PaviApiEbDevStack +EB_ENV_CDK_STACK_NAME ?= PaviApiEbDevStack PAVI_IMAGE_TAG ?= main PAVI_IMAGE_REGISTRY ?= ${AWS_ACCT_NR}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ +IMAGE_REPO_CDK_STACK_NAME ?= PaviApiImageRepoCdkStack +EB_APP_CDK_STACK_NAME ?= PaviApiEbApplicationCdkStack ADD_CDK_ARGS ?= +EXTRA_PIP_COMPILE_ARGS ?= + +.PHONY: check-% deploy-% install-% pip-tools run-% update-% validate-% _vars-% _write-lock-file .venv/: python3.12 -m venv .venv/ @@ -38,28 +41,52 @@ pip-tools: pip install pip-tools==7.4.1 requirements.txt: - pip-compile --generate-hashes --no-strip-extras -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" tests/requirements.txt: - pip-compile --generate-hashes --no-strip-extras --extra=test -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-deps-lock: - pip-compile --generate-hashes --no-strip-extras --upgrade -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-test-deps-lock: - pip-compile --generate-hashes --no-strip-extras --extra=test --upgrade -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-deps-lock-shared-aws-infra-only: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-shared-aws-infra-only)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-test-deps-lock-shared-aws-infra-only: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-shared-aws-infra-only)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" install-deps: requirements.txt pip install -r requirements.txt -install-deps-update-dev: check-venv-active requirements.txt +install-deps-update-dev: check-venv-active pip uninstall pavi_shared_aws_infra pip install -U -r requirements.txt install-test-deps: tests/requirements.txt pip install -r tests/requirements.txt -install-test-deps-update-dev: check-venv-active requirements.txt +install-test-deps-update-dev: check-venv-active pip uninstall -y pavi_shared_aws_infra pip install -U -r tests/requirements.txt @@ -76,10 +103,10 @@ run-style-checks: install-test-deps flake8 ./ validate-image-stack: check-node run-unit-tests - cdk diff PaviApiImageRepoCdkStack + cdk diff ${IMAGE_REPO_CDK_STACK_NAME} validate-application-stack: check-node run-unit-tests - cdk diff PaviApiEbApplicationCdkStack + cdk diff ${EB_APP_CDK_STACK_NAME} validate-environment-stack: check-node run-unit-tests export PAVI_DEPLOY_VERSION_LABEL=${PAVI_DEPLOY_VERSION_LABEL} && \ @@ -93,15 +120,36 @@ validate-all: check-node run-unit-tests validate-image-stack validate-applicatio validate-all-dev: check-venv-active validate-all @: +deploy-image-stack: + cdk deploy ${IMAGE_REPO_CDK_STACK_NAME} ${ADD_CDK_ARGS} + deploy-application: - cdk deploy PaviApiEbApplicationCdkStack ${ADD_CDK_ARGS} + cdk deploy ${EB_APP_CDK_STACK_NAME} ${ADD_CDK_ARGS} python -m pavi_shared_aws_infra.aws_helpers.deploy_eb_app_version --eb_app_name PAVI-api --version_label ${PAVI_DEPLOY_VERSION_LABEL} deploy-environment: export PAVI_DEPLOY_VERSION_LABEL=${PAVI_DEPLOY_VERSION_LABEL} && \ export PAVI_IMAGE_TAG=${PAVI_IMAGE_TAG} && \ export PAVI_IMAGE_REGISTRY=${PAVI_IMAGE_REGISTRY} && \ - cdk deploy ${DEPLOY_ENVIRONMENT} ${ADD_CDK_ARGS} + cdk deploy ${EB_ENV_CDK_STACK_NAME} ${ADD_CDK_ARGS} print-deploy-version-label: @echo ${PAVI_DEPLOY_VERSION_LABEL} + +_vars-main-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=-o requirements.txt" + +_vars-test-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=--extra=test -o tests/requirements.txt" + +_vars-no-upgrade: + @echo "EXTRA_PIP_COMPILE_ARGS+=--no-upgrade" + +_vars-upgrade-all: + @echo "EXTRA_PIP_COMPILE_ARGS+=--upgrade" + +_vars-upgrade-shared-aws-infra-only: + @echo "EXTRA_PIP_COMPILE_ARGS+=-P pavi_shared_aws_infra" + +_write-lock-file: + pip-compile --generate-hashes --no-strip-extras -q ${EXTRA_PIP_COMPILE_ARGS} diff --git a/api/aws_infra/mypy.ini b/api/aws_infra/mypy.ini index f2649737..98f22f72 100644 --- a/api/aws_infra/mypy.ini +++ b/api/aws_infra/mypy.ini @@ -9,4 +9,3 @@ strict_equality = True enable_error_code = explicit-override,truthy-bool,truthy-iterable,possibly-undefined follow_imports = skip exclude = venv -mypy_path = ../../ diff --git a/api/aws_infra/requirements.txt b/api/aws_infra/requirements.txt index 13f37f44..8f8dfc71 100644 --- a/api/aws_infra/requirements.txt +++ b/api/aws_infra/requirements.txt @@ -22,19 +22,19 @@ aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb # via aws-cdk-lib -aws-cdk-lib==2.147.2 \ - --hash=sha256:a9f12ab26d651c7b66097f3f387153aee9521dff090cfa5678b35986fd0b7247 \ - --hash=sha256:b2add3d5845ab57ce2f4328326037caa4af88c7719baf1e46c6c169741c0cac3 +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 # via # api-aws_infra (pyproject.toml) # pavi-shared-aws-infra -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via pavi-shared-aws-infra -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer @@ -73,7 +73,7 @@ jsii==1.101.0 \ # aws-cdk-lib # constructs pavi-shared-aws-infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl \ - --hash=sha256:af26066113e6eb0aba09e8936cc98c40f35f99152e35b1a5055350173eff5d30 + --hash=sha256:c6ac11dc41bf2774d5ee49cd3eb3bb2acc35c02d81d1715e325e23c49ae27a9d # via api-aws_infra (pyproject.toml) publication==0.0.3 \ --hash=sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6 \ diff --git a/api/aws_infra/tests/requirements.txt b/api/aws_infra/tests/requirements.txt index e141edea..8688f15d 100644 --- a/api/aws_infra/tests/requirements.txt +++ b/api/aws_infra/tests/requirements.txt @@ -22,19 +22,19 @@ aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb # via aws-cdk-lib -aws-cdk-lib==2.147.2 \ - --hash=sha256:a9f12ab26d651c7b66097f3f387153aee9521dff090cfa5678b35986fd0b7247 \ - --hash=sha256:b2add3d5845ab57ce2f4328326037caa4af88c7719baf1e46c6c169741c0cac3 +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 # via # api-aws_infra (pyproject.toml) # pavi-shared-aws-infra -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via pavi-shared-aws-infra -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer @@ -122,7 +122,7 @@ packaging==24.1 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via pytest pavi-shared-aws-infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl \ - --hash=sha256:af26066113e6eb0aba09e8936cc98c40f35f99152e35b1a5055350173eff5d30 + --hash=sha256:c6ac11dc41bf2774d5ee49cd3eb3bb2acc35c02d81d1715e325e23c49ae27a9d # via api-aws_infra (pyproject.toml) pluggy==1.5.0 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ diff --git a/api/requirements.txt b/api/requirements.txt index 248aa308..0a0d0c99 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -15,19 +15,19 @@ anyio==4.4.0 \ # httpx # starlette # watchfiles -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via smart-open -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via # httpcore # httpx @@ -192,147 +192,153 @@ mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -orjson==3.10.5 \ - --hash=sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01 \ - --hash=sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa \ - --hash=sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5 \ - --hash=sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04 \ - --hash=sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d \ - --hash=sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e \ - --hash=sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b \ - --hash=sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b \ - --hash=sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268 \ - --hash=sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211 \ - --hash=sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c \ - --hash=sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c \ - --hash=sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969 \ - --hash=sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a \ - --hash=sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f \ - --hash=sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932 \ - --hash=sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26 \ - --hash=sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6 \ - --hash=sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214 \ - --hash=sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2 \ - --hash=sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f \ - --hash=sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96 \ - --hash=sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a \ - --hash=sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d \ - --hash=sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38 \ - --hash=sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807 \ - --hash=sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09 \ - --hash=sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6 \ - --hash=sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e \ - --hash=sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5 \ - --hash=sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86 \ - --hash=sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63 \ - --hash=sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2 \ - --hash=sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4 \ - --hash=sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595 \ - --hash=sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228 \ - --hash=sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9 \ - --hash=sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7 \ - --hash=sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40 \ - --hash=sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3 \ - --hash=sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139 \ - --hash=sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1 \ - --hash=sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b \ - --hash=sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47 \ - --hash=sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1 \ - --hash=sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca +orjson==3.10.6 \ + --hash=sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e \ + --hash=sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0 \ + --hash=sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f \ + --hash=sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212 \ + --hash=sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43 \ + --hash=sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b \ + --hash=sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219 \ + --hash=sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394 \ + --hash=sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a \ + --hash=sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd \ + --hash=sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844 \ + --hash=sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5 \ + --hash=sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2 \ + --hash=sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b \ + --hash=sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143 \ + --hash=sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38 \ + --hash=sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5 \ + --hash=sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148 \ + --hash=sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183 \ + --hash=sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db \ + --hash=sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a \ + --hash=sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e \ + --hash=sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6 \ + --hash=sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a \ + --hash=sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc \ + --hash=sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3 \ + --hash=sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34 \ + --hash=sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b \ + --hash=sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365 \ + --hash=sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56 \ + --hash=sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5 \ + --hash=sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863 \ + --hash=sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba \ + --hash=sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed \ + --hash=sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb \ + --hash=sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2 \ + --hash=sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0 \ + --hash=sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f \ + --hash=sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28 \ + --hash=sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a \ + --hash=sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7 \ + --hash=sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c \ + --hash=sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b \ + --hash=sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7 \ + --hash=sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb \ + --hash=sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0 \ + --hash=sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b \ + --hash=sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7 \ + --hash=sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2 \ + --hash=sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7 \ + --hash=sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b # via fastapi -pydantic==2.8.0 \ - --hash=sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141 \ - --hash=sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e +pydantic==2.8.2 \ + --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ + --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 # via fastapi -pydantic-core==2.20.0 \ - --hash=sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c \ - --hash=sha256:05e83ce2f7eba29e627dd8066aa6c4c0269b2d4f889c0eba157233a353053cea \ - --hash=sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8 \ - --hash=sha256:0e75794883d635071cf6b4ed2a5d7a1e50672ab7a051454c76446ef1ebcdcc91 \ - --hash=sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af \ - --hash=sha256:116b326ac82c8b315e7348390f6d30bcfe6e688a7d3f1de50ff7bcc2042a23c2 \ - --hash=sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997 \ - --hash=sha256:1c3c5b7f70dd19a6845292b0775295ea81c61540f68671ae06bfe4421b3222c2 \ - --hash=sha256:1dacf660d6de692fe351e8c806e7efccf09ee5184865893afbe8e59be4920b4a \ - --hash=sha256:1def125d59a87fe451212a72ab9ed34c118ff771e5473fef4f2f95d8ede26d75 \ - --hash=sha256:1e4f46189d8740561b43655263a41aac75ff0388febcb2c9ec4f1b60a0ec12f3 \ - --hash=sha256:1f038156b696a1c39d763b2080aeefa87ddb4162c10aa9fabfefffc3dd8180fa \ - --hash=sha256:21d9f7e24f63fdc7118e6cc49defaab8c1d27570782f7e5256169d77498cf7c7 \ - --hash=sha256:22b813baf0dbf612752d8143a2dbf8e33ccb850656b7850e009bad2e101fc377 \ - --hash=sha256:22e3b1d4b1b3f6082849f9b28427ef147a5b46a6132a3dbaf9ca1baa40c88609 \ - --hash=sha256:23425eccef8f2c342f78d3a238c824623836c6c874d93c726673dbf7e56c78c0 \ - --hash=sha256:25c46bb2ff6084859bbcfdf4f1a63004b98e88b6d04053e8bf324e115398e9e7 \ - --hash=sha256:2761f71faed820e25ec62eacba670d1b5c2709bb131a19fcdbfbb09884593e5a \ - --hash=sha256:2aec8eeea0b08fd6bc2213d8e86811a07491849fd3d79955b62d83e32fa2ad5f \ - --hash=sha256:2d06a7fa437f93782e3f32d739c3ec189f82fca74336c08255f9e20cea1ed378 \ - --hash=sha256:316fe7c3fec017affd916a0c83d6f1ec697cbbbdf1124769fa73328e7907cc2e \ - --hash=sha256:344e352c96e53b4f56b53d24728217c69399b8129c16789f70236083c6ceb2ac \ - --hash=sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1 \ - --hash=sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877 \ - --hash=sha256:3a7235b46c1bbe201f09b6f0f5e6c36b16bad3d0532a10493742f91fbdc8035f \ - --hash=sha256:3c05eaf6c863781eb834ab41f5963604ab92855822a2062897958089d1335dad \ - --hash=sha256:3e147fc6e27b9a487320d78515c5f29798b539179f7777018cedf51b7749e4f4 \ - --hash=sha256:3f0f3a4a23717280a5ee3ac4fb1f81d6fde604c9ec5100f7f6f987716bb8c137 \ - --hash=sha256:5084ec9721f82bef5ff7c4d1ee65e1626783abb585f8c0993833490b63fe1792 \ - --hash=sha256:52527e8f223ba29608d999d65b204676398009725007c9336651c2ec2d93cffc \ - --hash=sha256:53b06aea7a48919a254b32107647be9128c066aaa6ee6d5d08222325f25ef175 \ - --hash=sha256:58e251bb5a5998f7226dc90b0b753eeffa720bd66664eba51927c2a7a2d5f32c \ - --hash=sha256:603a843fea76a595c8f661cd4da4d2281dff1e38c4a836a928eac1a2f8fe88e4 \ - --hash=sha256:616b9c2f882393d422ba11b40e72382fe975e806ad693095e9a3b67c59ea6150 \ - --hash=sha256:649a764d9b0da29816889424697b2a3746963ad36d3e0968784ceed6e40c6355 \ - --hash=sha256:658287a29351166510ebbe0a75c373600cc4367a3d9337b964dada8d38bcc0f4 \ - --hash=sha256:6d0f52684868db7c218437d260e14d37948b094493f2646f22d3dda7229bbe3f \ - --hash=sha256:6dc85b9e10cc21d9c1055f15684f76fa4facadddcb6cd63abab702eb93c98943 \ - --hash=sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38 \ - --hash=sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608 \ - --hash=sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e \ - --hash=sha256:7701df088d0b05f3460f7ba15aec81ac8b0fb5690367dfd072a6c38cf5b7fdb5 \ - --hash=sha256:78d584caac52c24240ef9ecd75de64c760bbd0e20dbf6973631815e3ef16ef8b \ - --hash=sha256:7a3639011c2e8a9628466f616ed7fb413f30032b891898e10895a0a8b5857d6c \ - --hash=sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b \ - --hash=sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d \ - --hash=sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918 \ - --hash=sha256:8093473d7b9e908af1cef30025609afc8f5fd2a16ff07f97440fd911421e4432 \ - --hash=sha256:840200827984f1c4e114008abc2f5ede362d6e11ed0b5931681884dd41852ff1 \ - --hash=sha256:85770b4b37bb36ef93a6122601795231225641003e0318d23c6233c59b424279 \ - --hash=sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b \ - --hash=sha256:87d3df115f4a3c8c5e4d5acf067d399c6466d7e604fc9ee9acbe6f0c88a0c3cf \ - --hash=sha256:8b315685832ab9287e6124b5d74fc12dda31e6421d7f6b08525791452844bc2d \ - --hash=sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392 \ - --hash=sha256:978d4123ad1e605daf1ba5e01d4f235bcf7b6e340ef07e7122e8e9cfe3eb61ab \ - --hash=sha256:a0586cddbf4380e24569b8a05f234e7305717cc8323f50114dfb2051fcbce2a3 \ - --hash=sha256:a272785a226869416c6b3c1b7e450506152d3844207331f02f27173562c917e0 \ - --hash=sha256:a340d2bdebe819d08f605e9705ed551c3feb97e4fd71822d7147c1e4bdbb9508 \ - --hash=sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d \ - --hash=sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c \ - --hash=sha256:ab760f17c3e792225cdaef31ca23c0aea45c14ce80d8eff62503f86a5ab76bff \ - --hash=sha256:ac76f30d5d3454f4c28826d891fe74d25121a346c69523c9810ebba43f3b1cec \ - --hash=sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb \ - --hash=sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad \ - --hash=sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243 \ - --hash=sha256:b34480fd6778ab356abf1e9086a4ced95002a1e195e8d2fd182b0def9d944d11 \ - --hash=sha256:b4a085bd04af7245e140d1b95619fe8abb445a3d7fdf219b3f80c940853268ef \ - --hash=sha256:b81ec2efc04fc1dbf400647d4357d64fb25543bae38d2d19787d69360aad21c9 \ - --hash=sha256:b8c46a8cf53e849eea7090f331ae2202cd0f1ceb090b00f5902c423bd1e11805 \ - --hash=sha256:bc7e43b4a528ffca8c9151b6a2ca34482c2fdc05e6aa24a84b7f475c896fc51d \ - --hash=sha256:c3dc8ec8b87c7ad534c75b8855168a08a7036fdb9deeeed5705ba9410721c84d \ - --hash=sha256:c4a9732a5cad764ba37f3aa873dccb41b584f69c347a57323eda0930deec8e10 \ - --hash=sha256:c867230d715a3dd1d962c8d9bef0d3168994ed663e21bf748b6e3a529a129aab \ - --hash=sha256:cafde15a6f7feaec2f570646e2ffc5b73412295d29134a29067e70740ec6ee20 \ - --hash=sha256:cb1ad5b4d73cde784cf64580166568074f5ccd2548d765e690546cff3d80937d \ - --hash=sha256:d08264b4460326cefacc179fc1411304d5af388a79910832835e6f641512358b \ - --hash=sha256:d42669d319db366cb567c3b444f43caa7ffb779bf9530692c6f244fc635a41eb \ - --hash=sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c \ - --hash=sha256:d5b8376a867047bf08910573deb95d3c8dfb976eb014ee24f3b5a61ccc5bee1b \ - --hash=sha256:d6f2d8b8da1f03f577243b07bbdd3412eee3d37d1f2fd71d1513cbc76a8c1239 \ - --hash=sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17 \ - --hash=sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc \ - --hash=sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce \ - --hash=sha256:e9dcd7fb34f7bfb239b5fa420033642fff0ad676b765559c3737b91f664d4fa9 \ - --hash=sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d \ - --hash=sha256:ee7785938e407418795e4399b2bf5b5f3cf6cf728077a7f26973220d58d885cf \ - --hash=sha256:efbb412d55a4ffe73963fed95c09ccb83647ec63b711c4b3752be10a56f0090b \ - --hash=sha256:f8ea1d8b7df522e5ced34993c423c3bf3735c53df8b2a15688a2f03a7d678800 +pydantic-core==2.20.1 \ + --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ + --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ + --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ + --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ + --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ + --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ + --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ + --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ + --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ + --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ + --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ + --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ + --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ + --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ + --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ + --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ + --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ + --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ + --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ + --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ + --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ + --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ + --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ + --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ + --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ + --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ + --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ + --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ + --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ + --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ + --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ + --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ + --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ + --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ + --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ + --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ + --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ + --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ + --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ + --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ + --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ + --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ + --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ + --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ + --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ + --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ + --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ + --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ + --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ + --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ + --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ + --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ + --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ + --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ + --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ + --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ + --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ + --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ + --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ + --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ + --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ + --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ + --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ + --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ + --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ + --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ + --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ + --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ + --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ + --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ + --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ + --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ + --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ + --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ + --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ + --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ + --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ + --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ + --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ + --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ + --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ + --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ + --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ + --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ + --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ + --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ + --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ + --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ + --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 # via pydantic pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ diff --git a/api/tests/requirements.txt b/api/tests/requirements.txt index fe863c83..8e8443e0 100644 --- a/api/tests/requirements.txt +++ b/api/tests/requirements.txt @@ -15,19 +15,19 @@ anyio==4.4.0 \ # httpx # starlette # watchfiles -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via smart-open -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via # httpcore # httpx @@ -293,53 +293,58 @@ mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 # via mypy -orjson==3.10.5 \ - --hash=sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01 \ - --hash=sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa \ - --hash=sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5 \ - --hash=sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04 \ - --hash=sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d \ - --hash=sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e \ - --hash=sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b \ - --hash=sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b \ - --hash=sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268 \ - --hash=sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211 \ - --hash=sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c \ - --hash=sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c \ - --hash=sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969 \ - --hash=sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a \ - --hash=sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f \ - --hash=sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932 \ - --hash=sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26 \ - --hash=sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6 \ - --hash=sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214 \ - --hash=sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2 \ - --hash=sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f \ - --hash=sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96 \ - --hash=sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a \ - --hash=sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d \ - --hash=sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38 \ - --hash=sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807 \ - --hash=sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09 \ - --hash=sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6 \ - --hash=sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e \ - --hash=sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5 \ - --hash=sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86 \ - --hash=sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63 \ - --hash=sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2 \ - --hash=sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4 \ - --hash=sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595 \ - --hash=sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228 \ - --hash=sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9 \ - --hash=sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7 \ - --hash=sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40 \ - --hash=sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3 \ - --hash=sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139 \ - --hash=sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1 \ - --hash=sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b \ - --hash=sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47 \ - --hash=sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1 \ - --hash=sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca +orjson==3.10.6 \ + --hash=sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e \ + --hash=sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0 \ + --hash=sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f \ + --hash=sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212 \ + --hash=sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43 \ + --hash=sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b \ + --hash=sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219 \ + --hash=sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394 \ + --hash=sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a \ + --hash=sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd \ + --hash=sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844 \ + --hash=sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5 \ + --hash=sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2 \ + --hash=sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b \ + --hash=sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143 \ + --hash=sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38 \ + --hash=sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5 \ + --hash=sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148 \ + --hash=sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183 \ + --hash=sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db \ + --hash=sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a \ + --hash=sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e \ + --hash=sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6 \ + --hash=sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a \ + --hash=sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc \ + --hash=sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3 \ + --hash=sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34 \ + --hash=sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b \ + --hash=sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365 \ + --hash=sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56 \ + --hash=sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5 \ + --hash=sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863 \ + --hash=sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba \ + --hash=sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed \ + --hash=sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb \ + --hash=sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2 \ + --hash=sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0 \ + --hash=sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f \ + --hash=sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28 \ + --hash=sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a \ + --hash=sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7 \ + --hash=sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c \ + --hash=sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b \ + --hash=sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7 \ + --hash=sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb \ + --hash=sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0 \ + --hash=sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b \ + --hash=sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7 \ + --hash=sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2 \ + --hash=sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7 \ + --hash=sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b # via fastapi packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ @@ -353,99 +358,100 @@ pycodestyle==2.11.1 \ --hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \ --hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67 # via flake8 -pydantic==2.8.0 \ - --hash=sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141 \ - --hash=sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e +pydantic==2.8.2 \ + --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ + --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 # via fastapi -pydantic-core==2.20.0 \ - --hash=sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c \ - --hash=sha256:05e83ce2f7eba29e627dd8066aa6c4c0269b2d4f889c0eba157233a353053cea \ - --hash=sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8 \ - --hash=sha256:0e75794883d635071cf6b4ed2a5d7a1e50672ab7a051454c76446ef1ebcdcc91 \ - --hash=sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af \ - --hash=sha256:116b326ac82c8b315e7348390f6d30bcfe6e688a7d3f1de50ff7bcc2042a23c2 \ - --hash=sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997 \ - --hash=sha256:1c3c5b7f70dd19a6845292b0775295ea81c61540f68671ae06bfe4421b3222c2 \ - --hash=sha256:1dacf660d6de692fe351e8c806e7efccf09ee5184865893afbe8e59be4920b4a \ - --hash=sha256:1def125d59a87fe451212a72ab9ed34c118ff771e5473fef4f2f95d8ede26d75 \ - --hash=sha256:1e4f46189d8740561b43655263a41aac75ff0388febcb2c9ec4f1b60a0ec12f3 \ - --hash=sha256:1f038156b696a1c39d763b2080aeefa87ddb4162c10aa9fabfefffc3dd8180fa \ - --hash=sha256:21d9f7e24f63fdc7118e6cc49defaab8c1d27570782f7e5256169d77498cf7c7 \ - --hash=sha256:22b813baf0dbf612752d8143a2dbf8e33ccb850656b7850e009bad2e101fc377 \ - --hash=sha256:22e3b1d4b1b3f6082849f9b28427ef147a5b46a6132a3dbaf9ca1baa40c88609 \ - --hash=sha256:23425eccef8f2c342f78d3a238c824623836c6c874d93c726673dbf7e56c78c0 \ - --hash=sha256:25c46bb2ff6084859bbcfdf4f1a63004b98e88b6d04053e8bf324e115398e9e7 \ - --hash=sha256:2761f71faed820e25ec62eacba670d1b5c2709bb131a19fcdbfbb09884593e5a \ - --hash=sha256:2aec8eeea0b08fd6bc2213d8e86811a07491849fd3d79955b62d83e32fa2ad5f \ - --hash=sha256:2d06a7fa437f93782e3f32d739c3ec189f82fca74336c08255f9e20cea1ed378 \ - --hash=sha256:316fe7c3fec017affd916a0c83d6f1ec697cbbbdf1124769fa73328e7907cc2e \ - --hash=sha256:344e352c96e53b4f56b53d24728217c69399b8129c16789f70236083c6ceb2ac \ - --hash=sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1 \ - --hash=sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877 \ - --hash=sha256:3a7235b46c1bbe201f09b6f0f5e6c36b16bad3d0532a10493742f91fbdc8035f \ - --hash=sha256:3c05eaf6c863781eb834ab41f5963604ab92855822a2062897958089d1335dad \ - --hash=sha256:3e147fc6e27b9a487320d78515c5f29798b539179f7777018cedf51b7749e4f4 \ - --hash=sha256:3f0f3a4a23717280a5ee3ac4fb1f81d6fde604c9ec5100f7f6f987716bb8c137 \ - --hash=sha256:5084ec9721f82bef5ff7c4d1ee65e1626783abb585f8c0993833490b63fe1792 \ - --hash=sha256:52527e8f223ba29608d999d65b204676398009725007c9336651c2ec2d93cffc \ - --hash=sha256:53b06aea7a48919a254b32107647be9128c066aaa6ee6d5d08222325f25ef175 \ - --hash=sha256:58e251bb5a5998f7226dc90b0b753eeffa720bd66664eba51927c2a7a2d5f32c \ - --hash=sha256:603a843fea76a595c8f661cd4da4d2281dff1e38c4a836a928eac1a2f8fe88e4 \ - --hash=sha256:616b9c2f882393d422ba11b40e72382fe975e806ad693095e9a3b67c59ea6150 \ - --hash=sha256:649a764d9b0da29816889424697b2a3746963ad36d3e0968784ceed6e40c6355 \ - --hash=sha256:658287a29351166510ebbe0a75c373600cc4367a3d9337b964dada8d38bcc0f4 \ - --hash=sha256:6d0f52684868db7c218437d260e14d37948b094493f2646f22d3dda7229bbe3f \ - --hash=sha256:6dc85b9e10cc21d9c1055f15684f76fa4facadddcb6cd63abab702eb93c98943 \ - --hash=sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38 \ - --hash=sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608 \ - --hash=sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e \ - --hash=sha256:7701df088d0b05f3460f7ba15aec81ac8b0fb5690367dfd072a6c38cf5b7fdb5 \ - --hash=sha256:78d584caac52c24240ef9ecd75de64c760bbd0e20dbf6973631815e3ef16ef8b \ - --hash=sha256:7a3639011c2e8a9628466f616ed7fb413f30032b891898e10895a0a8b5857d6c \ - --hash=sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b \ - --hash=sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d \ - --hash=sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918 \ - --hash=sha256:8093473d7b9e908af1cef30025609afc8f5fd2a16ff07f97440fd911421e4432 \ - --hash=sha256:840200827984f1c4e114008abc2f5ede362d6e11ed0b5931681884dd41852ff1 \ - --hash=sha256:85770b4b37bb36ef93a6122601795231225641003e0318d23c6233c59b424279 \ - --hash=sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b \ - --hash=sha256:87d3df115f4a3c8c5e4d5acf067d399c6466d7e604fc9ee9acbe6f0c88a0c3cf \ - --hash=sha256:8b315685832ab9287e6124b5d74fc12dda31e6421d7f6b08525791452844bc2d \ - --hash=sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392 \ - --hash=sha256:978d4123ad1e605daf1ba5e01d4f235bcf7b6e340ef07e7122e8e9cfe3eb61ab \ - --hash=sha256:a0586cddbf4380e24569b8a05f234e7305717cc8323f50114dfb2051fcbce2a3 \ - --hash=sha256:a272785a226869416c6b3c1b7e450506152d3844207331f02f27173562c917e0 \ - --hash=sha256:a340d2bdebe819d08f605e9705ed551c3feb97e4fd71822d7147c1e4bdbb9508 \ - --hash=sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d \ - --hash=sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c \ - --hash=sha256:ab760f17c3e792225cdaef31ca23c0aea45c14ce80d8eff62503f86a5ab76bff \ - --hash=sha256:ac76f30d5d3454f4c28826d891fe74d25121a346c69523c9810ebba43f3b1cec \ - --hash=sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb \ - --hash=sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad \ - --hash=sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243 \ - --hash=sha256:b34480fd6778ab356abf1e9086a4ced95002a1e195e8d2fd182b0def9d944d11 \ - --hash=sha256:b4a085bd04af7245e140d1b95619fe8abb445a3d7fdf219b3f80c940853268ef \ - --hash=sha256:b81ec2efc04fc1dbf400647d4357d64fb25543bae38d2d19787d69360aad21c9 \ - --hash=sha256:b8c46a8cf53e849eea7090f331ae2202cd0f1ceb090b00f5902c423bd1e11805 \ - --hash=sha256:bc7e43b4a528ffca8c9151b6a2ca34482c2fdc05e6aa24a84b7f475c896fc51d \ - --hash=sha256:c3dc8ec8b87c7ad534c75b8855168a08a7036fdb9deeeed5705ba9410721c84d \ - --hash=sha256:c4a9732a5cad764ba37f3aa873dccb41b584f69c347a57323eda0930deec8e10 \ - --hash=sha256:c867230d715a3dd1d962c8d9bef0d3168994ed663e21bf748b6e3a529a129aab \ - --hash=sha256:cafde15a6f7feaec2f570646e2ffc5b73412295d29134a29067e70740ec6ee20 \ - --hash=sha256:cb1ad5b4d73cde784cf64580166568074f5ccd2548d765e690546cff3d80937d \ - --hash=sha256:d08264b4460326cefacc179fc1411304d5af388a79910832835e6f641512358b \ - --hash=sha256:d42669d319db366cb567c3b444f43caa7ffb779bf9530692c6f244fc635a41eb \ - --hash=sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c \ - --hash=sha256:d5b8376a867047bf08910573deb95d3c8dfb976eb014ee24f3b5a61ccc5bee1b \ - --hash=sha256:d6f2d8b8da1f03f577243b07bbdd3412eee3d37d1f2fd71d1513cbc76a8c1239 \ - --hash=sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17 \ - --hash=sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc \ - --hash=sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce \ - --hash=sha256:e9dcd7fb34f7bfb239b5fa420033642fff0ad676b765559c3737b91f664d4fa9 \ - --hash=sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d \ - --hash=sha256:ee7785938e407418795e4399b2bf5b5f3cf6cf728077a7f26973220d58d885cf \ - --hash=sha256:efbb412d55a4ffe73963fed95c09ccb83647ec63b711c4b3752be10a56f0090b \ - --hash=sha256:f8ea1d8b7df522e5ced34993c423c3bf3735c53df8b2a15688a2f03a7d678800 +pydantic-core==2.20.1 \ + --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ + --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ + --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ + --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ + --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ + --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ + --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ + --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ + --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ + --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ + --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ + --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ + --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ + --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ + --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ + --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ + --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ + --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ + --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ + --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ + --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ + --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ + --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ + --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ + --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ + --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ + --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ + --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ + --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ + --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ + --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ + --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ + --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ + --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ + --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ + --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ + --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ + --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ + --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ + --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ + --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ + --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ + --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ + --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ + --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ + --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ + --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ + --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ + --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ + --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ + --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ + --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ + --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ + --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ + --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ + --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ + --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ + --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ + --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ + --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ + --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ + --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ + --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ + --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ + --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ + --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ + --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ + --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ + --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ + --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ + --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ + --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ + --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ + --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ + --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ + --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ + --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ + --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ + --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ + --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ + --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ + --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ + --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ + --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ + --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ + --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ + --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ + --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ + --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 # via pydantic pyflakes==3.2.0 \ --hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \ diff --git a/pipeline/alignment/Makefile b/pipeline/alignment/Makefile index cf7becfe..2ccb33eb 100644 --- a/pipeline/alignment/Makefile +++ b/pipeline/alignment/Makefile @@ -6,7 +6,7 @@ AWS_DEFAULT_REGION := us-east-1 AWS_ACCT_NR=100225593120 REG=${AWS_ACCT_NR}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com -.PHONY: clean +.PHONY: clean container-image push-% registry-docker-login run-% registry-docker-login: ifneq ($(shell echo ${REG} | egrep "ecr\..+\.amazonaws\.com"),) diff --git a/pipeline/aws_infra/Makefile b/pipeline/aws_infra/Makefile index 9f7a64a3..ead80733 100644 --- a/pipeline/aws_infra/Makefile +++ b/pipeline/aws_infra/Makefile @@ -1,9 +1,11 @@ -.PHONY: check-venv-active check-node pip-tools - SUPPORTED_NODE := ^v18\. PAVI_COMPUTE_MIN_VCPU ?= 2 +CDK_STACK_NAME ?= PaviPipelineCdkStack ADD_CDK_ARGS ?= +EXTRA_PIP_COMPILE_ARGS ?= + +.PHONY: check-% deploy install-% pip-tools run-% update-% validate validate-% _vars-% _write-lock-file .venv/: python3.12 -m venv .venv/ @@ -32,16 +34,40 @@ pip-tools: pip install pip-tools==7.4.1 requirements.txt: - pip-compile --generate-hashes --no-strip-extras -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" tests/requirements.txt: - pip-compile --generate-hashes --no-strip-extras --extra=test -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-deps-lock: - pip-compile --generate-hashes --no-strip-extras --upgrade -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-test-deps-lock: - pip-compile --generate-hashes --no-strip-extras --extra=test --upgrade -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-deps-lock-shared-aws-infra-only: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-shared-aws-infra-only)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-test-deps-lock-shared-aws-infra-only: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-shared-aws-infra-only)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" install-deps: requirements.txt pip install -r requirements.txt @@ -64,11 +90,29 @@ run-style-checks: install-test-deps validate: check-node run-unit-tests # Validate production stack code export PAVI_COMPUTE_MIN_VCPU=${PAVI_COMPUTE_MIN_VCPU} && \ - cdk diff PaviPipelineCdkStack + cdk diff ${CDK_STACK_NAME} validate-dev: check-venv-active validate @: deploy: export PAVI_COMPUTE_MIN_VCPU=${PAVI_COMPUTE_MIN_VCPU} && \ - cdk deploy PaviPipelineCdkStack ${ADD_CDK_ARGS} + cdk deploy ${CDK_STACK_NAME} ${ADD_CDK_ARGS} + +_vars-main-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=-o requirements.txt" + +_vars-test-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=--extra=test -o tests/requirements.txt" + +_vars-no-upgrade: + @echo "EXTRA_PIP_COMPILE_ARGS+=--no-upgrade" + +_vars-upgrade-all: + @echo "EXTRA_PIP_COMPILE_ARGS+=--upgrade" + +_vars-upgrade-shared-aws-infra-only: + @echo "EXTRA_PIP_COMPILE_ARGS+=-P pavi_shared_aws_infra" + +_write-lock-file: + pip-compile --generate-hashes --no-strip-extras -q ${EXTRA_PIP_COMPILE_ARGS} diff --git a/pipeline/aws_infra/mypy.ini b/pipeline/aws_infra/mypy.ini index f2649737..98f22f72 100644 --- a/pipeline/aws_infra/mypy.ini +++ b/pipeline/aws_infra/mypy.ini @@ -9,4 +9,3 @@ strict_equality = True enable_error_code = explicit-override,truthy-bool,truthy-iterable,possibly-undefined follow_imports = skip exclude = venv -mypy_path = ../../ diff --git a/pipeline/aws_infra/requirements.txt b/pipeline/aws_infra/requirements.txt index d36b2b45..dab0ba65 100644 --- a/pipeline/aws_infra/requirements.txt +++ b/pipeline/aws_infra/requirements.txt @@ -22,19 +22,19 @@ aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb # via aws-cdk-lib -aws-cdk-lib==2.147.2 \ - --hash=sha256:a9f12ab26d651c7b66097f3f387153aee9521dff090cfa5678b35986fd0b7247 \ - --hash=sha256:b2add3d5845ab57ce2f4328326037caa4af88c7719baf1e46c6c169741c0cac3 +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 # via # pavi-shared-aws-infra # pipeline-aws_infra (pyproject.toml) -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via pavi-shared-aws-infra -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer @@ -73,7 +73,7 @@ jsii==1.101.0 \ # aws-cdk-lib # constructs pavi-shared-aws-infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl \ - --hash=sha256:af26066113e6eb0aba09e8936cc98c40f35f99152e35b1a5055350173eff5d30 + --hash=sha256:c6ac11dc41bf2774d5ee49cd3eb3bb2acc35c02d81d1715e325e23c49ae27a9d # via pipeline-aws_infra (pyproject.toml) publication==0.0.3 \ --hash=sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6 \ diff --git a/pipeline/aws_infra/tests/requirements.txt b/pipeline/aws_infra/tests/requirements.txt index 58119c35..d5896730 100644 --- a/pipeline/aws_infra/tests/requirements.txt +++ b/pipeline/aws_infra/tests/requirements.txt @@ -22,19 +22,19 @@ aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb # via aws-cdk-lib -aws-cdk-lib==2.147.2 \ - --hash=sha256:a9f12ab26d651c7b66097f3f387153aee9521dff090cfa5678b35986fd0b7247 \ - --hash=sha256:b2add3d5845ab57ce2f4328326037caa4af88c7719baf1e46c6c169741c0cac3 +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 # via # pavi-shared-aws-infra # pipeline-aws_infra (pyproject.toml) -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via pavi-shared-aws-infra -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer @@ -122,7 +122,7 @@ packaging==24.1 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via pytest pavi-shared-aws-infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl \ - --hash=sha256:af26066113e6eb0aba09e8936cc98c40f35f99152e35b1a5055350173eff5d30 + --hash=sha256:c6ac11dc41bf2774d5ee49cd3eb3bb2acc35c02d81d1715e325e23c49ae27a9d # via pipeline-aws_infra (pyproject.toml) pluggy==1.5.0 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ diff --git a/pipeline/seq_retrieval/Makefile b/pipeline/seq_retrieval/Makefile index a79322cc..2506a0d1 100644 --- a/pipeline/seq_retrieval/Makefile +++ b/pipeline/seq_retrieval/Makefile @@ -1,12 +1,13 @@ CONTAINER_NAME=agr_pavi/pipeline_seq_retrieval TAG_NAME?=latest ADDITIONAL_BUILD_ARGS= +EXTRA_PIP_COMPILE_ARGS ?= AWS_DEFAULT_REGION := us-east-1 AWS_ACCT_NR=100225593120 REG=${AWS_ACCT_NR}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com -.PHONY: check-venv-active run-type-checks clean pip-tools +.PHONY: check-% clean container-image install-% pip-tools push-% registry-docker-login run-% update-% _vars-% _write-lock-file registry-docker-login: ifneq ($(shell echo ${REG} | egrep "ecr\..+\.amazonaws\.com"),) @@ -33,10 +34,28 @@ pip-tools: pip install pip-tools==7.4.1 requirements.txt: - pip-compile --generate-hashes --no-strip-extras -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" tests/requirements.txt: - pip-compile --generate-hashes --no-strip-extras --extra=test -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-deps-lock: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-test-deps-lock: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" install-deps: requirements.txt pip install -r requirements.txt @@ -44,15 +63,9 @@ install-deps: requirements.txt install-deps-update: pip install -U -r requirements.txt -update-deps-lock: - pip-compile --generate-hashes --no-strip-extras --upgrade -o requirements.txt - install-test-deps: tests/requirements.txt pip install -r tests/requirements.txt -update-test-deps-lock: - pip-compile --generate-hashes --no-strip-extras --extra=test --upgrade -o tests/requirements.txt - run-type-checks: install-test-deps mypy --install-types --non-interactive --warn-unused-config ./ @@ -87,3 +100,18 @@ run-type-checks-dev: check-venv-active run-type-checks .venv/: python3.12 -m venv .venv/ + +_vars-main-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=-o requirements.txt" + +_vars-test-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=--extra=test -o tests/requirements.txt" + +_vars-no-upgrade: + @echo "EXTRA_PIP_COMPILE_ARGS+=--no-upgrade" + +_vars-upgrade-all: + @echo "EXTRA_PIP_COMPILE_ARGS+=--upgrade" + +_write-lock-file: + pip-compile --generate-hashes --no-strip-extras -q ${EXTRA_PIP_COMPILE_ARGS} diff --git a/pipeline/seq_retrieval/requirements.txt b/pipeline/seq_retrieval/requirements.txt index 566f8ff4..287f8550 100644 --- a/pipeline/seq_retrieval/requirements.txt +++ b/pipeline/seq_retrieval/requirements.txt @@ -33,9 +33,9 @@ biopython==1.83 \ --hash=sha256:ec82350c24cdcf34a8d4a5f189d0ff7dc025658098a60e6f0e681d24b6a1414e \ --hash=sha256:fd9bc6fef3f6a10043635a75e1a77c9dce877375140e81059c67c73d4ce65c4c # via seq-retrieval (pyproject.toml) -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ diff --git a/pipeline/seq_retrieval/tests/requirements.txt b/pipeline/seq_retrieval/tests/requirements.txt index ab64290c..6fb67345 100644 --- a/pipeline/seq_retrieval/tests/requirements.txt +++ b/pipeline/seq_retrieval/tests/requirements.txt @@ -33,9 +33,9 @@ biopython==1.83 \ --hash=sha256:ec82350c24cdcf34a8d4a5f189d0ff7dc025658098a60e6f0e681d24b6a1414e \ --hash=sha256:fd9bc6fef3f6a10043635a75e1a77c9dce877375140e81059c67c73d4ce65c4c # via seq-retrieval (pyproject.toml) -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ diff --git a/pipeline/workflow/Makefile b/pipeline/workflow/Makefile index c8171f5b..6dbf376e 100644 --- a/pipeline/workflow/Makefile +++ b/pipeline/workflow/Makefile @@ -4,7 +4,7 @@ AWS_ACCT_NR=100225593120 REG=${AWS_ACCT_NR}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com TAG_NAME?=main -.PHONY: build-workflow-local-deps run-workflow-local registry-docker-login +.PHONY: build-% clean registry-docker-login run-% clean: @rm -f nextflow.sh diff --git a/shared_aws_infra/Makefile b/shared_aws_infra/Makefile index a7aaa7c7..5b69dbba 100644 --- a/shared_aws_infra/Makefile +++ b/shared_aws_infra/Makefile @@ -1,5 +1,7 @@ -.PHONY: check-venv-active check-node pip-tools clean install SUPPORTED_NODE := ^v18\. +EXTRA_PIP_COMPILE_ARGS ?= + +.PHONY: check-% clean install install-% pip-tools run-% update-% _vars-% _write-lock-file .venv/: python3.12 -m venv .venv/ @@ -10,8 +12,9 @@ build: # so that build produces whl with reproducable hash given same source-code, # resulting in reproducable builds that don't result in hash mismatches on rebuild REF=$$(git log -n 1 --format=%H ./) && \ + echo "REF: $$REF" && \ export SOURCE_DATE_EPOCH=$$(git show --no-patch --format=%ct $$REF) && \ - echo $$SOURCE_DATE_EPOCH && \ + echo "SOURCE_DATE_EPOCH: $$SOURCE_DATE_EPOCH" && \ python3.12 -m build install: @@ -45,16 +48,28 @@ pip-tools: pip install pip-tools==7.4.1 requirements.txt: - pip-compile --generate-hashes --no-strip-extras -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" tests/requirements.txt: - pip-compile --generate-hashes --no-strip-extras --extra=test -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-deps-lock: - pip-compile --generate-hashes --no-strip-extras --upgrade -o requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" update-test-deps-lock: - pip-compile --generate-hashes --no-strip-extras --extra=test --upgrade -o tests/requirements.txt + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" install-deps: requirements.txt pip install -r requirements.txt @@ -73,3 +88,18 @@ run-type-checks: install-test-deps run-style-checks: install-test-deps flake8 ./ + +_vars-main-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=-o requirements.txt" + +_vars-test-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=--extra=test -o tests/requirements.txt" + +_vars-no-upgrade: + @echo "EXTRA_PIP_COMPILE_ARGS+=--no-upgrade" + +_vars-upgrade-all: + @echo "EXTRA_PIP_COMPILE_ARGS+=--upgrade" + +_write-lock-file: + pip-compile --generate-hashes --no-strip-extras -q ${EXTRA_PIP_COMPILE_ARGS} diff --git a/shared_aws_infra/pavi_shared_aws_infra/shared_cdk_classes/application_stack.py b/shared_aws_infra/pavi_shared_aws_infra/shared_cdk_classes/application_stack.py index b7c9c1c4..9d66a2c5 100644 --- a/shared_aws_infra/pavi_shared_aws_infra/shared_cdk_classes/application_stack.py +++ b/shared_aws_infra/pavi_shared_aws_infra/shared_cdk_classes/application_stack.py @@ -119,7 +119,7 @@ def defineEbEnvironmentCdkConstructs( stack, 'eb-environment', environment_name=f'{eb_app_name}-{env_suffix}', application_name=eb_app_name, - solution_stack_name='64bit Amazon Linux 2023 v4.3.1 running Docker', + solution_stack_name='64bit Amazon Linux 2023 v4.3.4 running Docker', version_label=app_version_label, option_settings=optionSettingProperties) cdk_tags.of(eb_env).add("Product", "PAVI") # type: ignore diff --git a/shared_aws_infra/requirements.txt b/shared_aws_infra/requirements.txt index 084817d1..4cf33279 100644 --- a/shared_aws_infra/requirements.txt +++ b/shared_aws_infra/requirements.txt @@ -22,17 +22,17 @@ aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb # via aws-cdk-lib -aws-cdk-lib==2.147.2 \ - --hash=sha256:a9f12ab26d651c7b66097f3f387153aee9521dff090cfa5678b35986fd0b7247 \ - --hash=sha256:b2add3d5845ab57ce2f4328326037caa4af88c7719baf1e46c6c169741c0cac3 +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 # via pavi_shared_aws_infra (pyproject.toml) -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via pavi_shared_aws_infra (pyproject.toml) -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer diff --git a/shared_aws_infra/tests/requirements.txt b/shared_aws_infra/tests/requirements.txt index 4072674c..be2ee230 100644 --- a/shared_aws_infra/tests/requirements.txt +++ b/shared_aws_infra/tests/requirements.txt @@ -22,27 +22,27 @@ aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb # via aws-cdk-lib -aws-cdk-lib==2.147.2 \ - --hash=sha256:a9f12ab26d651c7b66097f3f387153aee9521dff090cfa5678b35986fd0b7247 \ - --hash=sha256:b2add3d5845ab57ce2f4328326037caa4af88c7719baf1e46c6c169741c0cac3 +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 # via pavi_shared_aws_infra (pyproject.toml) -boto3==1.34.136 \ - --hash=sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731 \ - --hash=sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79 +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d # via pavi_shared_aws_infra (pyproject.toml) -boto3-stubs==1.34.136 \ - --hash=sha256:5826c22c10fc9032376bbee436d1b23b111e5fb1f13c75ecde8727151191f057 \ - --hash=sha256:ecbce782ae19037d1f26673cfc30358493c9658ea0af06dd58a999be963ab275 +boto3-stubs==1.34.139 \ + --hash=sha256:311b5ea157ff0178f3a9583eae78822170467afb874ba78621634db4e74e7b36 \ + --hash=sha256:ad2b935bfed068c9637bcb4e4c603d373ca8c21df6910089a4efa3faafaefcd7 # via pavi_shared_aws_infra (pyproject.toml) -botocore==1.34.136 \ - --hash=sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f \ - --hash=sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61 +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 # via # boto3 # s3transfer -botocore-stubs==1.34.136 \ - --hash=sha256:b97bece44abc9f16c1fcb022d3f03c22d411ea3dcb4730207a318eb8e6ef63e7 \ - --hash=sha256:f8a8716d9f1b8387acce6ef35d9428ed4ef1584dbeb6cce3f2f95ba6ff8120f7 +botocore-stubs==1.34.139 \ + --hash=sha256:ee55b126f1ed3a4474f58060e03b6514c0c3b3ecce8a48b4171119e7657a142d \ + --hash=sha256:fa91cfa4c4ffa150af5a7b264ae7486a109ca342038404d1b4c8b2a17bda6724 # via boto3-stubs cattrs==23.2.3 \ --hash=sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108 \ @@ -176,9 +176,9 @@ typeguard==2.13.3 \ # aws-cdk-lib # constructs # jsii -types-awscrt==0.20.12 \ - --hash=sha256:0beabdde0205dc1da679ea464fd3f98b570ef4f0fc825b155a974fb51b21e8d9 \ - --hash=sha256:521ce54cc4dad9fe6480556bb0f8315a508106938ba1f2a0baccfcea7d4a4dee +types-awscrt==0.21.0 \ + --hash=sha256:026f882d4d23f04c5b2ab08d6fefd627842537009cd00e9f78dd4960314d51aa \ + --hash=sha256:06aa247fe5ccf0b86428e5289aeabf67f967e10861f211c16c19e7d2542a70a9 # via botocore-stubs types-s3transfer==0.10.1 \ --hash=sha256:02154cce46528287ad76ad1a0153840e0492239a0887e8833466eccf84b98da0 \ diff --git a/shared_aws_infra/tests/unit/test_cdk_image_repo_stack.py b/shared_aws_infra/tests/unit/test_cdk_image_repo_stack.py index f80a0b4e..93894beb 100644 --- a/shared_aws_infra/tests/unit/test_cdk_image_repo_stack.py +++ b/shared_aws_infra/tests/unit/test_cdk_image_repo_stack.py @@ -27,7 +27,7 @@ # If the below ECR repository name changes, then ensure this change is intentional, # as it can potentially break a lot of AWS infrastructure of other PAVI components # implementing the ImageRepoCdkStack class (and depending on the name format to stay the same). -def test_api_ecr_repo() -> None: +def test_ecr_repo_name() -> None: template.has_resource(type=ResourceType.ECR_REPOSITORY.compliance_resource_type, props={ "Properties": { "RepositoryName": "agr_pavi/new_component" diff --git a/webui/Makefile b/webui/Makefile index 9464bafa..718051ad 100644 --- a/webui/Makefile +++ b/webui/Makefile @@ -4,6 +4,10 @@ SUPPORTED_NODE := ^v20\. PAVI_API_PORT ?= 8000 PAVI_API_BASE_URL ?= http://localhost:${PAVI_API_PORT} +AWS_DEFAULT_REGION := us-east-1 +AWS_ACCT_NR=100225593120 +REG=${AWS_ACCT_NR}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com + clean: $(eval ADDITIONAL_BUILD_ARGS := --no-cache) @rm -rf node_modules/ @@ -27,6 +31,16 @@ install-deps: check-node update-deps-lock: check-node npm update --package-lock-only +registry-docker-login: +ifneq ($(shell echo ${REG} | egrep "ecr\..+\.amazonaws\.com"),) + @$(eval DOCKER_LOGIN_CMD=docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli) +ifneq (${AWS_PROFILE},) + @$(eval DOCKER_LOGIN_CMD=${DOCKER_LOGIN_CMD} --profile ${AWS_PROFILE}) +endif + @$(eval DOCKER_LOGIN_CMD=${DOCKER_LOGIN_CMD} ecr get-login-password --region=${AWS_DEFAULT_REGION} | docker login -u AWS --password-stdin https://${REG}) + ${DOCKER_LOGIN_CMD} +endif + run-container-dev: @export PAVI_API_BASE_URL=${PAVI_API_BASE_URL} && \ docker-compose -f docker-compose-dev.yml --env-file dev.env up agr.pavi.dev-local.webui diff --git a/webui/aws_infra/.ebextensions/autoscaling.yml.config b/webui/aws_infra/.ebextensions/autoscaling.yml.config new file mode 100644 index 00000000..fa6f8bff --- /dev/null +++ b/webui/aws_infra/.ebextensions/autoscaling.yml.config @@ -0,0 +1,7 @@ +option_settings: + aws:ec2:instances: + InstanceTypes: t2.micro + aws:autoscaling:asg: + Availability Zones: Any + MinSize: 1 + MaxSize: 1 diff --git a/webui/aws_infra/.ebextensions/aws-ec2-vpc.yml.config b/webui/aws_infra/.ebextensions/aws-ec2-vpc.yml.config new file mode 100644 index 00000000..573646e1 --- /dev/null +++ b/webui/aws_infra/.ebextensions/aws-ec2-vpc.yml.config @@ -0,0 +1,17 @@ +option_settings: + aws:ec2:vpc: + AssociatePublicIpAddress: false + Subnets: + - subnet-0d4703177afb1797d + - subnet-04262fc338f638054 + - subnet-044457c061edf85f2 + - subnet-04019d42d5c9e6fb9 + - subnet-049778993fb504a7c + ELBSubnets: + - subnet-0d4703177afb1797d + - subnet-04262fc338f638054 + - subnet-044457c061edf85f2 + - subnet-04019d42d5c9e6fb9 + - subnet-049778993fb504a7c + VPCId: vpc-55522232 + ELBScheme: internal diff --git a/webui/aws_infra/.ebextensions/cloudwatch.yml.config b/webui/aws_infra/.ebextensions/cloudwatch.yml.config new file mode 100644 index 00000000..99fcdfd5 --- /dev/null +++ b/webui/aws_infra/.ebextensions/cloudwatch.yml.config @@ -0,0 +1,98 @@ +files: + "/opt/aws/amazon-cloudwatch-agent/bin/config.json": + mode: "000600" + owner: root + group: root + content: | + { + "agent": { + "metrics_collection_interval": 60, + "run_as_user": "root" + }, + "metrics": { + "namespace": "PAVI/WebUiServer", + "append_dimensions": { + "AutoScalingGroupName": "${aws:AutoScalingGroupName}", + "InstanceId": "${aws:InstanceId}", + "InstanceType": "${aws:InstanceType}" + }, + "metrics_collected": { + "cpu": { + "totalcpu": true, + "measurement": [ + "usage_active", + "usage_idle", + "usage_iowait", + "usage_guest", + "usage_system", + "usage_user" + ] + }, + "disk": { + "ignore_file_system_types": [ + "tmpfs", + "devtmpfs" + ], + "measurement": [ + "free", + "used", + "used_percent", + "inodes_used", + "inodes_free" + ] + }, + "diskio": { + "measurement": [ + "reads", + "writes", + "read_bytes", + "write_bytes", + "iops_in_progress" + ] + }, + "mem": { + "measurement": [ + "available", + "available_percent", + "free", + "used", + "used_percent" + ] + }, + "swap": { + "measurement": [ + "free", + "used", + "used_percent" + ] + }, + "net": { + "resources": ["eth0", "docker0"], + "measurement": [ + "bytes_sent", + "bytes_recv", + "drop_in", + "drop_out", + "err_in", + "err_out" + ] + }, + "processes": { + "measurement": [ + "blocked", + "dead", + "paging", + "running", + "sleeping", + "wait", + "zombies", + "total", + "total_threads" + ] + } + } + } + } +container_commands: + start_cloudwatch_agent: + command: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json diff --git a/webui/aws_infra/.ebextensions/eb-platform.yml.config b/webui/aws_infra/.ebextensions/eb-platform.yml.config new file mode 100644 index 00000000..753659e9 --- /dev/null +++ b/webui/aws_infra/.ebextensions/eb-platform.yml.config @@ -0,0 +1,7 @@ +option_settings: + aws:elasticbeanstalk:managedactions: + ManagedActionsEnabled: true + PreferredStartTime: "Tue:02:00" + aws:elasticbeanstalk:managedactions:platformupdate: + UpdateLevel: minor + InstanceRefreshEnabled: false diff --git a/webui/aws_infra/.ebextensions/loadbalancer.yml.config b/webui/aws_infra/.ebextensions/loadbalancer.yml.config new file mode 100644 index 00000000..578b8e02 --- /dev/null +++ b/webui/aws_infra/.ebextensions/loadbalancer.yml.config @@ -0,0 +1,37 @@ +Resources: + AWSEBV2LoadBalancerListener: + Type: 'AWS::ElasticLoadBalancingV2::Listener' + Properties: + DefaultActions: + - Type: redirect + RedirectConfig: + Protocol: HTTPS + Port: '443' + Host: '#{host}' + Path: '/#{path}' + Query: '#{query}' + StatusCode: HTTP_301 + LoadBalancerArn: + Ref: AWSEBV2LoadBalancer + Port: 80 + Protocol: HTTP +option_settings: + # As noted in the AWS docs, the following option cannot be set through the .ebextensions configuration files, + # and thus is defined directly in the CDK definitions (see parent directory). + # + # aws:elasticbeanstalk:environment: + # LoadBalancerType: application + # + # https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-alb.html#environments-cfg-alb-namespaces + + aws:elbv2:listener:443: + SSLCertificateArns: arn:aws:acm:us-east-1:100225593120:certificate/047a56a2-09dd-4857-9f28-32d23650d4da + Protocol: HTTPS + DefaultProcess: web + aws:elasticbeanstalk:environment:process:web: + Port: '3000' + Protocol: HTTP + HealthCheckPath: / + MatcherHTTPCode: 200 + aws:elbv2:loadbalancer: + IdleTimeout: 600 diff --git a/webui/aws_infra/.flake8 b/webui/aws_infra/.flake8 new file mode 100644 index 00000000..4bd92586 --- /dev/null +++ b/webui/aws_infra/.flake8 @@ -0,0 +1,6 @@ +[flake8] +ignore = E266, E501, W503 +max-complexity = 18 +select = B,C,E,F,W,T4 +exclude = .venv,node_modules +per-file-ignores = __init__.py:F401 diff --git a/webui/aws_infra/.gitignore b/webui/aws_infra/.gitignore new file mode 100644 index 00000000..9127d784 --- /dev/null +++ b/webui/aws_infra/.gitignore @@ -0,0 +1,118 @@ +# CDK files +## asset staging directory +.cdk.staging +cdk.out + +## CLI installation artifacts +node_modules/ +package.json +package-lock.json + +## Deploy artefacts +eb_app.zip + +# Python files +## Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +## C extensions +*.so + +## Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +## PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +## package installer logs +pip-log.txt +pip-delete-this-directory.txt + +## Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +## Translations +*.mo +*.pot + +## Sphinx documentation +docs/_build/ + +## PyBuilder +.pybuilder/ +target/ + +## IPython +profile_default/ +ipython_config.py + +## Celery stuff +celerybeat-schedule +celerybeat.pid + +## (virtual) environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +## Spyder project settings +.spyderproject +.spyproject + +## Rope project settings +.ropeproject + +## mkdocs documentation +/site + +## mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +## Pyre type checker +.pyre/ + +## pytype static type analyzer +.pytype/ + +## Cython debug symbols +cython_debug/ diff --git a/webui/aws_infra/.nvmrc b/webui/aws_infra/.nvmrc new file mode 100644 index 00000000..3f430af8 --- /dev/null +++ b/webui/aws_infra/.nvmrc @@ -0,0 +1 @@ +v18 diff --git a/webui/aws_infra/Makefile b/webui/aws_infra/Makefile new file mode 100644 index 00000000..e3a6848a --- /dev/null +++ b/webui/aws_infra/Makefile @@ -0,0 +1,157 @@ +SUPPORTED_NODE := ^v18\. + +AWS_DEFAULT_REGION := us-east-1 +AWS_ACCT_NR := 100225593120 + +PAVI_DEPLOY_VERSION_LABEL ?= $(shell git describe --tags --dirty)-$(shell git rev-parse --abbrev-ref HEAD)-$(shell date +%Y%m%d-%H%M%S) +EB_ENV_CDK_STACK_NAME ?= PaviWebUiEbDevStack +PAVI_IMAGE_TAG ?= main +PAVI_IMAGE_REGISTRY ?= ${AWS_ACCT_NR}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ +IMAGE_REPO_CDK_STACK_NAME ?= PaviWebUiImageRepoCdkStack +EB_APP_CDK_STACK_NAME ?= PaviWebUiEbApplicationCdkStack +ADD_CDK_ARGS ?= +EXTRA_PIP_COMPILE_ARGS ?= + +.PHONY: check-% deploy-% install-% pip-tools print-% run-% update-% validate-% _vars-% _write-lock-file + +.venv/: + python3.12 -m venv .venv/ + +check-venv-active: +ifeq ($(VIRTUAL_ENV),) + @echo 'No active python virtual environment found.'\ + 'Please active the virtual environment first by running `source .venv/bin/activate`,'\ + 'or read README.md for instructions on how to set up a new one.' + @exit 1 +else + @: +endif + +check-node: + @$(eval NODE_VERSION=$(shell node --version)) +ifeq ($(shell node --version | grep -P "${SUPPORTED_NODE}"),) + @echo 'Node version "${NODE_VERSION}" not supported!'\ + 'Change the active node version (use nvm) to match "${SUPPORTED_NODE}".' + @exit 1 +else + @: +endif + +pip-tools: + pip install pip-tools==7.4.1 + +requirements.txt: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +tests/requirements.txt: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-no-upgrade)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-deps-lock: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-test-deps-lock: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-all)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-deps-lock-shared-aws-infra-only: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-shared-aws-infra-only)) + $(eval $(shell $(MAKE) _vars-main-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +update-test-deps-lock-shared-aws-infra-only: + $(eval EXTRA_PIP_COMPILE_ARGS:=) + $(eval $(shell $(MAKE) _vars-upgrade-shared-aws-infra-only)) + $(eval $(shell $(MAKE) _vars-test-deps)) + @$(MAKE) --no-print-directory _write-lock-file EXTRA_PIP_COMPILE_ARGS="${EXTRA_PIP_COMPILE_ARGS}" + +install-deps: requirements.txt + pip install -r requirements.txt + +install-deps-update-dev: check-venv-active + pip uninstall pavi_shared_aws_infra + pip install -U -r requirements.txt + +install-test-deps: tests/requirements.txt + pip install -r tests/requirements.txt + +install-test-deps-update-dev: check-venv-active + pip uninstall -y pavi_shared_aws_infra + pip install -U -r tests/requirements.txt + +run-unit-tests: check-node install-test-deps + python -m pytest + +run-unit-tests-dev: check-venv-active check-node install-test-deps + python -m pytest -v + +run-type-checks: install-test-deps + mypy --install-types --non-interactive --warn-unused-config ./ + +run-style-checks: install-test-deps + flake8 ./ + +validate-image-stack: check-node run-unit-tests + cdk diff ${IMAGE_REPO_CDK_STACK_NAME} + +validate-application-stack: check-node run-unit-tests + cdk diff ${EB_APP_CDK_STACK_NAME} + +validate-environment-stack: check-node run-unit-tests + export PAVI_DEPLOY_VERSION_LABEL=${PAVI_DEPLOY_VERSION_LABEL} && \ + export PAVI_IMAGE_TAG=${PAVI_IMAGE_TAG} && \ + export PAVI_IMAGE_REGISTRY=${PAVI_IMAGE_REGISTRY} && \ + export PAVI_API_BASE_URL=${PAVI_API_BASE_URL} && \ + cdk diff PaviWebUiEbMainStack + +validate-all: check-node run-unit-tests validate-image-stack validate-application-stack validate-environment-stack + @: + +validate-all-dev: check-venv-active validate-all + @: + +deploy-image-stack: + cdk deploy ${IMAGE_REPO_CDK_STACK_NAME} ${ADD_CDK_ARGS} + +deploy-application: + cdk deploy ${EB_APP_CDK_STACK_NAME} ${ADD_CDK_ARGS} + python -m pavi_shared_aws_infra.aws_helpers.deploy_eb_app_version --eb_app_name PAVI-webui --version_label ${PAVI_DEPLOY_VERSION_LABEL} + +deploy-environment: + export PAVI_DEPLOY_VERSION_LABEL=${PAVI_DEPLOY_VERSION_LABEL} && \ + export PAVI_IMAGE_TAG=${PAVI_IMAGE_TAG} && \ + export PAVI_IMAGE_REGISTRY=${PAVI_IMAGE_REGISTRY} && \ + export PAVI_API_BASE_URL=${PAVI_API_BASE_URL} && \ + cdk deploy ${EB_ENV_CDK_STACK_NAME} ${ADD_CDK_ARGS} + +print-deploy-version-label: + @echo ${PAVI_DEPLOY_VERSION_LABEL} + +_vars-main-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=-o requirements.txt" + +_vars-test-deps: + @echo "EXTRA_PIP_COMPILE_ARGS+=--extra=test -o tests/requirements.txt" + +_vars-no-upgrade: + @echo "EXTRA_PIP_COMPILE_ARGS+=--no-upgrade" + +_vars-upgrade-all: + @echo "EXTRA_PIP_COMPILE_ARGS+=--upgrade" + +_vars-upgrade-shared-aws-infra-only: + @echo "EXTRA_PIP_COMPILE_ARGS+=-P pavi_shared_aws_infra" + +_write-lock-file: + pip-compile --generate-hashes --no-strip-extras -q ${EXTRA_PIP_COMPILE_ARGS} diff --git a/webui/aws_infra/README.md b/webui/aws_infra/README.md new file mode 100644 index 00000000..0367a32a --- /dev/null +++ b/webui/aws_infra/README.md @@ -0,0 +1,129 @@ + +# AGR PAVI infra using CDK (Python) + +This is the AWS infrastructure component of the AGR PAVI webUI. +This includes all AWS resources and infrastructure required to make the webUI +servable from and executable in AWS, and is defined and deployed using +AWS CDK and written as Python code in this subdirectory. + +AWS CDK is an open-source framework that enables writing +the entire cloud application as code, including all event sources and other AWS resources +which are require to make the application executable in AWS in addition to the application code. +This allows for an easy and reproducible deployment, that can be fully documented and versioned as code. + +For instructions on how to install the AWS CDK CLI, +see the [AWS docs](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install). + +CDK CLI tool used for this repository is tested and deployed using node.js v18. + + +As this project is set up as a Python project, it is advised to use [virtualenv](https://docs.python.org/3/library/venv.html) +to allow isolated dependency installation. Furthermore, it is advised to store +the virtual env in a `venv` subdirectory in this directory. +As this path was added to the .gitignore file, it will automatically be excluded +from any git operations. + +To create a new virtual environment (for first first time use of this directory): +```bash +$ python3 -m venv venv +``` + +Then for every subsequent use of this directory (for coding, deployment, ...) + +First activate the virtualenv: +```bash +$ source venv/bin/activate +``` + +Once the virtualenv is activated, install the required dependencies: +```bash +$ pip install -r requirements.txt +``` + +After that, you can execute all required CDK commands as described in below chapters. +Once done working with the code in this directory, deactivate the virtualenv: +```bash +$ deactivate +``` + +## Dependencies +The code in this subdirectory depends on a set of shared AWS infra modules and variables, +found in the the `/shared_aws_infra` directory in this repository. + +Before proceeding to run or make any changes in this repository, build and install +this shared AWS infra module by following the [build-and-install](../../shared_aws_infra/README.md#build-and-install) instructions in the README. + +## Important files +Two standard CDK configuration files can be found at the root level of this directory: + * [cdk.json](./cdk.json) + Contains the main CDK execution configuration parameters + * [cdk.context.json](./cdk.context.json) + Contains the VPC context in which to deploy the CDK Stack. + +Then the AWS Stack to be deployed using CDK is define in the following files and directories: + * [cdk_app.py](./cdk_app.py) + The root level CDK application, defining the entire AWS Stack to be deployed. + * [cdk_classes/](./cdk_classes/) + Python sub-classes defining the CDK stack (representing a single CloudFormation stack) + and all individual CDK constructs, representing individual cloud components. + +## Validating +When making changes to any of the CDK files, validate them before requesting a PR +or attempting a deployment. + +**Note**: as part of the validation requires comparison to deployed resources, +you need to be authenticateable to AWS before you can run below validation target. + +To validate the CDK code run the following command: +```bash +make validate-dev +``` +This make target will run two things: + +First it will run the unit tests (through the Makefile's `run-unit-tests-dev` target), +which test CDK code for resource definitions exepected by other parts of this repository, +to ensure updates to the CDK code don't accidentally remove or rename essential AWS resources. + +After the unit tests pass, it will run `cdk diff` on the production stack, +which compares the production stack defined in the code to the deployed stack +and displays the changes that would get deployed. +Inspect these changes to ensure the code changes made will have the expected effect +on the deployed AWS resources. +As `cdk diff` will synthesize the full (Cloudformation) stack to do so, it will +produce errors when errors are present in any of the CDK code (where those +errors would not have been caught by the unit tests). + +If the validation reports any errors, inspect them and correct the code accordingly. + +This validation step allows the developer to fix any errors before deployment, +reducing the amount of troubleshooting and fixing that would otherwise be required +on failing or incorrect deployments. + +**Note**: +While some of the existing CDK code (at time of writing, 2024-04-10) +references to external resource in AWS (outside of the CDK stack defined here), +unit testing does not actually query those resources. +As a result, unit testing will not catch changes to or error in those (external) resource definitions. +Only `cdk diff` will query actual AWS resources and produce +errors accordingly if there would be any issues with such externally defined resources. +Consequently, the `cdk diff` step in the `validate-dev` make recipe requires AWS authentication. + +## Deployment +After making all necessary changes to the CDK code and [validating](#validating) +the resulting stack changes are as expected, you can deploy +the new stack to AWS by running the following command: +```bash +# This command will interactively ask for confirmation before deploying security-sensitive changes. +# To disable this approval (e.g. for use in CI/CD pipelines), add "--require-approval never" +> cdk deploy +``` +Any code pushed to the main branch of this repository (both main application and CDK code) +automatically gets built and deployed, through [github actions](./.github/workflows/main-build-and-deploy.yml). + +## Other useful CDK commands +Here's a list of the most useful CDK commands. For a full list, call `cdk help`. + * `cdk ls` list all stacks in the app + * `cdk synth` emits the synthesized CloudFormation template + * `cdk deploy` deploy this stack to AWS + * `cdk diff` compare deployed stack with current state + * `cdk docs` open CDK documentation diff --git a/webui/aws_infra/__init__.py b/webui/aws_infra/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/webui/aws_infra/cdk.context.json b/webui/aws_infra/cdk.context.json new file mode 100644 index 00000000..a31b3c72 --- /dev/null +++ b/webui/aws_infra/cdk.context.json @@ -0,0 +1,81 @@ +{ + "vpc-provider:account=100225593120:filter.vpc-id=vpc-55522232:region=us-east-1:returnAsymmetricSubnets=true": { + "vpcId": "vpc-55522232", + "vpcCidrBlock": "172.31.0.0/16", + "availabilityZones": [], + "subnetGroups": [ + { + "name": "Public", + "type": "Public", + "subnets": [ + { + "subnetId": "subnet-3ebf4477", + "cidr": "172.31.0.0/20", + "availabilityZone": "us-east-1a", + "routeTableId": "rtb-c63af6a0" + }, + { + "subnetId": "subnet-df7c7487", + "cidr": "172.31.16.0/20", + "availabilityZone": "us-east-1b", + "routeTableId": "rtb-c63af6a0" + }, + { + "subnetId": "subnet-81c95ee4", + "cidr": "172.31.64.0/20", + "availabilityZone": "us-east-1c", + "routeTableId": "rtb-c63af6a0" + }, + { + "subnetId": "subnet-ff838bd5", + "cidr": "172.31.48.0/20", + "availabilityZone": "us-east-1d", + "routeTableId": "rtb-c63af6a0" + }, + { + "subnetId": "subnet-af62dca3", + "cidr": "172.31.80.0/20", + "availabilityZone": "us-east-1f", + "routeTableId": "rtb-c63af6a0" + } + ] + }, + { + "name": "Private", + "type": "Private", + "subnets": [ + { + "subnetId": "subnet-0d4703177afb1797d", + "cidr": "172.31.96.0/24", + "availabilityZone": "us-east-1a", + "routeTableId": "rtb-05e12b551f60b37ed" + }, + { + "subnetId": "subnet-04262fc338f638054", + "cidr": "172.31.97.0/24", + "availabilityZone": "us-east-1b", + "routeTableId": "rtb-05e12b551f60b37ed" + }, + { + "subnetId": "subnet-044457c061edf85f2", + "cidr": "172.31.98.0/24", + "availabilityZone": "us-east-1c", + "routeTableId": "rtb-05e12b551f60b37ed" + }, + { + "subnetId": "subnet-04019d42d5c9e6fb9", + "cidr": "172.31.99.0/24", + "availabilityZone": "us-east-1d", + "routeTableId": "rtb-05e12b551f60b37ed" + }, + { + "subnetId": "subnet-049778993fb504a7c", + "cidr": "172.31.101.0/24", + "availabilityZone": "us-east-1f", + "routeTableId": "rtb-05e12b551f60b37ed" + } + ] + } + ] + } +} diff --git a/webui/aws_infra/cdk.json b/webui/aws_infra/cdk.json new file mode 100644 index 00000000..3eb946fd --- /dev/null +++ b/webui/aws_infra/cdk.json @@ -0,0 +1,32 @@ +{ + "app": "python3 cdk_app.py", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "requirements.txt", + "tests/", + "Makefile", + "**/__init__.py", + "python/__pycache__" + ] + }, + "context": { + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/core:target-partitions": ["aws", "aws-cn"], + "@aws-cdk/core:stackRelativeExports": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true + } +} diff --git a/webui/aws_infra/cdk_app.py b/webui/aws_infra/cdk_app.py new file mode 100644 index 00000000..41fb4dd3 --- /dev/null +++ b/webui/aws_infra/cdk_app.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +from aws_cdk import App + +from cdk_classes.webui_eb_app import WebUiEbApplicationCdkStack +from cdk_classes.webui_eb_env import WebUiEbEnvironmentCdkStack +from cdk_classes.webui_image_repo import WebUiImageRepoCdkStack + +from pavi_shared_aws_infra.agr_aws_env import agr_aws_environment + + +app = App() + +WebUiImageRepoCdkStack( + app, "PaviWebUiImageRepoCdkStack", + env=agr_aws_environment) + +eb_app_stack = WebUiEbApplicationCdkStack( + app, "PaviWebUiEbApplicationCdkStack", + env=agr_aws_environment) + +WebUiEbEnvironmentCdkStack( + app, "PaviWebUiEbMainStack", + eb_app_stack=eb_app_stack, + env_suffix='main', + env=agr_aws_environment) + +WebUiEbEnvironmentCdkStack( + app, "PaviWebUiEbDevStack", + eb_app_stack=eb_app_stack, + env_suffix='dev', + env=agr_aws_environment) + +app.synth() diff --git a/webui/aws_infra/cdk_classes/__init__.py b/webui/aws_infra/cdk_classes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/webui/aws_infra/cdk_classes/webui_eb_app.py b/webui/aws_infra/cdk_classes/webui_eb_app.py new file mode 100644 index 00000000..8d2de036 --- /dev/null +++ b/webui/aws_infra/cdk_classes/webui_eb_app.py @@ -0,0 +1,13 @@ +from constructs import Construct + +from typing import Any + +from pavi_shared_aws_infra.shared_cdk_classes.application_stack import EBApplicationCdkStack + + +class WebUiEbApplicationCdkStack(EBApplicationCdkStack): + def __init__(self, scope: Construct, construct_id: str, **kwargs: Any): + super().__init__( + scope, construct_id, + component_name='webui', + **kwargs) diff --git a/webui/aws_infra/cdk_classes/webui_eb_env.py b/webui/aws_infra/cdk_classes/webui_eb_env.py new file mode 100644 index 00000000..21026c56 --- /dev/null +++ b/webui/aws_infra/cdk_classes/webui_eb_env.py @@ -0,0 +1,65 @@ +from aws_cdk import ( + aws_elasticbeanstalk as eb, + aws_iam as iam, + Stack, + Tags as cdk_tags +) + +from constructs import Construct + +from os import getenv +from typing import Any + +from pavi_shared_aws_infra.shared_cdk_classes.application_stack import EBApplicationCdkStack, defineEbEnvironmentCdkConstructs + + +class WebUiEbEnvironmentCdkStack(Stack): + eb_ec2_role: iam.Role + extra_option_setting_properties: list[eb.CfnEnvironment.OptionSettingProperty] + + def __init__(self, scope: Construct, construct_id: str, env_suffix: str, eb_app_stack: EBApplicationCdkStack, **kwargs: Any) -> None: + """ + Args: + scope: CDK scope + construct_id: ID used to uniquely identify construct withing the given scope + env_suffix: environment suffix, added to created resource names + """ + super().__init__(scope, construct_id, **kwargs) + + # Define role and instance profile + self.eb_ec2_role = iam.Role( + self, 'eb-ec2-role', + assumed_by=iam.ServicePrincipal('ec2.amazonaws.com'), # type: ignore + managed_policies=[ + iam.ManagedPolicy.from_aws_managed_policy_name('AWSElasticBeanstalkWebTier'), + iam.ManagedPolicy.from_aws_managed_policy_name('CloudWatchAgentServerPolicy'), + iam.ManagedPolicy.from_managed_policy_name(self, "iam-ecr-read-policy", "ReadOnlyAccessECR")]) + + cdk_tags.of(self.eb_ec2_role).add("Product", "PAVI") # type: ignore + cdk_tags.of(self.eb_ec2_role).add("Managed_by", "PAVI") # type: ignore + + # Create EB environment to run the application + # Environment-defined settings are defined here, + # Settings that are bundeled into the application version are defined in .ebextensions/ + self.extra_option_setting_properties = [ + eb.CfnEnvironment.OptionSettingProperty( + namespace='aws:elasticbeanstalk:application:environment', + option_name='AGR_PAVI_RELEASE', + value=getenv('PAVI_IMAGE_TAG') + ), + eb.CfnEnvironment.OptionSettingProperty( + namespace='aws:elasticbeanstalk:application:environment', + option_name='REGISTRY', + value=getenv('PAVI_IMAGE_REGISTRY') + ), + eb.CfnEnvironment.OptionSettingProperty( + namespace='aws:elasticbeanstalk:application:environment', + option_name='PAVI_API_BASE_URL', + value=getenv('PAVI_API_BASE_URL') + ) + ] + + defineEbEnvironmentCdkConstructs( + self, env_suffix=env_suffix, + eb_app_stack=eb_app_stack, eb_ec2_role=self.eb_ec2_role, + extra_option_setting_properties=self.extra_option_setting_properties) diff --git a/webui/aws_infra/cdk_classes/webui_image_repo.py b/webui/aws_infra/cdk_classes/webui_image_repo.py new file mode 100644 index 00000000..e92681b0 --- /dev/null +++ b/webui/aws_infra/cdk_classes/webui_image_repo.py @@ -0,0 +1,13 @@ +from constructs import Construct + +from typing import Any + +from pavi_shared_aws_infra.shared_cdk_classes.image_repo_stack import ImageRepoCdkStack + + +class WebUiImageRepoCdkStack(ImageRepoCdkStack): + def __init__(self, scope: Construct, construct_id: str, **kwargs: Any): + super().__init__( + scope, construct_id, + component_name='webui', + **kwargs) diff --git a/webui/aws_infra/mypy.ini b/webui/aws_infra/mypy.ini new file mode 100644 index 00000000..98f22f72 --- /dev/null +++ b/webui/aws_infra/mypy.ini @@ -0,0 +1,11 @@ +[mypy] +disallow_any_generics = True +disallow_untyped_defs = True +disallow_incomplete_defs = True +check_untyped_defs = True +warn_unused_ignores = False +warn_return_any = True +strict_equality = True +enable_error_code = explicit-override,truthy-bool,truthy-iterable,possibly-undefined +follow_imports = skip +exclude = venv diff --git a/webui/aws_infra/pyproject.toml b/webui/aws_infra/pyproject.toml new file mode 100644 index 00000000..972c3b18 --- /dev/null +++ b/webui/aws_infra/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "webui-aws_infra" +version = "0.1.0" +description = "PAVI webUI AWS resource definitions" +readme = "README.md" +authors = [ + {name = "Manuel Luypaert", email = "luypaert@ebi.ac.uk"} +] + +requires-python = "==3.12.*" +dependencies = [ + # CDK requirements + "aws-cdk-lib==2.*", + "constructs==10.*", + # PAVI shared AWS infra + "pavi_shared_aws_infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl" +] + +[project.optional-dependencies] +test = [ + "flake8==7.0.*", + "mypy==1.10.*", + "pytest==8.2.*" +] + +[tool.setuptools.packages.find] +exclude = ["node_modules/*"] diff --git a/webui/aws_infra/requirements.txt b/webui/aws_infra/requirements.txt new file mode 100644 index 00000000..53743a5f --- /dev/null +++ b/webui/aws_infra/requirements.txt @@ -0,0 +1,119 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --generate-hashes --output-file=requirements.txt +# +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 + # via + # cattrs + # jsii +aws-cdk-asset-awscli-v1==2.2.202 \ + --hash=sha256:3ef87d6530736b3a7b0f777fe3b4297994dd40c3ce9306d95f80f48fb18036e8 \ + --hash=sha256:96205ea2e5e132ec52fabfff37ea25b9b859498f167d05b32564c949822cd331 + # via aws-cdk-lib +aws-cdk-asset-kubectl-v20==2.1.2 \ + --hash=sha256:346283e43018a43e3b3ca571de3f44e85d49c038dc20851894cb8f9b2052b164 \ + --hash=sha256:7f0617ab6cb942b066bd7174bf3e1f377e57878c3e1cddc21d6b2d13c92d0cc1 + # via aws-cdk-lib +aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ + --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ + --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb + # via aws-cdk-lib +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 + # via + # pavi-shared-aws-infra + # webui-aws_infra (pyproject.toml) +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d + # via pavi-shared-aws-infra +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 + # via + # boto3 + # s3transfer +cattrs==23.2.3 \ + --hash=sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108 \ + --hash=sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f + # via jsii +click==8.1.7 \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de + # via pavi-shared-aws-infra +constructs==10.3.0 \ + --hash=sha256:2972f514837565ff5b09171cfba50c0159dfa75ee86a42921ea8c86f2941b3d2 \ + --hash=sha256:518551135ec236f9cc6b86500f4fbbe83b803ccdc6c2cb7684e0b7c4d234e7b1 + # via + # aws-cdk-lib + # pavi-shared-aws-infra + # webui-aws_infra (pyproject.toml) +importlib-resources==6.4.0 \ + --hash=sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c \ + --hash=sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145 + # via jsii +jmespath==1.0.1 \ + --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ + --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe + # via + # boto3 + # botocore +jsii==1.101.0 \ + --hash=sha256:043c4d3d0d09af3c7265747f4da9c95770232477f75c846640df4c63d01b19cb \ + --hash=sha256:b78b87f8316560040ad0b9dca1682d73b6532a33acf4ecf56185d1ae5edb54fa + # via + # aws-cdk-asset-awscli-v1 + # aws-cdk-asset-kubectl-v20 + # aws-cdk-asset-node-proxy-agent-v6 + # aws-cdk-lib + # constructs +pavi-shared-aws-infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl \ + --hash=sha256:c6ac11dc41bf2774d5ee49cd3eb3bb2acc35c02d81d1715e325e23c49ae27a9d + # via webui-aws_infra (pyproject.toml) +publication==0.0.3 \ + --hash=sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6 \ + --hash=sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4 + # via + # aws-cdk-asset-awscli-v1 + # aws-cdk-asset-kubectl-v20 + # aws-cdk-asset-node-proxy-agent-v6 + # aws-cdk-lib + # constructs + # jsii +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # botocore + # jsii +s3transfer==0.10.2 \ + --hash=sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6 \ + --hash=sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69 + # via boto3 +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via python-dateutil +typeguard==2.13.3 \ + --hash=sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4 \ + --hash=sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1 + # via + # aws-cdk-asset-awscli-v1 + # aws-cdk-asset-kubectl-v20 + # aws-cdk-asset-node-proxy-agent-v6 + # aws-cdk-lib + # constructs + # jsii +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 + # via jsii +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 + # via botocore diff --git a/webui/aws_infra/tests/requirements.txt b/webui/aws_infra/tests/requirements.txt new file mode 100644 index 00000000..092b9a88 --- /dev/null +++ b/webui/aws_infra/tests/requirements.txt @@ -0,0 +1,186 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --extra=test --generate-hashes --output-file=tests/requirements.txt +# +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 + # via + # cattrs + # jsii +aws-cdk-asset-awscli-v1==2.2.202 \ + --hash=sha256:3ef87d6530736b3a7b0f777fe3b4297994dd40c3ce9306d95f80f48fb18036e8 \ + --hash=sha256:96205ea2e5e132ec52fabfff37ea25b9b859498f167d05b32564c949822cd331 + # via aws-cdk-lib +aws-cdk-asset-kubectl-v20==2.1.2 \ + --hash=sha256:346283e43018a43e3b3ca571de3f44e85d49c038dc20851894cb8f9b2052b164 \ + --hash=sha256:7f0617ab6cb942b066bd7174bf3e1f377e57878c3e1cddc21d6b2d13c92d0cc1 + # via aws-cdk-lib +aws-cdk-asset-node-proxy-agent-v6==2.0.3 \ + --hash=sha256:b62cb10c69a42cab135e6bc670e3d2d3121fd4f53a0f61e53449da4b12738a6f \ + --hash=sha256:ef2ff0634ab037e2ebddbe69d7c92515a847c6c8bb2abdfc85b089f5e87761cb + # via aws-cdk-lib +aws-cdk-lib==2.147.3 \ + --hash=sha256:0e8c26fc0817b549a78c7f3ae82ede4fb4aebde57391f1625e50c89498a552e0 \ + --hash=sha256:1734532c094310d6a2a884db4c2566f7163b8ecb1a669efaffc1e07b5783dd71 + # via + # pavi-shared-aws-infra + # webui-aws_infra (pyproject.toml) +boto3==1.34.139 \ + --hash=sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf \ + --hash=sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d + # via pavi-shared-aws-infra +botocore==1.34.139 \ + --hash=sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba \ + --hash=sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77 + # via + # boto3 + # s3transfer +cattrs==23.2.3 \ + --hash=sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108 \ + --hash=sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f + # via jsii +click==8.1.7 \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de + # via pavi-shared-aws-infra +constructs==10.3.0 \ + --hash=sha256:2972f514837565ff5b09171cfba50c0159dfa75ee86a42921ea8c86f2941b3d2 \ + --hash=sha256:518551135ec236f9cc6b86500f4fbbe83b803ccdc6c2cb7684e0b7c4d234e7b1 + # via + # aws-cdk-lib + # pavi-shared-aws-infra + # webui-aws_infra (pyproject.toml) +flake8==7.0.0 \ + --hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \ + --hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3 + # via webui-aws_infra (pyproject.toml) +importlib-resources==6.4.0 \ + --hash=sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c \ + --hash=sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145 + # via jsii +iniconfig==2.0.0 \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + # via pytest +jmespath==1.0.1 \ + --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ + --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe + # via + # boto3 + # botocore +jsii==1.101.0 \ + --hash=sha256:043c4d3d0d09af3c7265747f4da9c95770232477f75c846640df4c63d01b19cb \ + --hash=sha256:b78b87f8316560040ad0b9dca1682d73b6532a33acf4ecf56185d1ae5edb54fa + # via + # aws-cdk-asset-awscli-v1 + # aws-cdk-asset-kubectl-v20 + # aws-cdk-asset-node-proxy-agent-v6 + # aws-cdk-lib + # constructs +mccabe==0.7.0 \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via flake8 +mypy==1.10.1 \ + --hash=sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9 \ + --hash=sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d \ + --hash=sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0 \ + --hash=sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3 \ + --hash=sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3 \ + --hash=sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade \ + --hash=sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31 \ + --hash=sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7 \ + --hash=sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e \ + --hash=sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7 \ + --hash=sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c \ + --hash=sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b \ + --hash=sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e \ + --hash=sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531 \ + --hash=sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04 \ + --hash=sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a \ + --hash=sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37 \ + --hash=sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a \ + --hash=sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f \ + --hash=sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84 \ + --hash=sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d \ + --hash=sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f \ + --hash=sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a \ + --hash=sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf \ + --hash=sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7 \ + --hash=sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02 \ + --hash=sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3 + # via webui-aws_infra (pyproject.toml) +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 + # via mypy +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 + # via pytest +pavi-shared-aws-infra @ file:///tmp/pavi_shared_aws_infra-0.0.0-py3-none-any.whl \ + --hash=sha256:c6ac11dc41bf2774d5ee49cd3eb3bb2acc35c02d81d1715e325e23c49ae27a9d + # via webui-aws_infra (pyproject.toml) +pluggy==1.5.0 \ + --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 + # via pytest +publication==0.0.3 \ + --hash=sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6 \ + --hash=sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4 + # via + # aws-cdk-asset-awscli-v1 + # aws-cdk-asset-kubectl-v20 + # aws-cdk-asset-node-proxy-agent-v6 + # aws-cdk-lib + # constructs + # jsii +pycodestyle==2.11.1 \ + --hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \ + --hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67 + # via flake8 +pyflakes==3.2.0 \ + --hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a + # via flake8 +pytest==8.2.2 \ + --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ + --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 + # via webui-aws_infra (pyproject.toml) +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # botocore + # jsii +s3transfer==0.10.2 \ + --hash=sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6 \ + --hash=sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69 + # via boto3 +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via python-dateutil +typeguard==2.13.3 \ + --hash=sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4 \ + --hash=sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1 + # via + # aws-cdk-asset-awscli-v1 + # aws-cdk-asset-kubectl-v20 + # aws-cdk-asset-node-proxy-agent-v6 + # aws-cdk-lib + # constructs + # jsii +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 + # via + # jsii + # mypy +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 + # via botocore diff --git a/webui/aws_infra/tests/unit/test_cdk_application_stack.py b/webui/aws_infra/tests/unit/test_cdk_application_stack.py new file mode 100644 index 00000000..93819879 --- /dev/null +++ b/webui/aws_infra/tests/unit/test_cdk_application_stack.py @@ -0,0 +1,50 @@ +""" +Unit testing for the cdk_image_repo_stack, +to ensure breaking changes are caught and handled +before getting applied to the live AWS resources. +""" + +from aws_cdk import App +from aws_cdk.aws_config import ResourceType +import aws_cdk.assertions as assertions + +from cdk_classes.webui_eb_app import WebUiEbApplicationCdkStack +from cdk_classes.webui_eb_env import WebUiEbEnvironmentCdkStack + +from pavi_shared_aws_infra.agr_aws_env import agr_aws_environment + +app = App() +eb_app_stack = WebUiEbApplicationCdkStack( + app, "pytest-webui-EB-Application-stack", + env=agr_aws_environment) + +eb_env_stack = WebUiEbEnvironmentCdkStack( + app, "pytest-webui-env-stack", env_suffix='pytest', + eb_app_stack=eb_app_stack, + env=agr_aws_environment) + +eb_app_template = assertions.Template.from_stack(eb_app_stack) +eb_env_template = assertions.Template.from_stack(eb_env_stack) + + +# If below application name changes, then ensure this change is intentional. +# Such change may possibility break deploying the same application version to multiple environments +def test_eb_application() -> None: + eb_app_template.has_resource(type=ResourceType.ELASTIC_BEANSTALK_APPLICATION.compliance_resource_type, props={ + "Properties": { + "ApplicationName": "PAVI-webui" + } + }) + + +# If below environment name changes, then ensure this change is intentional. +# The environment name change could potentially break DNS rules or have unexpected deployment consequences +# (several environment getting mashed together if prefixing did not happen appropriately) +# All EB environments must belong to 'PAVI-webui' EB application. +def test_eb_app_version() -> None: + eb_env_template.has_resource(type=ResourceType.ELASTIC_BEANSTALK_ENVIRONMENT.compliance_resource_type, props={ + "Properties": { + "ApplicationName": "PAVI-webui", + "EnvironmentName": "PAVI-webui-pytest" + } + }) diff --git a/webui/aws_infra/tests/unit/test_image_repo_cdk_stack.py b/webui/aws_infra/tests/unit/test_image_repo_cdk_stack.py new file mode 100644 index 00000000..7e60ec55 --- /dev/null +++ b/webui/aws_infra/tests/unit/test_image_repo_cdk_stack.py @@ -0,0 +1,36 @@ +""" +Unit testing for the cdk_image_repo_stack, +to ensure breaking changes are caught and handled +before getting applied to the live AWS resources. +""" + +from aws_cdk import App +from aws_cdk.aws_config import ResourceType +import aws_cdk.assertions as assertions + +from cdk_classes.webui_image_repo import WebUiImageRepoCdkStack + +from pavi_shared_aws_infra.agr_aws_env import agr_aws_environment + +app = App() +stack = WebUiImageRepoCdkStack( + app, "pytest-stack", + env=agr_aws_environment +) +template = assertions.Template.from_stack(stack) + + +# If any of the below ECR repository names change, then ensure this change is intentional. +# If so, take below manual steps before merging to ensure correct PAVI deployment and execution: +# * Update all references to respective repository name in all PAVI code to match the new name +# * Update RepositoryName in below unit test(s) to match the new name +# * The old ECR repository will not be cleanup up automatically, so after merging and deployment: +# * Move All images from the old ECR repository to the new one +# (or delete the images if no longer relevant) +# * Delete the old ECR repository +def test_webui_ecr_repo() -> None: + template.has_resource(type=ResourceType.ECR_REPOSITORY.compliance_resource_type, props={ + "Properties": { + "RepositoryName": "agr_pavi/webui" + } + }) diff --git a/webui/package-lock.json b/webui/package-lock.json index b3005841..e7a068a1 100644 --- a/webui/package-lock.json +++ b/webui/package-lock.json @@ -53,9 +53,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "peer": true, "engines": { @@ -405,9 +405,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -579,9 +579,9 @@ "peer": true }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "peer": true, "bin": { @@ -650,12 +650,12 @@ "peer": true }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, "dependencies": { - "dequal": "^2.0.3" + "deep-equal": "^2.0.5" } }, "node_modules/array-buffer-byte-length": { @@ -851,21 +851,21 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", "dev": true, "dependencies": { - "dequal": "^2.0.3" + "deep-equal": "^2.0.5" } }, "node_modules/balanced-match": { @@ -937,9 +937,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001632", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz", - "integrity": "sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "funding": [ { "type": "opencollective", @@ -1094,6 +1094,38 @@ } } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1135,15 +1167,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1284,6 +1307,26 @@ "node": ">= 0.4" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-iterator-helpers": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", @@ -1589,27 +1632,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" }, "engines": { "node": ">=4.0" @@ -1619,16 +1662,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", - "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", @@ -1923,9 +1966,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.0.tgz", - "integrity": "sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -2074,9 +2117,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2315,6 +2358,22 @@ "node": ">= 0.4" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -2387,12 +2446,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2857,9 +2919,9 @@ } }, "node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -3032,10 +3094,29 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3307,9 +3388,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -3327,7 +3408,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -3766,6 +3847,18 @@ "node": ">=0.10.0" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -3839,6 +3932,16 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",