diff --git a/examples/django/django_app/rockcraft.yaml b/examples/django/django_app/rockcraft.yaml index 5084b091b..f963f223c 100644 --- a/examples/django/django_app/rockcraft.yaml +++ b/examples/django/django_app/rockcraft.yaml @@ -1,14 +1,88 @@ -# Copyright 2025 Canonical Ltd. -# See LICENSE file for licensing details. - name: django-app +title: django-app +version: '0.1' summary: Example Django application image. description: Example Django application image. -version: "0.1" base: ubuntu@22.04 -license: Apache-2.0 platforms: amd64: - -extensions: - - django-framework + build-on: + - amd64 + build-for: + - amd64 +license: Apache-2.0 +parts: + django-framework/dependencies: + plugin: python + stage-packages: + - python3-venv + source: . + python-packages: + - gunicorn~=23.0 + python-requirements: + - requirements.txt + build-environment: [] + django-framework/install-app: + plugin: dump + source: django_app + organize: + '*': django/app/ + .*: django/app/ + stage: + - -django/app/db.sqlite3 + permissions: + - owner: 584792 + group: 584792 + django-framework/config-files: + plugin: dump + source: /snap/rockcraft/4238/share/rockcraft/extensions/django-framework + organize: + gunicorn.conf.py: django/gunicorn.conf.py + permissions: + - path: django/gunicorn.conf.py + owner: 584792 + group: 584792 + django-framework/statsd-exporter: + build-snaps: + - go + source-tag: v0.29.0 + plugin: go + source: https://github.com/prometheus/statsd_exporter.git + django-framework/logging: + plugin: nil + override-build: |- + craftctl default + mkdir -p $CRAFT_PART_INSTALL/opt/promtail + mkdir -p $CRAFT_PART_INSTALL/etc/promtail + mkdir -p $CRAFT_PART_INSTALL/var/log/django + permissions: + - path: opt/promtail + owner: 584792 + group: 584792 + - path: etc/promtail + owner: 584792 + group: 584792 + - path: var/log/django + owner: 584792 + group: 584792 + django-framework/runtime: + plugin: nil + stage-packages: + - ca-certificates_data +run-user: _daemon_ +services: + django: + override: replace + command: /bin/python3 -m gunicorn -c /django/gunicorn.conf.py django_app.wsgi:application + -k [ sync ] + startup: enabled + after: + - statsd-exporter + user: _daemon_ + statsd-exporter: + override: merge + command: /bin/statsd_exporter --statsd.mapping-config=/statsd-mapping.conf --statsd.listen-udp=localhost:9125 + --statsd.listen-tcp=localhost:9125 + summary: statsd exporter service + startup: enabled + user: _daemon_ diff --git a/examples/django/django_async_app/rockcraft.yaml b/examples/django/django_async_app/rockcraft.yaml index 0c65bc016..f67185150 100644 --- a/examples/django/django_async_app/rockcraft.yaml +++ b/examples/django/django_async_app/rockcraft.yaml @@ -1,14 +1,88 @@ -# Copyright 2025 Canonical Ltd. -# See LICENSE file for licensing details. - name: django-async-app +title: django-async-app +version: '0.1' summary: Example Async Django application image. description: Example Async Django application image. -version: "0.1" base: ubuntu@22.04 -license: Apache-2.0 platforms: amd64: - -extensions: - - django-framework + build-on: + - amd64 + build-for: + - amd64 +license: Apache-2.0 +parts: + django-framework/dependencies: + plugin: python + stage-packages: + - python3-venv + source: . + python-packages: + - gunicorn~=23.0 + python-requirements: + - requirements.txt + build-environment: [] + django-framework/install-app: + plugin: dump + source: django_async_app + organize: + '*': django/app/ + .*: django/app/ + stage: + - -django/app/db.sqlite3 + permissions: + - owner: 584792 + group: 584792 + django-framework/config-files: + plugin: dump + source: /snap/rockcraft/4238/share/rockcraft/extensions/django-framework + organize: + gunicorn.conf.py: django/gunicorn.conf.py + permissions: + - path: django/gunicorn.conf.py + owner: 584792 + group: 584792 + django-framework/statsd-exporter: + build-snaps: + - go + source-tag: v0.29.0 + plugin: go + source: https://github.com/prometheus/statsd_exporter.git + django-framework/logging: + plugin: nil + override-build: |- + craftctl default + mkdir -p $CRAFT_PART_INSTALL/opt/promtail + mkdir -p $CRAFT_PART_INSTALL/etc/promtail + mkdir -p $CRAFT_PART_INSTALL/var/log/django + permissions: + - path: opt/promtail + owner: 584792 + group: 584792 + - path: etc/promtail + owner: 584792 + group: 584792 + - path: var/log/django + owner: 584792 + group: 584792 + django-framework/runtime: + plugin: nil + stage-packages: + - ca-certificates_data +run-user: _daemon_ +services: + django: + override: replace + command: /bin/python3 -m gunicorn -c /django/gunicorn.conf.py django_async_app.wsgi:application + -k [ gevent ] + startup: enabled + after: + - statsd-exporter + user: _daemon_ + statsd-exporter: + override: merge + command: /bin/statsd_exporter --statsd.mapping-config=/statsd-mapping.conf --statsd.listen-udp=localhost:9125 + --statsd.listen-tcp=localhost:9125 + summary: statsd exporter service + startup: enabled + user: _daemon_ diff --git a/examples/flask-minimal/flask_minimal_app/rockcraft.yaml b/examples/flask-minimal/flask_minimal_app/rockcraft.yaml index 786f27cd1..3a531bedb 100644 --- a/examples/flask-minimal/flask_minimal_app/rockcraft.yaml +++ b/examples/flask-minimal/flask_minimal_app/rockcraft.yaml @@ -1,15 +1,100 @@ -# Copyright 2025 Canonical Ltd. -# See LICENSE file for licensing details. name: flask-minimal-app +title: flask-minimal-app +version: '0.1' summary: A flask test app description: OCI image for the test flask app -version: "0.1" base: bare build-base: ubuntu@22.04 -license: Apache-2.0 platforms: amd64: - -extensions: - - flask-framework - + build-on: + - amd64 + build-for: + - amd64 +license: Apache-2.0 +parts: + flask-framework/dependencies: + plugin: python + stage-packages: + - python3.10-venv_ensurepip + source: . + python-packages: + - gunicorn~=23.0 + python-requirements: + - requirements.txt + build-environment: + - PARTS_PYTHON_INTERPRETER: python3.10 + flask-framework/install-app: + plugin: dump + source: . + organize: + app.py: flask/app/app.py + stage: + - flask/app/app.py + prime: + - flask/app/app.py + permissions: + - owner: 584792 + group: 584792 + flask-framework/config-files: + plugin: dump + source: /snap/rockcraft/4238/share/rockcraft/extensions/flask-framework + organize: + gunicorn.conf.py: flask/gunicorn.conf.py + permissions: + - path: flask/gunicorn.conf.py + owner: 584792 + group: 584792 + flask-framework/statsd-exporter: + build-snaps: + - go + source-tag: v0.29.0 + plugin: go + source: https://github.com/prometheus/statsd_exporter.git + flask-framework/logging: + plugin: nil + override-build: |- + craftctl default + mkdir -p $CRAFT_PART_INSTALL/opt/promtail + mkdir -p $CRAFT_PART_INSTALL/etc/promtail + mkdir -p $CRAFT_PART_INSTALL/var/log/flask + permissions: + - path: opt/promtail + owner: 584792 + group: 584792 + - path: etc/promtail + owner: 584792 + group: 584792 + - path: var/log/flask + owner: 584792 + group: 584792 + flask-framework/runtime: + plugin: nil + override-build: |- + mkdir -m 777 ${CRAFT_PART_INSTALL}/tmp + ln -sf /usr/bin/bash ${CRAFT_PART_INSTALL}/usr/bin/sh + stage-packages: + - bash_bins + - coreutils_bins + - ca-certificates_data + flask-framework/runtime-libs: + plugin: nil + stage-packages: + - libstdc++6 +run-user: _daemon_ +services: + flask: + override: replace + command: /bin/python3 -m gunicorn -c /flask/gunicorn.conf.py app:app -k [ sync + ] + startup: enabled + after: + - statsd-exporter + user: _daemon_ + statsd-exporter: + override: merge + command: /bin/statsd_exporter --statsd.mapping-config=/statsd-mapping.conf --statsd.listen-udp=localhost:9125 + --statsd.listen-tcp=localhost:9125 + summary: statsd exporter service + startup: enabled + user: _daemon_ diff --git a/examples/flask/test_async_rock/rockcraft.yaml b/examples/flask/test_async_rock/rockcraft.yaml index f2b0ee266..b119bf29e 100644 --- a/examples/flask/test_async_rock/rockcraft.yaml +++ b/examples/flask/test_async_rock/rockcraft.yaml @@ -1,13 +1,89 @@ -# Copyright 2025 Canonical Ltd. -# See LICENSE file for licensing details. name: test-async-flask +title: test-async-flask +version: '0.1' summary: A flask async worker test app description: OCI image for the async worker test flask app -version: "0.1" base: ubuntu@22.04 -license: Apache-2.0 platforms: amd64: - -extensions: - - flask-framework + build-on: + - amd64 + build-for: + - amd64 +license: Apache-2.0 +parts: + flask-framework/dependencies: + plugin: python + stage-packages: + - python3-venv + source: . + python-packages: + - gunicorn~=23.0 + python-requirements: + - requirements.txt + build-environment: [] + flask-framework/install-app: + plugin: dump + source: . + organize: + app.py: flask/app/app.py + stage: + - flask/app/app.py + prime: + - flask/app/app.py + permissions: + - owner: 584792 + group: 584792 + flask-framework/config-files: + plugin: dump + source: /snap/rockcraft/4238/share/rockcraft/extensions/flask-framework + organize: + gunicorn.conf.py: flask/gunicorn.conf.py + permissions: + - path: flask/gunicorn.conf.py + owner: 584792 + group: 584792 + flask-framework/statsd-exporter: + build-snaps: + - go + source-tag: v0.29.0 + plugin: go + source: https://github.com/prometheus/statsd_exporter.git + flask-framework/logging: + plugin: nil + override-build: |- + craftctl default + mkdir -p $CRAFT_PART_INSTALL/opt/promtail + mkdir -p $CRAFT_PART_INSTALL/etc/promtail + mkdir -p $CRAFT_PART_INSTALL/var/log/flask + permissions: + - path: opt/promtail + owner: 584792 + group: 584792 + - path: etc/promtail + owner: 584792 + group: 584792 + - path: var/log/flask + owner: 584792 + group: 584792 + flask-framework/runtime: + plugin: nil + stage-packages: + - ca-certificates_data +run-user: _daemon_ +services: + flask: + override: replace + command: /bin/python3 -m gunicorn -c /flask/gunicorn.conf.py app:app -k [ gevent + ] + startup: enabled + after: + - statsd-exporter + user: _daemon_ + statsd-exporter: + override: merge + command: /bin/statsd_exporter --statsd.mapping-config=/statsd-mapping.conf --statsd.listen-udp=localhost:9125 + --statsd.listen-tcp=localhost:9125 + summary: statsd exporter service + startup: enabled + user: _daemon_ diff --git a/examples/flask/test_db_rock/rockcraft.yaml b/examples/flask/test_db_rock/rockcraft.yaml index bc3fefa20..3ff68e1c5 100644 --- a/examples/flask/test_db_rock/rockcraft.yaml +++ b/examples/flask/test_db_rock/rockcraft.yaml @@ -1,18 +1,99 @@ -# Copyright 2025 Canonical Ltd. -# See LICENSE file for licensing details. name: test-db-flask +title: test-db-flask +version: '0.1' summary: Default Flask application image. description: Default Flask application image. -version: "0.1" base: ubuntu@22.04 -license: Apache-2.0 platforms: amd64: - -extensions: - - flask-framework - + build-on: + - amd64 + build-for: + - amd64 +license: Apache-2.0 parts: flask-framework/install-app: prime: - - -flask/app/requirements.txt + - -flask/app/requirements.txt + plugin: dump + source: . + organize: + alembic: flask/app/alembic + alembic.ini: flask/app/alembic.ini + app.py: flask/app/app.py + migrate.sh: flask/app/migrate.sh + requirements.txt: flask/app/requirements.txt + rockcraft.yaml: flask/app/rockcraft.yaml + stage: + - flask/app/alembic + - flask/app/alembic.ini + - flask/app/app.py + - flask/app/migrate.sh + - flask/app/requirements.txt + - flask/app/rockcraft.yaml + permissions: + - owner: 584792 + group: 584792 + flask-framework/dependencies: + plugin: python + stage-packages: + - python3-venv + source: . + python-packages: + - gunicorn~=23.0 + python-requirements: + - requirements.txt + build-environment: [] + flask-framework/config-files: + plugin: dump + source: /snap/rockcraft/4238/share/rockcraft/extensions/flask-framework + organize: + gunicorn.conf.py: flask/gunicorn.conf.py + permissions: + - path: flask/gunicorn.conf.py + owner: 584792 + group: 584792 + flask-framework/statsd-exporter: + build-snaps: + - go + source-tag: v0.29.0 + plugin: go + source: https://github.com/prometheus/statsd_exporter.git + flask-framework/logging: + plugin: nil + override-build: |- + craftctl default + mkdir -p $CRAFT_PART_INSTALL/opt/promtail + mkdir -p $CRAFT_PART_INSTALL/etc/promtail + mkdir -p $CRAFT_PART_INSTALL/var/log/flask + permissions: + - path: opt/promtail + owner: 584792 + group: 584792 + - path: etc/promtail + owner: 584792 + group: 584792 + - path: var/log/flask + owner: 584792 + group: 584792 + flask-framework/runtime: + plugin: nil + stage-packages: + - ca-certificates_data +run-user: _daemon_ +services: + flask: + override: replace + command: /bin/python3 -m gunicorn -c /flask/gunicorn.conf.py app:app -k [ sync + ] + startup: enabled + after: + - statsd-exporter + user: _daemon_ + statsd-exporter: + override: merge + command: /bin/statsd_exporter --statsd.mapping-config=/statsd-mapping.conf --statsd.listen-udp=localhost:9125 + --statsd.listen-tcp=localhost:9125 + summary: statsd exporter service + startup: enabled + user: _daemon_ diff --git a/examples/flask/test_rock/rockcraft.yaml b/examples/flask/test_rock/rockcraft.yaml index 0e8eafac4..a4e3be4fd 100644 --- a/examples/flask/test_rock/rockcraft.yaml +++ b/examples/flask/test_rock/rockcraft.yaml @@ -1,17 +1,79 @@ -# Copyright 2025 Canonical Ltd. -# See LICENSE file for licensing details. name: test-flask +title: test-flask +version: '0.1' summary: A flask test app description: OCI image for the test flask app -version: "0.1" base: ubuntu@22.04 -license: Apache-2.0 platforms: amd64: - -extensions: - - flask-framework - + build-on: + - amd64 + build-for: + - amd64 +license: Apache-2.0 +parts: + flask-framework/dependencies: + plugin: python + stage-packages: + - python3-venv + source: . + python-packages: + - gunicorn~=23.0 + python-requirements: + - requirements.txt + build-environment: [] + flask-framework/install-app: + plugin: dump + source: . + organize: + app.py: flask/app/app.py + templates: flask/app/templates + stage: + - flask/app/app.py + - flask/app/templates + prime: + - flask/app/app.py + - flask/app/templates + permissions: + - owner: 584792 + group: 584792 + flask-framework/config-files: + plugin: dump + source: /snap/rockcraft/4238/share/rockcraft/extensions/flask-framework + organize: + gunicorn.conf.py: flask/gunicorn.conf.py + permissions: + - path: flask/gunicorn.conf.py + owner: 584792 + group: 584792 + flask-framework/statsd-exporter: + build-snaps: + - go + source-tag: v0.29.0 + plugin: go + source: https://github.com/prometheus/statsd_exporter.git + flask-framework/logging: + plugin: nil + override-build: |- + craftctl default + mkdir -p $CRAFT_PART_INSTALL/opt/promtail + mkdir -p $CRAFT_PART_INSTALL/etc/promtail + mkdir -p $CRAFT_PART_INSTALL/var/log/flask + permissions: + - path: opt/promtail + owner: 584792 + group: 584792 + - path: etc/promtail + owner: 584792 + group: 584792 + - path: var/log/flask + owner: 584792 + group: 584792 + flask-framework/runtime: + plugin: nil + stage-packages: + - ca-certificates_data +run-user: _daemon_ services: celery-worker: override: replace @@ -25,3 +87,18 @@ services: startup: enabled user: _daemon_ working-dir: /flask/app + flask: + override: replace + command: /bin/python3 -m gunicorn -c /flask/gunicorn.conf.py app:app -k [ sync + ] + startup: enabled + after: + - statsd-exporter + user: _daemon_ + statsd-exporter: + override: merge + command: /bin/statsd_exporter --statsd.mapping-config=/statsd-mapping.conf --statsd.listen-udp=localhost:9125 + --statsd.listen-tcp=localhost:9125 + summary: statsd exporter service + startup: enabled + user: _daemon_ diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index f71f58e83..0be7954f4 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -355,7 +355,7 @@ def expressjs_app_fixture( juju.deploy( "postgresql-k8s", - channel="14/edge", + channel="16/edge", base="ubuntu@22.04", trust=True, config={ @@ -363,6 +363,7 @@ def expressjs_app_fixture( "plugin_hstore_enable": "true", "plugin_pg_trgm_enable": "true", }, + force=True, ) resources = { @@ -421,7 +422,7 @@ def spring_boot_app_fixture( try: juju.deploy( "postgresql-k8s", - channel="14/edge", + channel="16/edge", base="ubuntu@22.04", trust=True, config={ @@ -429,6 +430,7 @@ def spring_boot_app_fixture( "plugin_hstore_enable": "true", "plugin_pg_trgm_enable": "true", }, + force=True, ) except jubilant.CLIError as err: if "application already exists" not in err.stderr: @@ -715,7 +717,7 @@ def deploy_postgresql( juju.deploy( "postgresql-k8s", - channel="14/edge", + channel="16/edge", base="ubuntu@22.04", trust=True, config={ @@ -723,6 +725,7 @@ def deploy_postgresql( "plugin_hstore_enable": "true", "plugin_pg_trgm_enable": "true", }, + force=True, ) diff --git a/tests/integration/flask/test_database.py b/tests/integration/flask/test_database.py index 4e6a65f7b..549bdfd40 100644 --- a/tests/integration/flask/test_database.py +++ b/tests/integration/flask/test_database.py @@ -22,7 +22,7 @@ @pytest.mark.parametrize( "endpoint, db_name, db_channel, revision, trust", [ - ("postgresql/status", "postgresql-k8s", "14/edge", None, True), + ("postgresql/status", "postgresql-k8s", "16/edge", None, True), ], ) def test_with_database( @@ -42,7 +42,7 @@ def test_with_database( """ # Deploy database if not already deployed if not juju.status().apps.get(db_name): - juju.deploy(db_name, channel=db_channel, revision=revision, trust=trust) + juju.deploy(db_name, channel=db_channel, revision=revision, trust=trust, force=True) juju.wait(lambda status: status.apps.get(db_name, False) and status.apps[db_name].is_active)