Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to Python 3.12 #10235

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions .circleci/config.yml
Expand Up @@ -3,10 +3,10 @@ version: 2.1
parameters:
ubuntu-amd64-machine-image:
type: string
default: "ubuntu-2204:2023.02.1"
default: "ubuntu-2204:2024.01.1"
ubuntu-arm64-machine-image:
type: string
default: "ubuntu-2204:2023.02.1"
default: "ubuntu-2204:2024.01.1"
skip_test_selection:
type: boolean
default: false
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/asf-updates.yml
Expand Up @@ -19,11 +19,11 @@ jobs:
sudo apt-get update
sudo apt-get install jq

- name: Set up Python 3.11
- name: Set up Python 3.12
id: setup-python
uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.12'

- name: Cache LocalStack community dependencies (venv)
uses: actions/cache@v4
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/marker-report-issue.yml
Expand Up @@ -33,7 +33,7 @@ jobs:
id: setup-python
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"

- name: Install dependencies
run: make install-dev
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/marker-report.yml
Expand Up @@ -23,7 +23,7 @@ jobs:
id: setup-python
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"

- name: Cache LocalStack community dependencies (venv)
uses: actions/cache@v4
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tests-podman.yml
Expand Up @@ -29,7 +29,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.12"

- name: Install podman and test dependencies
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/tests-pro-integration.yml
Expand Up @@ -192,11 +192,11 @@ jobs:
token: ${{ secrets.PRO_ACCESS_TOKEN }}
path: localstack-ext

- name: Set up Python 3.11
- name: Set up Python 3.12
id: setup-python
uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.12'

- name: Set up Node 18.x
uses: actions/setup-node@v4
Expand Down
2 changes: 1 addition & 1 deletion .python-version
@@ -1 +1 @@
3.11
3.12
6 changes: 3 additions & 3 deletions Dockerfile
Expand Up @@ -29,7 +29,7 @@ jdk.localedata --include-locales en,th \


# base: Stage which installs necessary runtime dependencies (OS packages, java,...)
FROM python:3.11.9-slim-bookworm@sha256:6d2502238109c929569ae99355e28890c438cb11bc88ef02cd189c173b3db07c as base
FROM python:3.12.3-slim-bookworm@sha256:2be8daddbb82756f7d1f2c7ece706aadcb284bf6ab6d769ea695cc3ed6016743 as base
ARG TARGETARCH

# Install runtime OS package dependencies
Expand Down Expand Up @@ -192,9 +192,9 @@ RUN --mount=type=cache,target=/root/.cache \
chmod -R 777 /usr/lib/localstack

# link the python package installer virtual environments into the localstack venv
RUN echo /var/lib/localstack/lib/python-packages/lib/python3.11/site-packages > localstack-var-python-packages-venv.pth && \
RUN echo /var/lib/localstack/lib/python-packages/lib/python3.12/site-packages > localstack-var-python-packages-venv.pth && \
mv localstack-var-python-packages-venv.pth .venv/lib/python*/site-packages/
RUN echo /usr/lib/localstack/python-packages/lib/python3.11/site-packages > localstack-static-python-packages-venv.pth && \
RUN echo /usr/lib/localstack/python-packages/lib/python3.12/site-packages > localstack-static-python-packages-venv.pth && \
mv localstack-static-python-packages-venv.pth .venv/lib/python*/site-packages/

# expose edge service, external service ports, and debugpy
Expand Down
8 changes: 4 additions & 4 deletions Dockerfile.s3
@@ -1,5 +1,5 @@
# base: Stage which installs necessary runtime dependencies (OS packages, filesystem...)
FROM python:3.11.9-slim-bookworm@sha256:6d2502238109c929569ae99355e28890c438cb11bc88ef02cd189c173b3db07c as base
FROM python:3.12.3-slim-bookworm@sha256:2be8daddbb82756f7d1f2c7ece706aadcb284bf6ab6d769ea695cc3ed6016743 as base
ARG TARGETARCH

# set workdir
Expand Down Expand Up @@ -68,7 +68,7 @@ RUN . .venv/bin/activate && pip3 freeze -l > requirements-runtime.txt

# delete the botocore specs for other services (>80mb)
# TODO: well now it's compressed and it's much lighter: 20mb maybe not worth it
RUN find .venv/lib/python3.11/site-packages/botocore/data/ -mindepth 1 -maxdepth 1 -type d -not -name s3 -exec rm -rf '{}' \;
RUN find .venv/lib/python3.12/site-packages/botocore/data/ -mindepth 1 -maxdepth 1 -type d -not -name s3 -exec rm -rf '{}' \;


