def _validate_feature_configs()

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