Skip to content
Snippets Groups Projects
Verified Commit 0956a7ea authored by Karel van Klink's avatar Karel van Klink :smiley_cat:
Browse files

Allow for creation of Edge Ports on a Juniper router

parent 66028d2e
No related branches found
No related tags found
1 merge request!409Allow for creation of Edge Ports on a Juniper router
Pipeline #93544 passed
...@@ -31,8 +31,9 @@ from gso.utils.helpers import ( ...@@ -31,8 +31,9 @@ from gso.utils.helpers import (
partner_choice, partner_choice,
validate_edge_port_number_of_members_based_on_lacp, validate_edge_port_number_of_members_based_on_lacp,
) )
from gso.utils.shared_enums import Vendor
from gso.utils.types.geant_ids import IMPORTED_GA_ID from gso.utils.types.geant_ids import IMPORTED_GA_ID
from gso.utils.types.interfaces import LAGMember, PhysicalPortCapacity from gso.utils.types.interfaces import JuniperLAGMember, LAGMember, PhysicalPortCapacity
from gso.utils.types.tt_number import TTNumber from gso.utils.types.tt_number import TTNumber
from gso.utils.workflow_steps import start_moodi, stop_moodi from gso.utils.workflow_steps import start_moodi, stop_moodi
from gso.workflows.shared import create_summary_form from gso.workflows.shared import create_summary_form
...@@ -50,7 +51,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -50,7 +51,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
service_type: EdgePortType service_type: EdgePortType
enable_lacp: bool = False enable_lacp: bool = False
speed: PhysicalPortCapacity speed: PhysicalPortCapacity
encapsulation: EncapsulationType = EncapsulationType.DOT1Q encapsulation: EncapsulationType | str = EncapsulationType.DOT1Q # TODO: remove type hint workaround
number_of_members: int number_of_members: int
minimum_links: int minimum_links: int
mac_address: str | None = None mac_address: str | None = None
...@@ -81,13 +82,16 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -81,13 +82,16 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
initial_user_input = yield CreateEdgePortForm initial_user_input = yield CreateEdgePortForm
class EdgePortLAGMember(LAGMember): class NokiaEdgePortLAGMember(LAGMember):
interface_name: available_interfaces_choices( # type: ignore[valid-type] interface_name: available_interfaces_choices( # type: ignore[valid-type]
initial_user_input.node, initial_user_input.speed initial_user_input.node, initial_user_input.speed
) )
selected_router = Router.from_subscription(initial_user_input.node)
lag_member = JuniperLAGMember if selected_router.router.vendor == Vendor.JUNIPER else NokiaEdgePortLAGMember
lag_ae_members = Annotated[ lag_ae_members = Annotated[
list[EdgePortLAGMember], list[lag_member], # type: ignore[valid-type]
AfterValidator(validate_unique_list), AfterValidator(validate_unique_list),
Len( Len(
min_length=initial_user_input.number_of_members, min_length=initial_user_input.number_of_members,
...@@ -98,7 +102,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -98,7 +102,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
class SelectInterfaceForm(FormPage): class SelectInterfaceForm(FormPage):
model_config = ConfigDict(title="Select Interfaces") model_config = ConfigDict(title="Select Interfaces")
name: available_service_lags_choices(initial_user_input.node) # type: ignore[valid-type] name: available_service_lags_choices(initial_user_input.node) or str # type: ignore[valid-type]
description: str | None = None description: str | None = None
ae_members: lag_ae_members ae_members: lag_ae_members
......
...@@ -134,7 +134,7 @@ class FakerProvider(BaseProvider): ...@@ -134,7 +134,7 @@ class FakerProvider(BaseProvider):
return self.generator.numerify("ae@#") return self.generator.numerify("ae@#")
def nokia_lag_interface_name(self) -> str: def nokia_lag_interface_name(self) -> str:
return self.generator.numerify("lag-@#") return self.generator.numerify("lag-3#")
def link_members_juniper(self) -> LAGMemberList[LAGMember]: def link_members_juniper(self) -> LAGMemberList[LAGMember]:
iface_amount = self.generator.random_int(min=2, max=5) iface_amount = self.generator.random_int(min=2, max=5)
......
...@@ -47,51 +47,57 @@ def _netbox_client_mock(): ...@@ -47,51 +47,57 @@ def _netbox_client_mock():
@pytest.fixture() @pytest.fixture()
def input_form_wizard_data(request, router_subscription_factory, partner_factory, faker): def input_form_wizard_data(request, router_subscription_factory, partner_factory, faker):
create_edge_port_step = { def input_form_factory(vendor: Vendor = Vendor.NOKIA):
"tt_number": faker.tt_number(), partner = partner_factory(name="GAAR", email=faker.email())
"node": str(router_subscription_factory(vendor=Vendor.NOKIA).subscription_id), create_edge_port_step = {
"partner": partner_factory(name="GAAR", email=faker.email())["partner_id"], "tt_number": faker.tt_number(),
"service_type": EdgePortType.PUBLIC, "node": str(router_subscription_factory(vendor=vendor, partner=partner).subscription_id),
"enable_lacp": True, "partner": partner["partner_id"],
"speed": PhysicalPortCapacity.HUNDRED_GIGABIT_PER_SECOND, "service_type": EdgePortType.PUBLIC,
"encapsulation": EncapsulationType.DOT1Q, "enable_lacp": True,
"number_of_members": 2, "speed": PhysicalPortCapacity.HUNDRED_GIGABIT_PER_SECOND,
"minimum_links": 1, "encapsulation": EncapsulationType.DOT1Q,
"custom_service_name": faker.sentence(), "number_of_members": 2,
"generate_ga_id": False, "minimum_links": 1,
"ga_id": "GA-12345", "custom_service_name": faker.sentence(),
} "generate_ga_id": False,
create_edge_port_interface_step = { "ga_id": "GA-12345",
"name": "lag-21", }
"description": faker.sentence(), create_edge_port_interface_step = {
"ae_members": [ "name": faker.nokia_lag_interface_name(),
{ "description": faker.sentence(),
"interface_name": f"Interface{interface}", "ae_members": [
"interface_description": faker.sentence(), {
} "interface_name": faker.network_interface() if vendor == Vendor.JUNIPER else f"Interface{i}",
for interface in range(2) "interface_description": faker.sentence(),
], }
} for i in range(2)
summary_view_step = {} ],
}
return [ summary_view_step = {}
create_edge_port_step,
create_edge_port_interface_step, return [
summary_view_step, create_edge_port_step,
] create_edge_port_interface_step,
summary_view_step,
]
return input_form_factory
@pytest.mark.workflow() @pytest.mark.workflow()
@pytest.mark.parametrize("router_vendor", [*Vendor.values()])
@patch("gso.services.lso_client._send_request") @patch("gso.services.lso_client._send_request")
def test_successful_edge_port_creation( def test_successful_edge_port_creation(
mock_execute_playbook, mock_execute_playbook,
router_vendor,
input_form_wizard_data, input_form_wizard_data,
faker, faker,
_netbox_client_mock, # noqa: PT019 _netbox_client_mock, # noqa: PT019
test_client, test_client,
): ):
product_id = get_product_id_by_name(ProductName.EDGE_PORT) product_id = get_product_id_by_name(ProductName.EDGE_PORT)
initial_data = [{"product": product_id}, *input_form_wizard_data] initial_data = [{"product": product_id}, *input_form_wizard_data(vendor=router_vendor)]
result, process_stat, step_log = run_workflow("create_edge_port", initial_data) result, process_stat, step_log = run_workflow("create_edge_port", initial_data)
for _ in range(3): for _ in range(3):
...@@ -106,9 +112,12 @@ def test_successful_edge_port_creation( ...@@ -106,9 +112,12 @@ def test_successful_edge_port_creation(
subscription = EdgePort.from_subscription(subscription_id) subscription = EdgePort.from_subscription(subscription_id)
assert subscription.status == "active" assert subscription.status == "active"
router_fqdn = Router.from_subscription(input_form_wizard_data[0]["node"]).router.router_fqdn router_fqdn = Router.from_subscription(initial_data[1]["node"]).router.router_fqdn
assert subscription.edge_port.ga_id == "GA-12345" assert subscription.edge_port.ga_id == "GA-12345"
assert subscription.description == f"Edge Port lag-21 on {router_fqdn}, GAAR, {subscription.edge_port.ga_id}" assert (
subscription.description
== f"Edge Port {initial_data[2]["name"]} on {router_fqdn}, GAAR, {subscription.edge_port.ga_id}"
)
assert len(subscription.edge_port.edge_port_ae_members) == 2 assert len(subscription.edge_port.edge_port_ae_members) == 2
assert mock_execute_playbook.call_count == 4 assert mock_execute_playbook.call_count == 4
...@@ -123,7 +132,7 @@ def test_successful_edge_port_creation_with_auto_ga_id_creation( ...@@ -123,7 +132,7 @@ def test_successful_edge_port_creation_with_auto_ga_id_creation(
test_client, test_client,
): ):
product_id = get_product_id_by_name(ProductName.EDGE_PORT) product_id = get_product_id_by_name(ProductName.EDGE_PORT)
initial_data = [{"product": product_id}, *input_form_wizard_data] initial_data = [{"product": product_id}, *input_form_wizard_data()]
initial_data[1]["generate_ga_id"] = True initial_data[1]["generate_ga_id"] = True
initial_data[1]["ga_id"] = None initial_data[1]["ga_id"] = None
result, process_stat, step_log = run_workflow("create_edge_port", initial_data) result, process_stat, step_log = run_workflow("create_edge_port", initial_data)
...@@ -152,8 +161,8 @@ def test_edge_port_creation_with_invalid_input( ...@@ -152,8 +161,8 @@ def test_edge_port_creation_with_invalid_input(
): ):
product_id = get_product_id_by_name(ProductName.EDGE_PORT) product_id = get_product_id_by_name(ProductName.EDGE_PORT)
# If the number of members is greater than 1 then LACP must be enabled. # If the number of members is greater than 1 then LACP must be enabled.
input_form_wizard_data[0]["enable_lacp"] = False initial_data = [{"product": product_id}, *input_form_wizard_data()]
initial_data = [{"product": product_id}, *input_form_wizard_data] initial_data[1]["enable_lacp"] = False
with pytest.raises(FormValidationError) as error: with pytest.raises(FormValidationError) as error:
run_workflow("create_edge_port", initial_data) run_workflow("create_edge_port", initial_data)
...@@ -175,7 +184,7 @@ def test_edge_port_creation_with_existing_ga_id( ...@@ -175,7 +184,7 @@ def test_edge_port_creation_with_existing_ga_id(
): ):
subscription = edge_port_subscription_factory(ga_id="GA-12345") subscription = edge_port_subscription_factory(ga_id="GA-12345")
product_id = get_product_id_by_name(ProductName.EDGE_PORT) product_id = get_product_id_by_name(ProductName.EDGE_PORT)
initial_data = [{"product": product_id}, *input_form_wizard_data] initial_data = [{"product": product_id}, *input_form_wizard_data()]
with pytest.raises(FormValidationError) as error: with pytest.raises(FormValidationError) as error:
run_workflow("create_edge_port", initial_data) run_workflow("create_edge_port", initial_data)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment