Source code for openfactory.schemas.apps
""" Pydantic schemas for validating OpenFactory Application definitions. """
from pydantic import BaseModel, Field, ValidationError
from typing import List, Dict, Optional
from openfactory.config import load_yaml
from openfactory.models.user_notifications import user_notify
from openfactory.schemas.uns import UNSSchema
[docs]
class OpenFactoryApp(BaseModel):
""" OpenFactory Application Schema."""
uuid: str = Field(..., description="Unique identifier for the app")
image: str = Field(..., description="Docker image for the app")
environment: Optional[List[str]] = Field(
default=None, description="List of environment variables"
)
[docs]
class OpenFactoryAppsConfig(BaseModel):
""" OpenFactory Applications Configuration Schema."""
apps: Dict[str, OpenFactoryApp] = Field(
..., description="Dictionary of OpenFactory applications"
)
@property
def apps_dict(self):
""" Dictionary with all configured OpenFactory applications. """
return self.model_dump()['apps']
[docs]
def get_apps_from_config_file(apps_yaml_config_file: str, uns_schema: UNSSchema) -> Optional[Dict[str, OpenFactoryApp]]:
"""
Load, validate, and enrich OpenFactory application configurations from a YAML file using UNS metadata.
This function reads a YAML file containing OpenFactory application definitions, validates its content
using the :class:`OpenFactoryAppsConfig` Pydantic model, and augments each validated application entry
with Unified Namespace (UNS) metadata derived from the provided schema.
Args:
apps_yaml_config_file (str): Path to the YAML file defining application configurations.
uns_schema (UNSSchema): Schema instance used to extract and validate UNS metadata
for each application.
Returns:
Optional[Dict[str, OpenFactoryApp]]: A dictionary of validated and enriched application configurations,
or `None` if validation fails.
Note:
In case of validation errors, user notifications will be triggered and `None` will be returned.
"""
# load yaml description file
cfg = load_yaml(apps_yaml_config_file)
# validate and create apps configuration
try:
apps_cfg = OpenFactoryAppsConfig(**cfg)
except ValidationError as err:
user_notify.fail(f"Provided YAML configuration file has invalid format\n{err}")
return None
except ValueError as err:
user_notify.fail(f"Provided YAML configuration file has invalid format\n{err}")
return None
# inject UNS data into the validated apps configurations
apps = apps_cfg.apps_dict
for app_name, raw_app_data in cfg['apps'].items():
uns_fields = uns_schema.extract_uns_fields(raw_app_data)
uns_schema.validate_uns_fields(app_name, uns_fields)
uns_id = uns_schema.generate_uns_path(uns_fields)
apps[app_name]["uns"] = {
"levels": uns_fields,
"uns_id": uns_id,
}
return apps