Skip to content

Commit 11f22b3

Browse files
committed
Change netbox payload typing so its aligned with singledispatch
1 parent 28fba7c commit 11f22b3

File tree

10 files changed

+55
-23
lines changed

10 files changed

+55
-23
lines changed

products/product_blocks/nsistp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class NsistpBlockProvisioning(NsistpBlockInactive, lifecycle=[SubscriptionLifecy
4040
expose_in_topology: bool | None = None
4141
bandwidth: int | None = None
4242

43-
@computed_field
43+
@computed_field # type: ignore[prop-decorator]
4444
@property
4545
def title(self) -> str:
4646
return f"NSISTP {self.stp_id} on {self.sap.title}"

products/services/netbox/netbox.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def _(model: CoreLinkBlockProvisioning, subscription: SubscriptionModel, **kwarg
7777

7878

7979
@build_payload.register
80-
def _(model: SAPBlockProvisioning, subscription: SubscriptionModel, **kwargs: Any) -> netbox.VlanPayload:
80+
def _(model: SAPBlockProvisioning, subscription: SubscriptionModel, **kwargs: Any) -> netbox.VlansPayload:
8181
return build_sap_payload(model, subscription)
8282

8383

products/services/netbox/payload/sap.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@
1616

1717
from products.product_blocks.sap import SAPBlockProvisioning
1818
from services import netbox
19-
import itertools
2019

2120

22-
def build_sap_payload(model: SAPBlockProvisioning, subscription: SubscriptionModel) -> list[netbox.VlanPayload]:
23-
"""Create and return a Netbox payload object for a :class:`~products.product_blocks.sap.SAPBlockProvisioning`.
21+
def build_sap_vlans_payload(model: SAPBlockProvisioning, subscription: SubscriptionModel) -> list[netbox.VlanPayload]:
22+
"""Create and return a list of Netbox :class:`VlanPayload` for a :class:`~products.product_blocks.sap.SAPBlockProvisioning`.
2423
2524
Example payload::
2625
@@ -35,16 +34,17 @@ def build_sap_payload(model: SAPBlockProvisioning, subscription: SubscriptionMod
3534
model: SAPBlockProvisioning
3635
subscription: The Subscription that will be provisioned
3736
38-
Returns: :class:`netbox.VlanPayload`
37+
Returns: list[:class:`netbox.VlanPayload`]
3938
4039
"""
40+
assert model.ims_id
4141
name = f"{model.port.node.node_name} {model.port.port_name}"
4242
vlan_list = [vlan for vlan_start, vlan_end in model.vlan.to_list_of_tuples() for vlan in range(vlan_start, vlan_end+1)]
4343
return [netbox.VlanPayload(vid=vlan, group=model.ims_id, name=f"{name} - {vlan}") for vlan in vlan_list]
4444

4545

4646
def build_sap_vlan_group_payload(model: SAPBlockProvisioning, subscription: SubscriptionModel) -> netbox.VlanGroupPayload:
47-
"""Create
47+
"""Create and return a list of Netbox :class:`VlanGroupPayload` for a :class:`~products.product_blocks.sap.SAPBlockProvisioning`.
4848
4949
Example payload::
5050
@@ -63,3 +63,26 @@ def build_sap_vlan_group_payload(model: SAPBlockProvisioning, subscription: Subs
6363
name = f"{model.port.node.node_name} {model.port.port_name}"
6464
slug = name.replace(" ", "-").replace("/", "-")
6565
return netbox.VlanGroupPayload(name=name, slug=slug, vid_ranges=model.vlan.to_list_of_tuples())
66+
67+
68+
def build_sap_payload(model: SAPBlockProvisioning, subscription: SubscriptionModel) -> netbox.VlansPayload:
69+
"""Create and return a Netbox payload object for a :class:`~products.product_blocks.sap.SAPBlockProvisioning`.
70+
71+
Example payload::
72+
73+
{
74+
"vid": 4,
75+
"name": "paris01a 0/0/1 vlan 4",
76+
"status": "active",
77+
"group": 1
78+
}
79+
80+
Args:
81+
model: SAPBlockProvisioning
82+
subscription: The Subscription that will be provisioned
83+
84+
Returns: :class:`netbox.VlanPayload`
85+
86+
"""
87+
vlan_payloads = build_sap_vlans_payload(model, subscription)
88+
return netbox.VlansPayload(vlans=vlan_payloads)

services/netbox.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class AvailableIpPayload:
130130

131131
@dataclass
132132
class VlanPayload(NetboxPayload):
133-
vid: OrchestratorVlanRanges
133+
vid: int
134134
name: str
135135
group: int
136136
status: str | None = "active"
@@ -140,7 +140,14 @@ class VlanPayload(NetboxPayload):
140140
class VlanGroupPayload(NetboxPayload):
141141
name: str
142142
slug: str
143-
vid_ranges: list[list[int, int]]
143+
vid_ranges: list[tuple[int, int]]
144+
145+
146+
@dataclass
147+
class VlansPayload(NetboxPayload):
148+
vlans: list[VlanPayload]
149+
150+
144151

145152

146153
@dataclass
@@ -428,6 +435,13 @@ def _(payload: VlanPayload, **kwargs: Any) -> int:
428435
return _create_object(payload, endpoint=api.ipam.vlans)
429436

430437

438+
@create.register
439+
def _(payload: VlansPayload, **kwargs: Any) -> int:
440+
for vlan_payload in payload.vlans:
441+
_create_object(vlan_payload, endpoint=api.ipam.vlans)
442+
return payload.vlans[0].group
443+
444+
431445
@create.register
432446
def _(payload: VlanGroupPayload, **kwargs: Any) -> int:
433447
return _create_object(payload, endpoint=api.ipam.vlan_groups)

workflows/l2vpn/create_l2vpn.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ def ims_create_vlans(subscription: L2vpnProvisioning) -> State:
109109
for sap in subscription.virtual_circuit.saps:
110110
group_payload = build_sap_vlan_group_payload(sap, subscription)
111111
sap.ims_id = netbox.create(group_payload)
112-
group_payloads = group_payloads + [group_payload]
113-
112+
group_payloads += [group_payload]
114113
vlan_payloads += build_payload(sap, subscription)
115114

116115
for payload in vlan_payloads:

workflows/nsistp/create_nsistp.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131
from products.product_types.nsistp import NsistpInactive, NsistpProvisioning
3232
from products.services.description import description
33-
from products.services.netbox.netbox import build_payload
3433
from products.services.netbox.payload.sap import build_sap_vlan_group_payload
3534
from services import netbox
3635
from workflows.nsistp.shared.forms import (

workflows/nsistp/modify_nsistp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
3535
nsistp = subscription.nsistp
3636

3737
class ModifyNsistpForm(FormPage):
38-
stp_id: read_only_field(nsistp.stp_id)
38+
stp_id: read_only_field(nsistp.stp_id) # type: ignore[valid-type]
3939

4040
divider_1: Divider
4141

workflows/nsistp/shared/forms.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def port_selector() -> type[Choice]:
5757
str(subscription.subscription_id): subscription.description
5858
for subscription in sorted(port_subscriptions, key=lambda port: port.description)
5959
}
60-
return Choice("Port", zip(ports.keys(), ports.items()))
60+
return Choice("Port", zip(ports.keys(), ports.items())) # type: ignore
6161

6262

6363
def is_fqdn(hostname: str) -> bool:
@@ -124,11 +124,10 @@ def validate_stp_id_uniqueness(subscription_id: UUID | None, stp_id: str, info:
124124
topology = values.get("topology")
125125

126126
if customer_id and topology:
127-
128127
def is_not_unique(nsistp: Nsistp) -> bool:
129128
return (
130-
nsistp.settings.stp_id.casefold() == stp_id.casefold()
131-
and nsistp.settings.topology.casefold() == topology.casefold()
129+
nsistp.nsistp.stp_id.casefold() == stp_id.casefold()
130+
and nsistp.nsistp.topology.casefold() == topology.casefold()
132131
)
133132

134133
subscriptions = _get_nsistp_subscriptions(subscription_id)
@@ -152,7 +151,7 @@ def validate_nurn(nurn: str | None) -> str | None:
152151
return nurn
153152

154153

155-
def nsistp_fill_sap(subscription: NsistpInactive, subscription_id: UUIDstr, vlan: OrchestratorVlanRanges | int) -> None:
154+
def nsistp_fill_sap(subscription: NsistpInactive, subscription_id: UUIDstr, vlan: OrchestratorVlanRanges) -> None:
156155
subscription.nsistp.sap.vlan = vlan
157156
subscription.nsistp.sap.port = SubscriptionModel.from_subscription(subscription_id).port # type: ignore
158157

workflows/nsistp/shared/vlan.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,11 @@ def validate_vlan_not_in_use(
6464
6565
Returns: input value if no errors
6666
"""
67-
print(port_field_name, info.data.get(port_field_name))
6867
if not (subscription_id := info.data.get(port_field_name)):
6968
return vlan
7069

7170
used_vlans = find_allocated_vlans(subscription_id)
7271

73-
print(used_vlans)
7472
# Remove currently chosen vlans for this port to prevent tripping on in used by itself
7573
current_selected_vlan_ranges: list[str] = []
7674
if current:
@@ -82,7 +80,7 @@ def validate_vlan_not_in_use(
8280
current_selected_vlan = "0"
8381

8482
current_selected_vlan_range = OrchestratorVlanRanges(current_selected_vlan)
85-
used_vlans -= current_selected_vlan_range
83+
used_vlans -= current_selected_vlan_range # type: ignore[assignment]
8684
current_selected_vlan_ranges = [
8785
*current_selected_vlan_ranges,
8886
*list(current_selected_vlan_range),
@@ -103,7 +101,7 @@ def validate_vlan_not_in_use(
103101

104102
def find_allocated_vlans(
105103
subscription_id: UUID | UUIDstr,
106-
) -> list[int]:
104+
) -> OrchestratorVlanRanges:
107105
"""Find all vlans already allocated to a SAP for a given port."""
108106
logger.debug(
109107
"Finding allocated VLANs",

workflows/shared.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def modify_summary_form(user_input: dict, block: ProductBlockModel, fields: List
132132
before = [str(getattr(block, nm)) for nm in fields] # type: ignore[attr-defined]
133133
after = [str(user_input[nm]) for nm in fields]
134134
yield from summary_form(
135-
block.subscription.product.name,
135+
block.subscription.product.name if block.subscription else "No Product Name Found",
136136
SummaryData(labels=fields, headers=["Before", "After"], columns=[before, after]),
137137
)
138138

0 commit comments

Comments
 (0)