in experimenter/experimenter/experiments/api/v5/serializers.py [0:0]
def _validate_feature_configs(self, data):
feature_configs = data.get("feature_configs", [])
min_version = None
max_version = None
if not NimbusExperiment.Application.is_web(self.instance.application):
raw_min_version = data.get("firefox_min_version", "")
raw_max_version = data.get("firefox_max_version", "")
# We've already validated the versions in _validate_versions.
min_version = NimbusExperiment.Version.parse(raw_min_version)
if raw_max_version:
max_version = NimbusExperiment.Version.parse(raw_max_version)
errors = {
"feature_configs": [
f"Feature Config application {feature_config.application} "
f"does not match experiment application "
f"{self.instance.application}."
]
for feature_config in feature_configs
if self.instance.application != feature_config.application
}
if errors:
# This error can't be dismissed by the warn_feature_schema flag.
raise serializers.ValidationError(errors)
reference_branch = data.get("reference_branch", {})
if errors := self._validate_target_kinto_collections(feature_configs):
raise serializers.ValidationError(
{
"feature_configs": errors,
}
)
# Cache the versioned schema range for each feature so we can re-use
# them in the validation for each branch.
self.schemas_by_feature_id = {
feature_config.slug: feature_config.get_versioned_schema_range(
min_version,
max_version,
)
for feature_config in (
feature_value_data["feature_config"]
for feature_value_data in reference_branch.get(
"feature_values",
[],
)
)
}
result = self._validate_branches(data=data)
if any(result.warnings):
self.warnings.update(result.warnings)
if any(result.errors):
raise serializers.ValidationError(result.errors)
return data