Source code for eclypse.policies.failure.edge_availability_flap

"""Edge availability flapping policy."""

from __future__ import annotations

from typing import TYPE_CHECKING

from eclypse.policies._filters import iter_selected_edges
from eclypse.policies._helpers import validate_probability
from eclypse.policies.failure._helpers import flap_availability
from eclypse.utils.constants import (
    MAX_AVAILABILITY,
    MIN_AVAILABILITY,
)

if TYPE_CHECKING:
    from eclypse.graph.asset_graph import AssetGraph
    from eclypse.policies._filters import EdgeFilter
    from eclypse.utils.types import UpdatePolicy


[docs] def edge_availability_flap( down_probability: float, *, up_probability: float | None = None, down_availability: float = MIN_AVAILABILITY, up_availability: float = MAX_AVAILABILITY, availability_key: str = "availability", unavailable_at_or_below: float = MIN_AVAILABILITY, edge_ids: list[tuple[str, str]] | None = None, edge_filter: EdgeFilter | None = None, ) -> UpdatePolicy: """Toggle edge availability up and down according to probabilities. Args: down_probability (float): Probability of moving an available edge down. up_probability (float | None): Probability of moving an unavailable edge up. When omitted, ``down_probability`` is reused. down_availability (float): Availability value for unavailable edges. up_availability (float): Availability value for recovered edges. availability_key (str): Edge asset used to store availability. unavailable_at_or_below (float): Threshold for considering an edge unavailable. edge_ids (list[tuple[str, str]] | None): Optional explicit edge identifiers to mutate. edge_filter (EdgeFilter | None): Optional predicate receiving ``(source, target, data)``. Returns: Policy that flips selected edge availability. """ validate_probability("down_probability", down_probability) validate_probability("up_probability", up_probability) effective_up_probability = ( down_probability if up_probability is None else up_probability ) def policy(graph: AssetGraph): for _, _, data in iter_selected_edges( graph, edge_ids=edge_ids, edge_filter=edge_filter, ): flap_availability( data, down_probability=down_probability, up_probability=effective_up_probability, down_availability=down_availability, up_availability=up_availability, availability_key=availability_key, unavailable_at_or_below=unavailable_at_or_below, random=graph.rnd, ) graph.logger.trace("Applied edge_availability_flap policy.") return policy