# final stage: Builds upon base stage and copies resources from builder stages
Expand All @@ -88,9 +88,9 @@ RUN make entrypoints


# link the python package installer virtual environments into the localstack venv
RUN echo /var/lib/localstack/lib/python-packages/lib/python3.11/site-packages > localstack-var-python-packages-venv.pth && \
RUN echo /var/lib/localstack/lib/python-packages/lib/python3.12/site-packages > localstack-var-python-packages-venv.pth && \
mv localstack-var-python-packages-venv.pth .venv/lib/python*/site-packages/
RUN echo /usr/lib/localstack/python-packages/lib/python3.11/site-packages > localstack-static-python-packages-venv.pth && \
RUN echo /usr/lib/localstack/python-packages/lib/python3.12/site-packages > localstack-static-python-packages-venv.pth && \
mv localstack-static-python-packages-venv.pth .venv/lib/python*/site-packages/

# expose edge service and debugpy
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Expand Up @@ -202,7 +202,7 @@ docker-run: ## Run Docker image locally

docker-mount-run:
MOTO_DIR=$$(echo $$(pwd)/.venv/lib/python*/site-packages/moto | awk '{print $$NF}'); echo MOTO_DIR $$MOTO_DIR; \
DOCKER_FLAGS="$(DOCKER_FLAGS) -v `pwd`/localstack/constants.py:/opt/code/localstack/localstack/constants.py -v `pwd`/localstack/config.py:/opt/code/localstack/localstack/config.py -v `pwd`/localstack/plugins.py:/opt/code/localstack/localstack/plugins.py -v `pwd`/localstack/plugin:/opt/code/localstack/localstack/plugin -v `pwd`/localstack/runtime:/opt/code/localstack/localstack/runtime -v `pwd`/localstack/utils:/opt/code/localstack/localstack/utils -v `pwd`/localstack/services:/opt/code/localstack/localstack/services -v `pwd`/localstack/http:/opt/code/localstack/localstack/http -v `pwd`/localstack/contrib:/opt/code/localstack/localstack/contrib -v `pwd`/tests:/opt/code/localstack/tests -v $$MOTO_DIR:/opt/code/localstack/.venv/lib/python3.11/site-packages/moto/" make docker-run
DOCKER_FLAGS="$(DOCKER_FLAGS) -v `pwd`/localstack/constants.py:/opt/code/localstack/localstack/constants.py -v `pwd`/localstack/config.py:/opt/code/localstack/localstack/config.py -v `pwd`/localstack/plugins.py:/opt/code/localstack/localstack/plugins.py -v `pwd`/localstack/plugin:/opt/code/localstack/localstack/plugin -v `pwd`/localstack/runtime:/opt/code/localstack/localstack/runtime -v `pwd`/localstack/utils:/opt/code/localstack/localstack/utils -v `pwd`/localstack/services:/opt/code/localstack/localstack/services -v `pwd`/localstack/http:/opt/code/localstack/localstack/http -v `pwd`/localstack/contrib:/opt/code/localstack/localstack/contrib -v `pwd`/tests:/opt/code/localstack/tests -v $$MOTO_DIR:/opt/code/localstack/.venv/lib/python3.12/site-packages/moto/" make docker-run

docker-cp-coverage:
@echo 'Extracting .coverage file from Docker image'; \
Expand All @@ -228,13 +228,13 @@ test-docker-mount: ## Run automated tests in Docker (mounting local code)
# TODO: find a cleaner way to mount/copy the dependencies into the container...
VENV_DIR=$$(pwd)/.venv/; \
PKG_DIR=$$(echo $$VENV_DIR/lib/python*/site-packages | awk '{print $$NF}'); \
PKG_DIR_CON=/opt/code/localstack/.venv/lib/python3.11/site-packages; \
PKG_DIR_CON=/opt/code/localstack/.venv/lib/python3.12/site-packages; \
echo "#!/usr/bin/env python" > /tmp/pytest.ls.bin; cat $$VENV_DIR/bin/pytest >> /tmp/pytest.ls.bin; chmod +x /tmp/pytest.ls.bin; \
DOCKER_FLAGS="-v `pwd`/tests:/opt/code/localstack/tests -v /tmp/pytest.ls.bin:/opt/code/localstack/.venv/bin/pytest -v $$PKG_DIR/deepdiff:$$PKG_DIR_CON/deepdiff -v $$PKG_DIR/ordered_set:$$PKG_DIR_CON/ordered_set -v $$PKG_DIR/py:$$PKG_DIR_CON/py -v $$PKG_DIR/pluggy:$$PKG_DIR_CON/pluggy -v $$PKG_DIR/iniconfig:$$PKG_DIR_CON/iniconfig -v $$PKG_DIR/jsonpath_ng:$$PKG_DIR_CON/jsonpath_ng -v $$PKG_DIR/packaging:$$PKG_DIR_CON/packaging -v $$PKG_DIR/pytest:$$PKG_DIR_CON/pytest -v $$PKG_DIR/pytest_httpserver:$$PKG_DIR_CON/pytest_httpserver -v $$PKG_DIR/_pytest:$$PKG_DIR_CON/_pytest -v $$PKG_DIR/_pytest:$$PKG_DIR_CON/orjson" make test-docker-mount-code

