Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions python/neutron-understack/neutron_understack/nautobot.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,22 +128,21 @@ def ucvni_create(
project_id: str,
ucvni_group: str,
network_name: str,
segment_id: int | None = None,
segmentation_id: int,
) -> dict:
payload = {
"id": network_id,
"tenant": project_id,
"name": network_name,
"ucvni_group": ucvni_group,
"status": {"name": "Active"},
"ucvni_id": segmentation_id,
}

if segment_id:
payload["ucvni_id"] = segment_id
payload["ucvni_type"] = "INFRA"

url = "/api/plugins/undercloud-vni/ucvnis/"
return self.make_api_request("POST", url, payload)
ucvni: pynautobot.core.response.Record = (
self.api.plugins.undercloud_vni.ucvnis.create(payload)
)
return dict(ucvni)

def ucvni_delete(self, network_id):
url = f"/api/plugins/undercloud-vni/ucvnis/{network_id}/"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ def create_network_postcommit(self, context):
project_id=project_id,
ucvni_group=ucvni_group,
network_name=network_name,
segmentation_id=segmentation_id,
)
LOG.info(
"network %(net_id)s has been added on ucvni_group %(ucvni_group)s, "
Expand All @@ -94,20 +95,6 @@ def create_network_postcommit(self, context):
)
self._create_nautobot_namespace(network_id, external)

if provider_type != p_const.TYPE_VLAN:
return

vlan_group_id_and_vlan_tag = self.nb.prep_switch_interface(
connected_interface_id=conf.network_node_switchport_uuid,
ucvni_uuid=network_id,
modify_native_vlan=False,
vlan_tag=int(segmentation_id),
)
self.undersync.sync_devices(
vlan_group_uuids=str(vlan_group_id_and_vlan_tag["vlan_group_id"]),
dry_run=cfg.CONF.ml2_understack.undersync_dry_run,
)

def update_network_precommit(self, context):
pass

Expand All @@ -127,21 +114,10 @@ def delete_network_postcommit(self, context):
conf = cfg.CONF.ml2_understack
ucvni_group = conf.ucvni_group

if provider_type == p_const.TYPE_VLAN:
vlan_group_id = self.nb.detach_port(
connected_interface_id=conf.network_node_switchport_uuid,
ucvni_uuid=network_id,
)
self.nb.ucvni_delete(network_id)
self.undersync.sync_devices(
vlan_group_uuids=str(vlan_group_id),
dry_run=cfg.CONF.ml2_understack.undersync_dry_run,
)
elif provider_type == p_const.TYPE_VXLAN:
self.nb.ucvni_delete(network_id)
else:
if provider_type != p_const.TYPE_VXLAN:
return

self.nb.ucvni_delete(network_id)
LOG.info(
"network %(net_id)s has been deleted from ucvni_group %(ucvni_group)s, "
"physnet %(physnet)s",
Expand Down Expand Up @@ -295,19 +271,15 @@ def delete_port_postcommit(self, context):
def _configure_switchport_on_bind(self, context: PortContext) -> None:
trunk_details = context.current.get("trunk_details", {})
network_id = context.current["network_id"]
network_type = context.network.current.get("provider:network_type")
connected_interface_uuid = utils.fetch_connected_interface_uuid(
context.current["binding:profile"], LOG
)

if trunk_details:
self._configure_trunk(trunk_details, connected_interface_uuid)
if network_type == p_const.TYPE_VLAN:
vlan_tag = int(context.network.current.get("provider:segmentation_id"))
else:
vlan_tag = None

nb_vlan_group_id = self.update_nautobot(
network_id, connected_interface_uuid, vlan_tag
network_id, connected_interface_uuid, None
)

self.undersync.sync_devices(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def network_dict(ml2_plugin, network, network_segment) -> dict:

@pytest.fixture
def network_segment(network) -> NetworkSegment:
return NetworkSegment(network_type="vxlan", network=network)
return NetworkSegment(network_type="vxlan", network=network, segmentation_id=100)


@pytest.fixture
Expand Down
43 changes: 18 additions & 25 deletions python/neutron-understack/neutron_understack/tests/test_nautobot.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import uuid
from unittest.mock import MagicMock
from unittest.mock import patch

Expand All @@ -11,13 +10,17 @@
@pytest.fixture
def mock_pynautobot_api():
with patch("neutron_understack.nautobot.pynautobot.api") as mock_api:
mock_ipam = MagicMock()
mock_ipam.vlans.delete = MagicMock()
mock_ipam.vlans.create = MagicMock()
mock_api_instance = MagicMock()

mock_api.return_value.ipam = mock_ipam
# Setup mock structure
mock_api_instance.ipam.vlans.delete = MagicMock()
mock_api_instance.ipam.vlans.create = MagicMock()

yield mock_api, mock_ipam
mock_api_instance.plugins.undercloud_vni.ucvnis.create = MagicMock()

mock_api.return_value = mock_api_instance

yield mock_api, mock_api_instance


@pytest.fixture
Expand All @@ -26,16 +29,16 @@ def nautobot(mock_pynautobot_api):


def test_delete_vlan(nautobot, mock_pynautobot_api):
_, mock_ipam = mock_pynautobot_api
_, mock_api_instance = mock_pynautobot_api
vlan_id = "123"

nautobot.delete_vlan(vlan_id)

mock_ipam.vlans.delete.assert_called_once_with([vlan_id])
mock_api_instance.ipam.vlans.delete.assert_called_once_with([vlan_id])


def test_create_vlan_and_associate_vlan_to_ucvni(nautobot, mock_pynautobot_api):
_, mock_ipam = mock_pynautobot_api
_, mock_api_instance = mock_pynautobot_api

payload = VlanPayload(
id="vlan-123",
Expand All @@ -57,27 +60,17 @@ def test_create_vlan_and_associate_vlan_to_ucvni(nautobot, mock_pynautobot_api):

nautobot.create_vlan_and_associate_vlan_to_ucvni(payload)

mock_ipam.vlans.create.assert_called_once_with(expected_payload_dict)
mock_api_instance.ipam.vlans.create.assert_called_once_with(expected_payload_dict)


def test_ucvni_create(
mocker,
network_id,
ucvni_create_response,
nautobot,
):
mocker.patch.object(
nautobot, "make_api_request", return_value=ucvni_create_response
)
def test_ucvni_create(network_id, ucvni_create_response, nautobot, mock_pynautobot_api):
_, mock_ucvni = mock_pynautobot_api
project_id = "d3c2c85bdbf24ff5843f323524b63768"
response = nautobot.ucvni_create(
nautobot.ucvni_create(
network_id=network_id.hex,
project_id=project_id,
ucvni_group="f6843091-845d-4195-8132-960125e05f7b",
network_name="PROV-NET500",
segmentation_id=2010,
)

assert "tenant" in response[0]
tenant_obj = response[0].get("tenant", {})

assert tenant_obj.get("id") == str(uuid.UUID(project_id))
mock_ucvni.plugins.undercloud_vni.ucvnis.create.assert_called_once()
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ def test_vxlan_network(
network_id=str(network_id),
project_id=str(project_id),
ucvni_group=str(ucvni_group_id),
segmentation_id=network_context.current["provider:segmentation_id"],
network_name=network_context.current["name"],
)
understack_driver._create_nautobot_namespace.assert_called_once_with(
Expand Down