|
31 | 31 | GIT_SHA_PATTERN = re.compile(r"[0-9a-fA-F]{7,40}") |
32 | 32 | ARTIFACT_SOURCE_ENV_KEYS = ("ODOO_ADDON_REPOSITORIES", "OPENUPGRADE_ADDON_REPOSITORY") |
33 | 33 | RUNTIME_ENVIRONMENT_PAYLOAD_ENV_VAR = "ODOO_DEVKIT_RUNTIME_ENVIRONMENT_JSON" |
| 34 | +ODOO_INSTANCE_OVERRIDES_PAYLOAD_ENV_KEY = "ODOO_INSTANCE_OVERRIDES_PAYLOAD_B64" |
| 35 | +LEGACY_CONFIG_PARAM_PREFIX = "ENV_OVERRIDE_CONFIG_PARAM__" |
| 36 | +LEGACY_AUTHENTIK_PREFIX = "ENV_OVERRIDE_AUTHENTIK__" |
| 37 | +LEGACY_SHOPIFY_PREFIX = "ENV_OVERRIDE_SHOPIFY__" |
| 38 | +LEGACY_SETTING_OVERRIDE_PREFIXES = ( |
| 39 | + LEGACY_CONFIG_PARAM_PREFIX, |
| 40 | + LEGACY_AUTHENTIK_PREFIX, |
| 41 | + LEGACY_SHOPIFY_PREFIX, |
| 42 | +) |
34 | 43 |
|
35 | 44 | PLATFORM_RUNTIME_ENV_KEYS = ( |
36 | 45 | "PLATFORM_CONTEXT", |
@@ -1545,9 +1554,93 @@ def build_runtime_env_values( |
1545 | 1554 | runtime_values[environment_key] = source_environment[environment_key] |
1546 | 1555 | for runtime_key, runtime_value in runtime_selection.effective_runtime_env.items(): |
1547 | 1556 | runtime_values[runtime_key] = runtime_value |
| 1557 | + apply_typed_odoo_instance_override_payload( |
| 1558 | + runtime_values=runtime_values, |
| 1559 | + context_name=runtime_selection.context_name, |
| 1560 | + instance_name=runtime_selection.instance_name, |
| 1561 | + ) |
1548 | 1562 | return runtime_values |
1549 | 1563 |
|
1550 | 1564 |
|
| 1565 | +def apply_typed_odoo_instance_override_payload( |
| 1566 | + *, |
| 1567 | + runtime_values: dict[str, str], |
| 1568 | + context_name: str, |
| 1569 | + instance_name: str, |
| 1570 | +) -> None: |
| 1571 | + payload = build_typed_odoo_instance_override_payload( |
| 1572 | + runtime_values=runtime_values, |
| 1573 | + context_name=context_name, |
| 1574 | + instance_name=instance_name, |
| 1575 | + ) |
| 1576 | + if payload is None: |
| 1577 | + return |
| 1578 | + if runtime_values.get(ODOO_INSTANCE_OVERRIDES_PAYLOAD_ENV_KEY, "").strip(): |
| 1579 | + raise RuntimeCommandError( |
| 1580 | + f"{ODOO_INSTANCE_OVERRIDES_PAYLOAD_ENV_KEY} cannot be combined with legacy ENV_OVERRIDE_* setting inputs." |
| 1581 | + ) |
| 1582 | + encoded_payload = json.dumps(payload, separators=(",", ":"), sort_keys=True).encode("utf-8") |
| 1583 | + runtime_values[ODOO_INSTANCE_OVERRIDES_PAYLOAD_ENV_KEY] = base64.b64encode(encoded_payload).decode("ascii") |
| 1584 | + for runtime_key in tuple(runtime_values): |
| 1585 | + if runtime_key.startswith(LEGACY_SETTING_OVERRIDE_PREFIXES): |
| 1586 | + runtime_values.pop(runtime_key, None) |
| 1587 | + |
| 1588 | + |
| 1589 | +def build_typed_odoo_instance_override_payload( |
| 1590 | + *, |
| 1591 | + runtime_values: dict[str, str], |
| 1592 | + context_name: str, |
| 1593 | + instance_name: str, |
| 1594 | +) -> dict[str, object] | None: |
| 1595 | + config_parameters: list[dict[str, object]] = [] |
| 1596 | + addon_settings: list[dict[str, object]] = [] |
| 1597 | + for runtime_key in sorted(runtime_values): |
| 1598 | + runtime_value = runtime_values[runtime_key] |
| 1599 | + if runtime_key.startswith(LEGACY_CONFIG_PARAM_PREFIX): |
| 1600 | + suffix = runtime_key[len(LEGACY_CONFIG_PARAM_PREFIX) :].strip().lower() |
| 1601 | + if not suffix: |
| 1602 | + continue |
| 1603 | + config_parameters.append( |
| 1604 | + { |
| 1605 | + "key": suffix.replace("__", "."), |
| 1606 | + "value": {"source": "literal", "value": runtime_value}, |
| 1607 | + } |
| 1608 | + ) |
| 1609 | + continue |
| 1610 | + if runtime_key.startswith(LEGACY_AUTHENTIK_PREFIX): |
| 1611 | + suffix = runtime_key[len(LEGACY_AUTHENTIK_PREFIX) :].strip().lower() |
| 1612 | + if not suffix: |
| 1613 | + continue |
| 1614 | + addon_settings.append( |
| 1615 | + { |
| 1616 | + "addon": "authentik_sso", |
| 1617 | + "setting": suffix, |
| 1618 | + "value": {"source": "literal", "value": runtime_value}, |
| 1619 | + } |
| 1620 | + ) |
| 1621 | + continue |
| 1622 | + if runtime_key.startswith(LEGACY_SHOPIFY_PREFIX): |
| 1623 | + suffix = runtime_key[len(LEGACY_SHOPIFY_PREFIX) :].strip().lower() |
| 1624 | + if not suffix: |
| 1625 | + continue |
| 1626 | + addon_settings.append( |
| 1627 | + { |
| 1628 | + "addon": "shopify", |
| 1629 | + "setting": suffix, |
| 1630 | + "value": {"source": "literal", "value": runtime_value}, |
| 1631 | + } |
| 1632 | + ) |
| 1633 | + if not config_parameters and not addon_settings: |
| 1634 | + return None |
| 1635 | + return { |
| 1636 | + "schema_version": 1, |
| 1637 | + "context": context_name, |
| 1638 | + "instance": instance_name, |
| 1639 | + "config_parameters": config_parameters, |
| 1640 | + "addon_settings": addon_settings, |
| 1641 | + } |
| 1642 | + |
| 1643 | + |
1551 | 1644 | def apply_publish_artifact_input_manifest( |
1552 | 1645 | *, |
1553 | 1646 | runtime_context: RuntimeContext, |
|
0 commit comments