Skip to content

Commit 13e7bdb

Browse files
authored
Enhance label handling and target retrieval in serializers (#17)
- Updated add_netbox_labels method to accept an optional target_name parameter for better label customization. - Introduced get_configcontext_fields method to parse config context labels from query parameters. - Modified get_labels method to conditionally use target_in_name query parameter for label generation. - Refactored get_targets function to improve clarity and added support for 'cimc' interface type.
1 parent 896262d commit 13e7bdb

File tree

2 files changed

+68
-19
lines changed

2 files changed

+68
-19
lines changed

netbox_atlas_plugin/api/labels.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
class LabelDict(dict):
22

3-
def add_netbox_labels(self, obj):
3+
def add_netbox_labels(self, obj, target_name=None):
44
self.__setitem__('server_id', str(obj.id))
55
if getattr(obj, "status", None) is not None:
66
self.__setitem__('status', obj.status)
77

88
if getattr(obj, "display_name", None) is not None:
99
self.__setitem__('name', obj.display_name)
10+
if target_name:
11+
self.__setitem__('name', f"{obj.display_name}-{target_name}")
1012

1113
if getattr(obj, "name", None) is not None:
1214
self.__setitem__('name', obj.name)
15+
if target_name:
16+
self.__setitem__('name', f"{obj.name}-{target_name}")
1317

1418
if getattr(obj, "device_type", None) is not None:
1519
self.__setitem__('manufacturer', obj.device_type.manufacturer.slug)

netbox_atlas_plugin/api/serializers.py

+63-18
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from virtualization.models import VirtualMachine
44
from dcim.models import Device
55
from netaddr import IPNetwork
6-
76
from .labels import LabelDict
87

98

@@ -35,15 +34,56 @@ def get_custom_fields(self):
3534
if len(label) == 2:
3635
fields[label[0]] = label[1]
3736
return fields
37+
38+
@cached_property
39+
def get_configcontext_fields(self):
40+
cl = self.context['request'].query_params.get('configcontext_labels', None)
41+
fields = []
42+
if cl:
43+
fields = cl.split(';')
44+
return fields
45+
46+
def get_url(self, dv):
47+
return {
48+
'url': self.context['request'].build_absolute_uri(dv.get_absolute_url())
49+
}
50+
51+
def get_configcontext(self, dv):
52+
ctx = {}
53+
for pair in self.get_configcontext_fields:
54+
label = pair.split('=')
55+
if len(label) == 2:
56+
data = dv.local_context_data
57+
if data is None:
58+
return ctx
59+
*path, last = label[1].split(".")
60+
for bit in path:
61+
if bit.isdigit():
62+
data = data[int(bit)]
63+
else:
64+
data = data.setdefault(bit, {})
65+
if last.isdigit():
66+
last= int(last)
67+
try:
68+
ctx[label[0]] = data[last]
69+
except KeyError as e:
70+
pass
71+
72+
return ctx
3873

3974
def get_targets(self, dv):
4075
return get_targets(dv, self.get_target_field)
4176

4277
def get_labels(self, dv):
4378
labels = LabelDict()
4479

45-
labels.add_netbox_labels(dv)
80+
if self.context['request'].query_params.get('target_in_name', False):
81+
labels.add_netbox_labels(dv, None)
82+
else:
83+
labels.add_netbox_labels(dv, self.get_target_field)
4684
labels.add_custom_labels(self.get_custom_fields)
85+
labels.add_custom_labels(self.get_configcontext(dv))
86+
labels.add_custom_labels(self.get_url(dv))
4787
labels.add_metrics_label(self.get_metrics_field)
4888

4989
return labels
@@ -90,33 +130,38 @@ def get_labels(self, obj):
90130
return labels
91131

92132

93-
def get_targets(vm, target):
94-
if target == "primary_ip":
95-
if getattr(vm, "primary_ip", None) is not None:
96-
return [str(IPNetwork(vm.primary_ip.address).ip)]
97-
if getattr(vm, "primary_ip4", None) is not None:
98-
return [str(IPNetwork(vm.primary_ip4.address).ip)]
99-
elif target == "mgmt_only":
133+
def get_targets(obj, interface_name):
134+
if interface_name == "primary_ip":
135+
if getattr(obj, "primary_ip", None) is not None:
136+
return [str(IPNetwork(obj.primary_ip.address).ip)]
137+
if getattr(obj, "primary_ip4", None) is not None:
138+
return [str(IPNetwork(obj.primary_ip4.address).ip)]
139+
elif interface_name == "mgmt_only":
100140
targets = []
101-
if hasattr(vm, "interfaces") and vm.interfaces is not None:
102-
result = vm.interfaces.filter(mgmt_only=True)
141+
if hasattr(obj, "interfaces") and obj.interfaces is not None:
142+
result = obj.interfaces.filter(mgmt_only=True)
103143
targets = get_interface_addresses(result)
104144
return targets
105-
elif target == "loopback10":
145+
elif interface_name == "loopback10":
106146
targets = []
107-
if hasattr(vm, "interfaces") and vm.interfaces is not None:
108-
result = vm.interfaces.filter(name='Loopback10')
147+
if hasattr(obj, "interfaces") and obj.interfaces is not None:
148+
result = obj.interfaces.filter(name='Loopback10')
109149
targets = get_interface_addresses(result)
110150
return targets
151+
elif interface_name == "cimc":
152+
targets = []
153+
if hasattr(obj, "interfaces") and obj.interfaces is not None:
154+
result = obj.interfaces.filter(name='cimc')
155+
targets = get_interface_addresses(result)
156+
return targets
111157
else:
112-
if hasattr(vm, "primary_ip") and vm.primary_ip is not None:
113-
return [str(IPNetwork(vm.primary_ip.address).ip)]
114-
158+
if hasattr(obj, "primary_ip") and obj.primary_ip is not None:
159+
return [str(IPNetwork(obj.primary_ip.address).ip)]
115160

116161
def get_interface_addresses(interfaces):
117162
interfaces = [i for i in map(map_ip_address, interfaces) if i is not None]
118163
return interfaces
119164

120165
def map_ip_address(interface):
121166
if len(interface.ip_addresses.all()) > 0:
122-
return str(IPNetwork(interface.ip_addresses.first().address).ip)
167+
return str(IPNetwork(interface.ip_addresses.first().address).ip)

0 commit comments

Comments
 (0)