From d6240702539a1ab0b90ab64d561752a11d4ac69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Wed, 18 Dec 2024 09:32:02 +0100 Subject: [PATCH] Support multi-tenant in simple mode --- bin/eval-templates | 9 +++++++++ doc/integrator/create_application.rst | 4 ++-- doc/integrator/features.rst | 2 +- ...ulti_organization.rst => multi_tenant.rst} | 20 +++++++++---------- doc/integrator/ngeo.rst | 2 +- .../__init__.py | 2 ++ .../multi_organization.py | 2 +- .../multi_tenant.py | 7 +++++++ .../{{cookiecutter.project}}/.dockerignore | 3 +++ .../{{cookiecutter.project}}/Dockerfile | 1 + 10 files changed, 37 insertions(+), 15 deletions(-) rename doc/integrator/{multi_organization.rst => multi_tenant.rst} (94%) create mode 100644 geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_tenant.py diff --git a/bin/eval-templates b/bin/eval-templates index af67d111ee..c22344c236 100755 --- a/bin/eval-templates +++ b/bin/eval-templates @@ -52,4 +52,13 @@ find /etc/static-ngeo/ \( -name '*.js' -or -name '*.css' -or -name '*.html' \) - sed --in-place --expression="s#\.__ENTRY_POINT__#${VISIBLE_ENTRY_POINT}#g" "${file}" done +if [ -d /app/geomapfishapp_geoportal/ ]; then + for name in authentication multi_tenant dev; do + if [ -f "/etc/geomapfish/${name}.py" ]; then + echo "Get: ${name}.py" + cp "/etc/geomapfish/${name}.py" /app/geomapfishapp_geoportal/ + fi + done +fi + exec "$@" diff --git a/doc/integrator/create_application.rst b/doc/integrator/create_application.rst index ed510c0223..e8b6ac3242 100644 --- a/doc/integrator/create_application.rst +++ b/doc/integrator/create_application.rst @@ -222,7 +222,7 @@ We recommend instead that you use dynamic variables as described below. However, in some use cases extending ``vars.yaml`` may be needed: * Configuring highly specific environments -* Configuration of a multi-organization project +* Configuration of a multi-tenant project Use of dynamic variables ........................ @@ -272,7 +272,7 @@ Do not forget to add your changes to git: .. note:: - If you are using a multi-organization project, you should add all new children to + If you are using a multi-tenant project, you should add all new children to the parent site check_collector configuration. After creation and minimal setup the application is ready to be installed. diff --git a/doc/integrator/features.rst b/doc/integrator/features.rst index 4262914c8f..cc9b27448e 100644 --- a/doc/integrator/features.rst +++ b/doc/integrator/features.rst @@ -18,6 +18,6 @@ Features that require additional steps (most of the time): urllogin pdfreport routing - multi_organization + multi_tenant vector_tiles extend_application diff --git a/doc/integrator/multi_organization.rst b/doc/integrator/multi_tenant.rst similarity index 94% rename from doc/integrator/multi_organization.rst rename to doc/integrator/multi_tenant.rst index 01d794161c..77f52bc39b 100644 --- a/doc/integrator/multi_organization.rst +++ b/doc/integrator/multi_tenant.rst @@ -1,7 +1,7 @@ -.. _integrator_multi_organization: +.. _integrator_multi_tenant: -Multi organization -================== +Multi-tenant +============ The geoportal can host multiple organizations, with configuration differences for each organization. In a multi-organization geoportal, each organization will have the same program code @@ -11,18 +11,20 @@ In this example we will have the came CSS but we can do some variations by using see ``cssVars`` in ``gmfOptions`` in the ngeo GMF constants definitions :ngeo_doc:`gmf constants `. -The following lines will provide a basic implementation for multi-organization. +The following lines will provide a basic implementation for multi-tenant. The code should be adapted, currently it handles the hostnames 'org1.camptocamp.com' and 'org2.camptocamp.com', and you probably want to put the hardcoded values in the config. -``__init__.py`` +``multi_tenant.py`` --------------- -In the file ``geoportal/_geoportal/__init__.py`` add the following lines: +You should have a ``geoportal/_geoportal/multi_tenant.py`` File Like this one: .. code:: python + from pyramid.config import Configurator + def get_instance_prefix(request): if request.host == "org1.camptocamp.com": return "org1" @@ -31,25 +33,23 @@ In the file ``geoportal/_geoportal/__init__.py`` add the following line # Can be used to debug the application return os.environ.get("DEFAULT_PREFIX", "unknown") - def get_organization_role(request, role_type): prefix = get_instance_prefix(request) return f"{prefix}-{role_type}" - def get_organization_interface(request, interface): prefix = get_instance_prefix(request) return f"{prefix}-{interface}" - def get_organization_print_url(request): prefix = get_instance_prefix(request) print_url = request.registry.settings["print_url"] # Custom code can be added to have a different behavior return print_url + def includeme(config: Configurator) -> None: + """Initialize the multi-tenant.""" - # In ``main`` function, after ``config.include("c2cgeoportal_geoportal")`` config.add_request_method( get_organization_role, name="get_organization_role") config.add_request_method( diff --git a/doc/integrator/ngeo.rst b/doc/integrator/ngeo.rst index ef35cf8926..d0636f9a76 100644 --- a/doc/integrator/ngeo.rst +++ b/doc/integrator/ngeo.rst @@ -121,7 +121,7 @@ The sub section is the interface name, and after that we have: ``Request.route_url`` `documentation `_. -* ``lang_urls_suffix`` suffix used in l10n URL, see: :ref:`integrator_multi_organization`. +* ``lang_urls_suffix`` suffix used in l10n URL, see: :ref:`integrator_multi_tenant`. The dynamic values names are: diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py b/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py index 44eac8c037..109c56a6da 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py @@ -3,6 +3,7 @@ import {{cookiecutter.package}}_geoportal.authentication import {{cookiecutter.package}}_geoportal.dev import {{cookiecutter.package}}_geoportal.multi_organization +import {{cookiecutter.package}}_geoportal.multi_tenant from c2cgeoportal_geoportal import add_interface_config, locale_negotiator from c2cgeoportal_geoportal.lib.i18n import LOCALE_PATH from {{cookiecutter.package}}_geoportal.resources import Root @@ -29,6 +30,7 @@ def main(global_config, **settings): config.include("c2cgeoportal_geoportal") config.include({{cookiecutter.package}}_geoportal.multi_organization.includeme) + config.include({{cookiecutter.package}}_geoportal.multi_tenant.includeme) # Scan view decorator for adding routes config.scan() diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py b/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py index 25d9664418..8144d5d350 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py @@ -2,6 +2,6 @@ def includeme(config: Configurator) -> None: - """Initialize the multi organization.""" + """Initialize the multi-tenant.""" del config # Unused diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_tenant.py b/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_tenant.py new file mode 100644 index 0000000000..8144d5d350 --- /dev/null +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_tenant.py @@ -0,0 +1,7 @@ +from pyramid.config import Configurator + + +def includeme(config: Configurator) -> None: + """Initialize the multi-tenant.""" + + del config # Unused diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore b/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore index 42ee2380ee..7333d2724b 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore @@ -12,3 +12,6 @@ !geoportal/{{cookiecutter.package}}_geoportal/static !geoportal/{{cookiecutter.package}}_geoportal/locale geoportal/{{cookiecutter.package}}_geoportal/locale/*.pot +!geoportal/{{cookiecutter.package}}_geoportal/authentication.py +!geoportal/{{cookiecutter.package}}_geoportal/multi_tenant.py +!geoportal/{{cookiecutter.package}}_geoportal/dev.py diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile b/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile index e0ae4eb2e6..39572700db 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile @@ -28,6 +28,7 @@ ENV PGSCHEMA=$PGSCHEMA RUN \ cd /tmp/config/geoportal/ \ + && [ "${SIMPLE}" == "TRUE" ] || rm -f {{cookiecutter.package}}_geoportal/*.py \ && c2c-template --vars ${VARS_FILE} \ --get-config {{cookiecutter.package}}_geoportal/config.yaml \ ${CONFIG_VARS} \