test-docker-mount-code:
PACKAGES_DIR=$$(echo $$(pwd)/.venv/lib/python*/site-packages | awk '{print $$NF}'); \
DOCKER_FLAGS="$(DOCKER_FLAGS) --entrypoint= -v `pwd`/localstack/config.py:/opt/code/localstack/localstack/config.py -v `pwd`/localstack/constants.py:/opt/code/localstack/localstack/constants.py -v `pwd`/localstack/utils:/opt/code/localstack/localstack/utils -v `pwd`/localstack/services:/opt/code/localstack/localstack/services -v `pwd`/localstack/aws:/opt/code/localstack/localstack/aws -v `pwd`/Makefile:/opt/code/localstack/Makefile -v $$PACKAGES_DIR/moto:/opt/code/localstack/.venv/lib/python3.11/site-packages/moto/ -e TEST_PATH=\\'$(TEST_PATH)\\' -e LAMBDA_JAVA_OPTS=$(LAMBDA_JAVA_OPTS) $(ENTRYPOINT)" CMD="make test" make docker-run
DOCKER_FLAGS="$(DOCKER_FLAGS) --entrypoint= -v `pwd`/localstack/config.py:/opt/code/localstack/localstack/config.py -v `pwd`/localstack/constants.py:/opt/code/localstack/localstack/constants.py -v `pwd`/localstack/utils:/opt/code/localstack/localstack/utils -v `pwd`/localstack/services:/opt/code/localstack/localstack/services -v `pwd`/localstack/aws:/opt/code/localstack/localstack/aws -v `pwd`/Makefile:/opt/code/localstack/Makefile -v $$PACKAGES_DIR/moto:/opt/code/localstack/.venv/lib/python3.12/site-packages/moto/ -e TEST_PATH=\\'$(TEST_PATH)\\' -e LAMBDA_JAVA_OPTS=$(LAMBDA_JAVA_OPTS) $(ENTRYPOINT)" CMD="make test" make docker-run

lint: ## Run code linter to check code style, check if formatter would make changes and check if dependency pins need to be updated
($(VENV_RUN); python -m ruff check --output-format=full . && python -m ruff format --check .)
Expand Down
2 changes: 1 addition & 1 deletion localstack/dev/run/paths.py
Expand Up @@ -43,7 +43,7 @@ class ContainerPaths:
"""Important paths in the container"""

