Skip to content

Commit 626b355

Browse files
authored
Merge pull request #59 from workfloworchestrator/support-vlan-range-type
Add support for VlanRanges to NSISTP and L2VPN
2 parents 6eb5cc3 + a4fa6f3 commit 626b355

File tree

21 files changed

+304
-238
lines changed

21 files changed

+304
-238
lines changed

docker-compose.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ services:
236236
- "80:80"
237237
volumes:
238238
- "./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
239-
restart: always
240239
depends_on:
241240
orchestrator:
242241
condition: service_started

docker/orchestrator-ui/orchestrator-ui.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ OIDC_CONF_FULL_WELL_KNOWN_URL=""
2121
OAUTH2_ACTIVE=false
2222
AO_STACK_STATUS_URL=""
2323
ENABLE_AO_STACK_STATUS=false
24+
ACTIVATE_PYDANTIC_FORMS=true

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/product_blocks/port.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ def vlans(self) -> List[int]:
7373

7474
@computed_field # type: ignore[misc]
7575
@property
76-
def vlan_ims_ids(self) -> List[int]:
77-
"""Get list of active VLAN IMS IDs by looking at SAPBlock's that use this PortBlock."""
76+
def vlan_group_ims_ids(self) -> List[int]:
77+
"""Get list of active IMS VLAN GROUP IDs by looking at SAPBlock's that use this PortBlock."""
7878
return [sap_block.ims_id for sap_block in self._active_sap_blocks()]
7979

8080
@computed_field # type: ignore[misc]

products/product_blocks/sap.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,18 @@
1717
from pydantic import computed_field
1818

1919
from products.product_blocks.port import PortBlock, PortBlockInactive, PortBlockProvisioning
20+
from nwastdlib.vlans import VlanRanges
2021

2122

2223
class SAPBlockInactive(ProductBlockModel, product_block_name="SAP"):
2324
port: PortBlockInactive | None = None
24-
vlan: int | None = None
25+
vlan: VlanRanges | None = None
2526
ims_id: int | None = None
2627

2728

2829
class SAPBlockProvisioning(SAPBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
2930
port: PortBlockProvisioning
30-
vlan: int # TODO: refactor to CustomVlanRanges together with L2VPN product and workflow
31+
vlan: VlanRanges
3132
ims_id: int | None = None
3233

3334
@computed_field # type: ignore[misc]
@@ -38,5 +39,5 @@ def title(self) -> str:
3839

3940
class SAPBlock(SAPBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
4041
port: PortBlock
41-
vlan: int # TODO: refactor to CustomVlanRanges together with L2VPN product and workflow
42+
vlan: VlanRanges
4243
ims_id: int

products/product_types/nsistp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from orchestrator.types import SubscriptionLifecycle
1717

1818
from products.product_blocks.nsistp import NsistpBlock, NsistpBlockInactive, NsistpBlockProvisioning
19-
from workflows.nsistp.shared.shared import CustomVlanRanges
19+
from nwastdlib.vlans import VlanRanges
2020

2121

2222
class NsistpInactive(SubscriptionModel, is_base=True):
@@ -31,5 +31,5 @@ class Nsistp(NsistpProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
3131
nsistp: NsistpBlock
3232

3333
@property
34-
def vlan_range(self) -> CustomVlanRanges:
34+
def vlan_range(self) -> VlanRanges:
3535
return self.nsistp.sap.vlan

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/port.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ def build_port_payload(model: PortBlockProvisioning, subscription: SubscriptionM
4444
Returns: :class:`netbox.InterfacePayload`
4545
4646
"""
47+
vlan_ids = [vlan.id for group_id in model.vlan_group_ims_ids for vlan in netbox.get_vlans(group_id=group_id)]
4748
return netbox.InterfacePayload(
4849
device=model.node.ims_id,
4950
name=model.port_name,
5051
type=model.port_type,
51-
tagged_vlans=sorted(model.vlan_ims_ids),
52+
tagged_vlans=sorted(vlan_ids),
5253
mode="tagged" if model.port_mode == PortMode.TAGGED else "",
5354
description=model.port_description,
5455
enabled=model.enabled,

products/services/netbox/payload/sap.py

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,63 @@
1818
from services import netbox
1919

2020

21-
def build_sap_payload(model: SAPBlockProvisioning, subscription: SubscriptionModel) -> netbox.VlanPayload:
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`.
23+
24+
Example payload::
25+
26+
{
27+
"vid": 4,
28+
"name": "paris01a 0/0/1 vlan 4",
29+
"status": "active",
30+
"group": 1
31+
}
32+
33+
Args:
34+
model: SAPBlockProvisioning
35+
subscription: The Subscription that will be provisioned
36+
37+
Returns: list[:class:`netbox.VlanPayload`]
38+
39+
"""
40+
assert model.ims_id
41+
name = f"{model.port.node.node_name} {model.port.port_name}"
42+
vlan_list = [vlan for vlan_start, vlan_end in model.vlan.to_list_of_tuples() for vlan in range(vlan_start, vlan_end+1)]
43+
return [netbox.VlanPayload(vid=vlan, group=model.ims_id, name=f"{name} - {vlan}") for vlan in vlan_list]
44+
45+
46+
def build_sap_vlan_group_payload(model: SAPBlockProvisioning, subscription: SubscriptionModel) -> netbox.VlanGroupPayload:
47+
"""Create and return a Netbox VlanGroupPayload object for a :class:`~products.product_blocks.sap.SAPBlockProvisioning`.
48+
49+
Example payload::
50+
51+
{
52+
"name": "paris01a 0/0/1 vlan 4",
53+
"vid_ranges": "5, 10, 15-20",
54+
}
55+
56+
Args:
57+
model: SAPBlockProvisioning
58+
subscription: The Subscription that will be provisioned
59+
60+
Returns: :class:`netbox.VlanGroupPayload`
61+
62+
"""
63+
name = f"{model.port.node.node_name} {model.port.port_name}"
64+
slug = name.replace(" ", "-").replace("/", "-")
65+
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:
2269
"""Create and return a Netbox payload object for a :class:`~products.product_blocks.sap.SAPBlockProvisioning`.
2370
2471
Example payload::
2572
2673
{
2774
"vid": 4,
2875
"name": "paris01a 0/0/1 vlan 4",
29-
"status": "active"
76+
"status": "active",
77+
"group": 1
3078
}
3179
3280
Args:
@@ -36,4 +84,5 @@ def build_sap_payload(model: SAPBlockProvisioning, subscription: SubscriptionMod
3684
Returns: :class:`netbox.VlanPayload`
3785
3886
"""
39-
return netbox.VlanPayload(vid=int(model.vlan), name=f"{model.port.node.node_name} {model.port.port_name}")
87+
vlan_payloads = build_sap_vlans_payload(model, subscription)
88+
return netbox.VlansPayload(vlans=vlan_payloads)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version = "0.1.0"
44
requires-python = ">=3.12,<3.14"
55
dependencies = [
66
"deepdiff==8.6.1",
7-
"orchestrator-core==4.0.4",
7+
"orchestrator-core==4.5.3",
88
"pynetbox==7.4.1",
99
"rich==13.9.4",
1010
]

0 commit comments

Comments
 (0)