From 261dcba2135947a0355972017f4b14eb716888bf Mon Sep 17 00:00:00 2001 From: Neda Moeini <neda.moeini@geant.org> Date: Wed, 25 Oct 2023 14:59:16 +0200 Subject: [PATCH] Updated modification IP trunk workflow's unit tests. --- gso/workflows/iptrunk/migrate_iptrunk.py | 2 +- .../iptrunk/modify_trunk_interface.py | 10 ++--- test/services/conftest.py | 40 +++++++++++++++++++ test/workflows/iptrunk/test_create_iptrunk.py | 37 +---------------- .../iptrunk/test_modify_trunk_interface.py | 33 ++++++++++++++- 5 files changed, 78 insertions(+), 44 deletions(-) create mode 100644 test/services/conftest.py diff --git a/gso/workflows/iptrunk/migrate_iptrunk.py b/gso/workflows/iptrunk/migrate_iptrunk.py index e31d0011..b34d7d2c 100644 --- a/gso/workflows/iptrunk/migrate_iptrunk.py +++ b/gso/workflows/iptrunk/migrate_iptrunk.py @@ -69,7 +69,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ] routers = {} - for router_id, router_description in get_active_router_subscriptions(fields=["subscription_id", "description"]): + for router_id, router_description in get_active_router_subscriptions(includes=["subscription_id", "description"]): if router_id not in current_routers: current_router_site = Router.from_subscription(router_id).router.router_site.subscription old_side_site = Router.from_subscription(migrate_form_input.replace_side).router.router_site diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index a2448438..26d9c9cc 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -258,11 +258,11 @@ def allocate_interfaces_in_netbox(subscription: Iptrunk, previous_ae_members: di device_name=subscription.iptrunk.iptrunk_sides[side].iptrunk_side_node.router_fqdn, iface_name=interface.interface_name, ) - # detach the old interfaces from lag - nbclient.detach_interfaces_from_lag( - device_name=subscription.iptrunk.iptrunk_sides[side].iptrunk_side_node.router_fqdn, - lag_name=subscription.iptrunk.iptrunk_sides[side].iptrunk_side_ae_iface, - ) + # detach the old interfaces from lag + nbclient.detach_interfaces_from_lag( + device_name=subscription.iptrunk.iptrunk_sides[side].iptrunk_side_node.router_fqdn, + lag_name=subscription.iptrunk.iptrunk_sides[side].iptrunk_side_ae_iface, + ) return {"subscription": subscription} diff --git a/test/services/conftest.py b/test/services/conftest.py new file mode 100644 index 00000000..45019637 --- /dev/null +++ b/test/services/conftest.py @@ -0,0 +1,40 @@ +class MockedNetboxClient: + class BaseMockObject: + def __init__(self, **kwargs): + for key, value in kwargs.items(): + setattr(self, key, value) + + def get_device_by_name(self): + return self.BaseMockObject(id=1, name="test") + + def get_available_lags(self) -> list[str]: + return [f"LAG{lag}" for lag in range(1, 5)] + + def get_available_interfaces(self): + interfaces = [] + for interface in range(5): + interface_data = { + "name": f"Interface{interface}", + "module": {"display": f"Module{interface}"}, + "description": f"Description{interface}", + } + interfaces.append(interface_data) + return interfaces + + def create_interface(self): + return self.BaseMockObject(id=1, name="test") + + def attach_interface_to_lag(self): + return self.BaseMockObject(id=1, name="test") + + def reserve_interface(self): + return self.BaseMockObject(id=1, name="test") + + def allocate_interface(self): + return {"id": 1, "name": "test"} + + def free_interface(self): + return self.BaseMockObject(id=1, name="test") + + def detach_interfaces_from_lag(self): + return None diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py index a8f273f7..77ca88fd 100644 --- a/test/workflows/iptrunk/test_create_iptrunk.py +++ b/test/workflows/iptrunk/test_create_iptrunk.py @@ -8,6 +8,7 @@ from gso.products.product_blocks.iptrunk import IptrunkType, PhyPortCapacity from gso.services.crm import customer_selector, get_customer_by_name from gso.services.subscriptions import get_product_id_by_name from gso.utils.helpers import LAGMember +from test.services.conftest import MockedNetboxClient from test.workflows import ( assert_aborted, assert_complete, @@ -19,42 +20,6 @@ from test.workflows import ( ) -class MockedNetboxClient: - class BaseMockObject: - def __init__(self, **kwargs): - for key, value in kwargs.items(): - setattr(self, key, value) - - def get_device_by_name(self): - return self.BaseMockObject(id=1, name="test") - - def get_available_lags(self) -> list[str]: - return [f"LAG{lag}" for lag in range(1, 5)] - - def get_available_interfaces(self): - interfaces = [] - for interface in range(5): - interface_data = { - "name": f"Interface{interface}", - "module": {"display": f"Module{interface}"}, - "description": f"Description{interface}", - } - interfaces.append(interface_data) - return interfaces - - def create_interface(self): - return self.BaseMockObject(id=1, name="test") - - def attach_interface_to_lag(self): - return self.BaseMockObject(id=1, name="test") - - def reserve_interface(self): - return self.BaseMockObject(id=1, name="test") - - def allocate_interface(self): - return {"id": 1, "name": "test"} - - @pytest.fixture def netbox_client_mock(): # Mock NetboxClient methods diff --git a/test/workflows/iptrunk/test_modify_trunk_interface.py b/test/workflows/iptrunk/test_modify_trunk_interface.py index 8f39c4d7..5bda8463 100644 --- a/test/workflows/iptrunk/test_modify_trunk_interface.py +++ b/test/workflows/iptrunk/test_modify_trunk_interface.py @@ -12,16 +12,40 @@ from test.workflows import ( run_workflow, user_accept_and_assert_suspended, ) +from test.workflows.iptrunk.test_create_iptrunk import MockedNetboxClient @pytest.mark.workflow @patch("gso.workflows.iptrunk.modify_trunk_interface.provisioning_proxy.provision_ip_trunk") +@patch("gso.services.netbox_client.NetboxClient.get_device_by_name") +@patch("gso.services.netbox_client.NetboxClient.get_available_interfaces") +@patch("gso.services.netbox_client.NetboxClient.attach_interface_to_lag") +@patch("gso.services.netbox_client.NetboxClient.reserve_interface") +@patch("gso.services.netbox_client.NetboxClient.allocate_interface") +@patch("gso.services.netbox_client.NetboxClient.free_interface") +@patch("gso.services.netbox_client.NetboxClient.detach_interfaces_from_lag") def test_iptrunk_modify_trunk_interface_success( + mocked_detach_interfaces_from_lag, + mocked_free_interface, + mocked_allocate_interface, + mocked_reserve_interface, + mocked_attach_interface_to_lag, + mocked_get_available_interfaces, + mocked_get_device_by_name, mock_provision_ip_trunk, iptrunk_subscription_factory, faker, ): # Set up mock return values + mocked_netbox = MockedNetboxClient() + mocked_get_device_by_name.return_value = mocked_netbox.get_device_by_name() + mocked_get_available_interfaces.return_value = mocked_netbox.get_available_interfaces() + mocked_attach_interface_to_lag.return_value = mocked_netbox.attach_interface_to_lag() + mocked_reserve_interface.return_value = mocked_netbox.reserve_interface() + mocked_allocate_interface.return_value = mocked_netbox.allocate_interface() + mocked_free_interface.return_value = mocked_netbox.free_interface() + mocked_detach_interfaces_from_lag.return_value = mocked_netbox.detach_interfaces_from_lag() + product_id = iptrunk_subscription_factory() new_sid = faker.geant_sid() new_description = faker.sentence() @@ -31,12 +55,12 @@ def test_iptrunk_modify_trunk_interface_success( new_side_a_sid = faker.geant_sid() new_side_a_ae_members = [ - {"interface_name": faker.network_interface(), "interface_description": faker.sentence()} for _ in range(5) + {"interface_name": f"Interface{i}", "interface_description": faker.sentence()} for i in range(5) ] new_side_b_sid = faker.geant_sid() new_side_b_ae_members = [ - {"interface_name": faker.network_interface(), "interface_description": faker.sentence()} for _ in range(5) + {"interface_name": f"Interface{i}", "interface_description": faker.sentence()} for i in range(5) ] # Run workflow @@ -86,6 +110,11 @@ def test_iptrunk_modify_trunk_interface_success( assert "active" == subscription.status assert mock_provision_ip_trunk.call_count == 2 + # Assert all Netbox calls have been made + assert mocked_reserve_interface.call_count == 10 # 5 interfaces per side + assert mocked_attach_interface_to_lag.call_count == 10 # 5 interfaces per side + assert mocked_free_interface.call_count == 4 # 2 interfaces per side(The old ones) + assert mocked_detach_interfaces_from_lag.call_count == 2 # 1 time per side # Assert all subscription properties have been updated correctly assert subscription.description == f"IP trunk, geant_s_sid:{new_sid}" -- GitLab