diff --git a/README.md b/README.md index 2bb9cdc..e7a3666 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,8 @@ Current runtime ownership is intentionally narrow and explicit: - The shared local compose contract includes the image-owned Launchplane runtime addon root `/opt/launchplane/addons` and loads `base,web,launchplane_runtime_health` as server-wide modules by default. + Keep that addon root in the rendered `ODOO_ADDONS_PATH` so startup scripts, + generated Odoo config, and wrapper-normalized server commands agree. `/web/health` remains the local container liveness check; Launchplane runtime identity evidence is exposed by the base image at `/launchplane/health`. - A Postgres major-version bump is not a routine dependency refresh on this diff --git a/platform/stack.toml b/platform/stack.toml index deed434..88b9933 100644 --- a/platform/stack.toml +++ b/platform/stack.toml @@ -5,6 +5,7 @@ addons_path = [ "/odoo/odoo/addons", "/opt/project/addons", "/opt/extra_addons", + "/opt/launchplane/addons", "/opt/enterprise", ] required_env_keys = [ diff --git a/tests/test_ide_support.py b/tests/test_ide_support.py index 6f9cca7..19fa002 100644 --- a/tests/test_ide_support.py +++ b/tests/test_ide_support.py @@ -25,6 +25,7 @@ def test_write_pycharm_odoo_conf_maps_project_addons_path_locally(self) -> None: "/odoo/odoo/addons", "/opt/project/addons", "/opt/extra_addons", + "/opt/launchplane/addons", "/opt/enterprise", ), source_environment={"ODOO_DB_USER": "odoo", "ODOO_DB_PASSWORD": "pw"}, @@ -33,7 +34,7 @@ def test_write_pycharm_odoo_conf_maps_project_addons_path_locally(self) -> None: self.assertEqual(written_conf, repo_root / ".platform" / "ide" / "cm.local.odoo.conf") rendered_conf = written_conf.read_text(encoding="utf-8") self.assertIn( - f"addons_path = /odoo/addons,/odoo/odoo/addons,{repo_root / 'addons'},/opt/extra_addons,/opt/enterprise", + f"addons_path = /odoo/addons,/odoo/odoo/addons,{repo_root / 'addons'},/opt/extra_addons,/opt/launchplane/addons,/opt/enterprise", rendered_conf, ) self.assertNotIn("/.platform/ide/", rendered_conf) diff --git a/tests/test_runtime.py b/tests/test_runtime.py index 6abbf05..487a786 100644 --- a/tests/test_runtime.py +++ b/tests/test_runtime.py @@ -699,7 +699,12 @@ def test_native_runtime_select_writes_runtime_env_and_pycharm_conf(self) -> None self.assertIn("DOCKER_IMAGE=odoo-opw-local", runtime_env_text) self.assertIn("ODOO_ADDON_REPOSITORIES=cbusillo/disable_odoo_online@main", runtime_env_text) self.assertIn(f"ODOO_PROJECT_ADDONS_HOST_PATH={(tenant_repo_path / 'addons').resolve()}", runtime_env_text) - self.assertIn("ODOO_ADDONS_PATH=/odoo/addons,/opt/project/addons,/opt/project/addons/shared", runtime_env_text) + addons_path_line = next( + line for line in runtime_env_text.splitlines() if line.startswith("ODOO_ADDONS_PATH=") + ) + self.assertIn("/opt/project/addons", addons_path_line) + self.assertIn("/opt/project/addons/shared", addons_path_line) + self.assertIn("/opt/launchplane/addons", addons_path_line) pycharm_conf_text = pycharm_conf_file.read_text(encoding="utf-8") self.assertIn("db_port = 15432", pycharm_conf_text) self.assertIn(f"addons_path = {(tenant_repo_path / 'addons').resolve()}", pycharm_conf_text) @@ -716,7 +721,7 @@ def test_native_runtime_select_rejects_legacy_stack_addon_source_keys(self) -> N """ schema_version = 1 odoo_version = "19.0" -addons_path = ["/odoo/addons", "/opt/project/addons"] +addons_path = ["/odoo/addons", "/opt/launchplane/addons", "/opt/project/addons"] addon_repository_selectors = ["cbusillo/disable_odoo_online@main"] required_env_keys = ["ODOO_MASTER_PASSWORD", "ODOO_DB_USER", "ODOO_DB_PASSWORD"] @@ -866,10 +871,12 @@ def test_native_runtime_select_prefers_manifest_mounts_over_runtime_repo_default self.assertIn("DOCKER_IMAGE=odoo-opw-local", runtime_env_text) self.assertIn(f"ODOO_PROJECT_ADDONS_HOST_PATH={(tenant_repo_path / 'addons').resolve()}", runtime_env_text) self.assertIn(f"ODOO_SHARED_ADDONS_HOST_PATH={shared_addons_repo_path.resolve()}", runtime_env_text) - self.assertIn( - "ODOO_ADDONS_PATH=/odoo/addons,/opt/project/addons,/opt/project/addons/shared", - runtime_env_text, + addons_path_line = next( + line for line in runtime_env_text.splitlines() if line.startswith("ODOO_ADDONS_PATH=") ) + self.assertIn("/opt/project/addons", addons_path_line) + self.assertIn("/opt/project/addons/shared", addons_path_line) + self.assertIn("/opt/launchplane/addons", addons_path_line) def test_native_runtime_select_includes_website_bootstrap_payload(self) -> None: with tempfile.TemporaryDirectory() as temporary_directory: @@ -1224,7 +1231,7 @@ def test_native_runtime_publish_rejects_legacy_runtime_stack_selectors(self) -> """ schema_version = 1 odoo_version = "19.0" -addons_path = ["/odoo/addons", "/opt/project/addons"] +addons_path = ["/odoo/addons", "/opt/launchplane/addons", "/opt/project/addons"] addon_repository_selectors = ["cbusillo/disable_odoo_online@main"] required_env_keys = ["ODOO_MASTER_PASSWORD", "ODOO_DB_USER", "ODOO_DB_PASSWORD"] @@ -2571,7 +2578,7 @@ def _write_runtime_repo(runtime_repo_path: Path) -> None: """ schema_version = 1 odoo_version = "19.0" -addons_path = ["/odoo/addons", "/opt/project/addons"] +addons_path = ["/odoo/addons", "/opt/launchplane/addons", "/opt/project/addons"] required_env_keys = ["ODOO_MASTER_PASSWORD", "ODOO_DB_USER", "ODOO_DB_PASSWORD"] [contexts.opw]