Skip to content

Modify prefix limit

Workflow to modify the prefix limit of a Commercial Peer subscription.

initial_input_form_generator(subscription_id)

Get input to modify Prefix Limit V4/V6 of a Commercial Peer subscription.

Source code in gso/workflows/commercial_peer/modify_prefix_limit.py
def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
    """Get input to modify Prefix Limit V4/V6 of a Commercial Peer subscription."""
    subscription = CommercialPeer.from_subscription(subscription_id)
    commercial_peer = subscription.commercial_peer

    class ModifyPrefixLimitForm(FormPage):
        model_config = ConfigDict(title="Modify Prefix Limit of Commercial Peer Subscription")

        tt_number: TTNumber
        prefix_limit_v4: NonNegativeInt = commercial_peer.prefix_limit_v4  # type: ignore[assignment]
        prefix_limit_v6: NonNegativeInt = commercial_peer.prefix_limit_v6  # type: ignore[assignment]

    initial_input = yield ModifyPrefixLimitForm

    return initial_input.model_dump()

modify_commercial_peer_subscription(subscription, prefix_limit_v4, prefix_limit_v6)

Modify the prefix limit of a Commercial Peer subscription and update BGP Sessions.

Source code in gso/workflows/commercial_peer/modify_prefix_limit.py
@step("Modify Commercial Peer Prefix Limit V4/V6 and update prefix limit for BGP Sessions of Peering Connections")
def modify_commercial_peer_subscription(
    subscription: CommercialPeer, prefix_limit_v4: NonNegativeInt, prefix_limit_v6: NonNegativeInt
) -> State:
    """Modify the prefix limit of a Commercial Peer subscription and update BGP Sessions."""
    if subscription.commercial_peer.prefix_limit_v4 != prefix_limit_v4:
        subscription.commercial_peer.prefix_limit_v4 = prefix_limit_v4
        for peering_connection in subscription.commercial_peer.peering_connection_list:
            peering_connection.bgp_session_v4.prefix_limit = prefix_limit_v4
    if subscription.commercial_peer.prefix_limit_v6 != prefix_limit_v6:
        subscription.commercial_peer.prefix_limit_v6 = prefix_limit_v6
        for peering_connection in subscription.commercial_peer.peering_connection_list:
            peering_connection.bgp_session_v6.prefix_limit = prefix_limit_v6
    partner_name = get_partner_by_id(subscription.customer_id).name

    fqdn_list = [
        port.l3_interface.edge_port.node.router_fqdn
        for pc in subscription.commercial_peer.peering_connection_list
        if (port := pc.placement_port) is not None
    ]

    return {
        "subscription": subscription,
        "partner_name": partner_name,
        "fqdn_list": fqdn_list,
    }

modify_commercial_peer_prefix_limit_dry(subscription, process_id, tt_number, partner_name, fqdn_list)

Perform a dry run of modifying commercial peer prefix limit and BGP sessions on all placement ports.

Source code in gso/workflows/commercial_peer/modify_prefix_limit.py
@step("[DRY RUN] Deploy commercial peer prefix limits and BGP sessions of peering connections")
def modify_commercial_peer_prefix_limit_dry(
    subscription: CommercialPeer,
    process_id: UUIDstr,
    tt_number: str,
    partner_name: str,
    fqdn_list: list[str],
) -> LSOState:
    """Perform a dry run of modifying commercial peer prefix limit and BGP sessions on all placement ports."""
    extra_vars = {
        "subscription": json.loads(json_dumps(subscription)),
        "partner_name": partner_name,
        "dry_run": True,
        "verb": "deploy",
        "object": "commercial_peer",
        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
        f"Deploy config for {subscription.description}",
    }

    return {
        "playbook_name": "gap_ansible/playbooks/modify_commercial_peer_prefix_limit.yaml",
        "inventory": {"all": {"hosts": dict.fromkeys(fqdn_list)}},
        "extra_vars": extra_vars,
    }

modify_commercial_peer_prefix_limit_real(subscription, process_id, tt_number, partner_name, fqdn_list)

Perform a real run of modifying commercial peer prefix limit and BGP sessions on all placement ports.

Source code in gso/workflows/commercial_peer/modify_prefix_limit.py
@step("[REAL RUN] Deploy commercial peer prefix limits and BGP sessions of peering connections")
def modify_commercial_peer_prefix_limit_real(
    subscription: CommercialPeer,
    process_id: UUIDstr,
    tt_number: str,
    partner_name: str,
    fqdn_list: list[str],
) -> LSOState:
    """Perform a real run of modifying commercial peer prefix limit and BGP sessions on all placement ports."""
    extra_vars = {
        "subscription": json.loads(json_dumps(subscription)),
        "partner_name": partner_name,
        "dry_run": False,
        "verb": "deploy",
        "object": "commercial_peer",
        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
        f"Deploy config for {subscription.description}",
    }

    return {
        "playbook_name": "gap_ansible/playbooks/modify_commercial_peer_prefix_limit.yaml",
        "inventory": {"all": {"hosts": dict.fromkeys(fqdn_list)}},
        "extra_vars": extra_vars,
    }

modify_prefix_limit()

Modify prefix limit of a Commercial Peer subscription.

Source code in gso/workflows/commercial_peer/modify_prefix_limit.py
@modify_workflow("Modify Prefix Limit", initial_input_form=initial_input_form_generator)
def modify_prefix_limit() -> StepList:
    """Modify prefix limit of a Commercial Peer subscription."""
    return (
        begin
        >> modify_commercial_peer_subscription
        >> lso_interaction(modify_commercial_peer_prefix_limit_dry)
        >> lso_interaction(modify_commercial_peer_prefix_limit_real)
    )