Skip to content

Commit adf151f

Browse files
authored
fix: fix complex vm interface update case (#82)
* fix: fix complex vm interface update case * lint
1 parent 9b01b3e commit adf151f

File tree

4 files changed

+83
-8
lines changed

4 files changed

+83
-8
lines changed

netbox_diode_plugin/api/differ.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import datetime
77
import logging
88

9+
import netaddr
910
from django.contrib.contenttypes.models import ContentType
1011
from django.core.exceptions import ValidationError
11-
from utilities.data import shallow_compare_dict
1212
from django.db.backends.postgresql.psycopg_any import NumericRange
13-
import netaddr
13+
from utilities.data import shallow_compare_dict
1414

1515
from .common import Change, ChangeSet, ChangeSetException, ChangeSetResult, ChangeType, error_from_validation_error
1616
from .plugin_utils import get_primary_value, legal_fields

netbox_diode_plugin/api/matcher.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from functools import cache, lru_cache
99
from typing import Type
1010

11+
import netaddr
1112
from core.models import ObjectType as NetBoxType
1213
from django.conf import settings
1314
from django.contrib.contenttypes.fields import ContentType
@@ -17,7 +18,6 @@
1718
from django.db.models.fields import SlugField
1819
from django.db.models.lookups import Exact
1920
from django.db.models.query_utils import Q
20-
import netaddr
2121
from extras.models.customfields import CustomField
2222

2323
from .common import AutoSlug, UnresolvedReference

netbox_diode_plugin/api/transformer.py

+4
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,10 @@ def _resolve_existing_references(entities: list[dict]) -> list[dict]:
364364
data = copy.deepcopy(data)
365365
_update_resolved_refs(data, new_refs)
366366

367+
if data.get('_is_post_create'):
368+
resolved.append(data)
369+
continue
370+
367371
existing = find_existing_object(data, object_type)
368372
if existing is not None:
369373
logger.debug(f"existing {data} -> {existing}")

netbox_diode_plugin/tests/test_api_diff_and_apply.py

+76-5
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@
22
# Copyright 2024 NetBox Labs Inc
33
"""Diode NetBox Plugin - Tests."""
44

5+
import copy
56
import datetime
67
import decimal
78
import logging
89
from uuid import uuid4
910

10-
11+
import netaddr
12+
from circuits.models import Circuit
1113
from core.models import ObjectType
1214
from dcim.models import Device, Interface, Site
13-
from ipam.models import VLANGroup
14-
from circuits.models import Circuit
1515
from django.contrib.auth import get_user_model
1616
from extras.models import CustomField
1717
from extras.models.customfields import CustomFieldTypeChoices
18-
from ipam.models import IPAddress
19-
import netaddr
18+
from ipam.models import IPAddress, VLANGroup
2019
from rest_framework import status
2120
from users.models import Token
2221
from utilities.testing import APITestCase
22+
from virtualization.models import VMInterface
2323

2424
logger = logging.getLogger(__name__)
2525

@@ -822,7 +822,78 @@ def test_generate_diff_update_ip_address(self):
822822
self.assertEqual(ip2.vrf, None)
823823
self.assertEqual(ip2.status, "deprecated")
824824

825+
def test_generate_diff_and_apply_complex_vminterface(self):
826+
"""Test generate diff and apply and update a complex vm interface."""
827+
payload = {
828+
"timestamp": 1,
829+
"object_type": "virtualization.vminterface",
830+
"entity": {
831+
"vm_interface": {
832+
"virtual_machine": {
833+
"name": "Virtual Machine 15e00bdf-4294-41df-a450-ffcfec6c7f2b",
834+
"status": "active",
835+
"site": {
836+
"name": "Site 10"
837+
},
838+
"cluster": {
839+
"name": "Cluster 10",
840+
"type": {
841+
"name": "Cluster type 10"
842+
},
843+
"group": {
844+
"name": "Cluster group 10"
845+
},
846+
"status": "active",
847+
"scope_site": {
848+
"name": "Site 10"
849+
}
850+
},
851+
"role": {
852+
"name": "Role 10"
853+
},
854+
"platform": {
855+
"name": "Platform 10",
856+
"manufacturer": {
857+
"name": "Manufacturer 10"
858+
}
859+
},
860+
"vcpus": 1.0,
861+
"memory": "4096",
862+
"disk": "100",
863+
"description": "Virtual Machine A description",
864+
"comments": "Lorem ipsum dolor sit amet",
865+
"tags": [
866+
{
867+
"name": "tag 1"
868+
}
869+
]
870+
},
871+
"name": "Interface 47e8a593-8b74-4e94-9a8e-c02113f0bf88",
872+
"enabled": False,
873+
"mtu": "1500",
874+
"primary_mac_address": {
875+
"mac_address": "00:00:00:00:00:00"
876+
},
877+
"description": "Interface A description",
878+
"tags": [
879+
{
880+
"name": "tag 1"
881+
}
882+
]
883+
}
884+
}
885+
}
886+
_ = self.diff_and_apply(payload)
825887

888+
payload2 = copy.deepcopy(payload)
889+
payload2['entity']['vm_interface']["mtu"] = "2000"
890+
payload2['entity']['vm_interface']["primary_mac_address"] = {
891+
"mac_address": "00:00:00:00:00:01"
892+
}
893+
_ = self.diff_and_apply(payload2)
894+
vm_interface = VMInterface.objects.get(name="Interface 47e8a593-8b74-4e94-9a8e-c02113f0bf88")
895+
self.assertEqual(vm_interface.mtu, 2000)
896+
self.assertEqual(vm_interface.primary_mac_address.mac_address, "00:00:00:00:00:01")
826897

827898
def diff_and_apply(self, payload):
828899
"""Diff and apply the payload."""

0 commit comments

Comments
 (0)