project_dir: str = "/opt/code/localstack"
site_packages_target_dir: str = "/opt/code/localstack/.venv/lib/python3.11/site-packages"
site_packages_target_dir: str = "/opt/code/localstack/.venv/lib/python3.12/site-packages"
docker_entrypoint: str = "/usr/local/bin/docker-entrypoint.sh"
localstack_supervisor: str = "/usr/local/bin/localstack-supervisor"
localstack_source_dir: str
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Expand Up @@ -31,7 +31,7 @@ dependencies = [
dynamic = ["version"]
classifiers = [
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"License :: OSI Approved :: Apache Software License",
"Topic :: Internet",
"Topic :: Software Development :: Testing",
Expand Down
10 changes: 5 additions & 5 deletions requirements-base-runtime.txt
@@ -1,5 +1,5 @@
#
# This file is autogenerated by pip-compile with Python 3.11
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --extra=base-runtime --output-file=requirements-base-runtime.txt --strip-extras --unsafe-package=distribute --unsafe-package=localstack-core --unsafe-package=pip --unsafe-package=setuptools pyproject.toml
Expand Down Expand Up @@ -40,7 +40,7 @@ click==8.1.7
# quart
constantly==23.10.4
# via localstack-twisted
cryptography==42.0.5
cryptography==42.0.6
# via
# localstack-core (pyproject.toml)
# pyopenssl
Expand Down Expand Up @@ -85,7 +85,7 @@ itsdangerous==2.2.0
# via
# flask
# quart
jinja2==3.1.3
jinja2==3.1.4
# via
# flask
# quart
Expand Down Expand Up @@ -124,7 +124,7 @@ psutil==5.9.8
# via localstack-core (pyproject.toml)
pycparser==2.22
# via cffi
pygments==2.17.2
pygments==2.18.0
# via rich
pyopenssl==24.1.0
# via
Expand Down Expand Up @@ -180,7 +180,7 @@ urllib3==2.2.1
# requests
websocket-client==1.8.0
# via docker
werkzeug==3.0.2
werkzeug==3.0.3
# via
# flask
# localstack-core (pyproject.toml)
Expand Down
6 changes: 3 additions & 3 deletions requirements-basic.txt
@@ -1,5 +1,5 @@
#
# This file is autogenerated by pip-compile with Python 3.11
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --output-file=requirements-basic.txt --strip-extras --unsafe-package=distribute --unsafe-package=localstack-core --unsafe-package=pip --unsafe-package=setuptools pyproject.toml
Expand All @@ -16,7 +16,7 @@ charset-normalizer==3.3.2
# via requests
click==8.1.7
# via localstack-core (pyproject.toml)
cryptography==42.0.5
cryptography==42.0.6
# via localstack-core (pyproject.toml)
dill==0.3.6
# via localstack-core (pyproject.toml)
Expand All @@ -40,7 +40,7 @@ psutil==5.9.8
# via localstack-core (pyproject.toml)
pycparser==2.22
# via cffi
pygments==2.17.2
pygments==2.18.0
# via rich
pyproject-hooks==1.1.0
# via build
Expand Down
24 changes: 12 additions & 12 deletions requirements-dev.txt
@@ -1,5 +1,5 @@
#
# This file is autogenerated by pip-compile with Python 3.11
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --extra=dev --output-file=requirements-dev.txt --strip-extras --unsafe-package=distribute --unsafe-package=localstack-core --unsafe-package=pip --unsafe-package=setuptools pyproject.toml
Expand Down Expand Up @@ -37,7 +37,7 @@ aws-cdk-asset-kubectl-v20==2.1.2
# via aws-cdk-lib
aws-cdk-asset-node-proxy-agent-v6==2.0.3
# via aws-cdk-lib
aws-cdk-lib==2.139.1
aws-cdk-lib==2.140.0
# via localstack-core
aws-sam-translator==1.87.0
# via
Expand Down Expand Up @@ -92,7 +92,7 @@ cffi==1.16.0
# via cryptography
cfgv==3.4.0
# via pre-commit
cfn-lint==0.86.4
cfn-lint==0.87.1
# via moto-ext
charset-normalizer==3.3.2
# via requests
Expand All @@ -102,7 +102,7 @@ click==8.1.7
# localstack-core
# localstack-core (pyproject.toml)
# quart
colorama==0.4.4
colorama==0.4.6
# via awscli
constantly==23.10.4
# via localstack-twisted
Expand All @@ -116,7 +116,7 @@ coveralls==4.0.0
# via localstack-core (pyproject.toml)
crontab==1.0.1
# via localstack-core
cryptography==42.0.5
cryptography==42.0.6
# via
# joserfc
# localstack-core
Expand Down Expand Up @@ -205,7 +205,7 @@ itsdangerous==2.2.0
# via
# flask
# quart
jinja2==3.1.3
jinja2==3.1.4
# via
# flask
# moto-ext
Expand All @@ -220,7 +220,7 @@ jpype1==1.5.0
# via localstack-core
jschema-to-python==1.2.3
# via cfn-lint
jsii==1.97.0
jsii==1.98.0
# via
# aws-cdk-asset-awscli-v1
# aws-cdk-asset-kubectl-v20
Expand All @@ -246,7 +246,7 @@ jsonpickle==3.0.4
# via jschema-to-python
jsonpointer==2.4
# via jsonpatch
jsonschema==4.21.1
jsonschema==4.22.0
# via
# aws-sam-translator
# cfn-lint
Expand Down Expand Up @@ -357,9 +357,9 @@ pydantic==2.7.1
# via aws-sam-translator
pydantic-core==2.18.2
# via pydantic
pygments==2.17.2
pygments==2.18.0
# via rich
pymongo==4.7.0
pymongo==4.7.1
# via localstack-core
pyopenssl==24.1.0
# via
Expand Down Expand Up @@ -449,7 +449,7 @@ rsa==4.7.2
# via awscli
rstr==3.2.2
# via localstack-core (pyproject.toml)
ruff==0.4.2
ruff==0.4.3
# via localstack-core (pyproject.toml)
s3transfer==0.10.1
# via
Expand Down Expand Up @@ -515,7 +515,7 @@ websocket-client==1.8.0
# via
# docker
# localstack-core
werkzeug==3.0.2
werkzeug==3.0.3
# via
# flask
# localstack-core
Expand Down