3
3
from virtualization .models import VirtualMachine
4
4
from dcim .models import Device
5
5
from netaddr import IPNetwork
6
-
7
6
from .labels import LabelDict
8
7
9
8
@@ -35,15 +34,56 @@ def get_custom_fields(self):
35
34
if len (label ) == 2 :
36
35
fields [label [0 ]] = label [1 ]
37
36
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
38
73
39
74
def get_targets (self , dv ):
40
75
return get_targets (dv , self .get_target_field )
41
76
42
77
def get_labels (self , dv ):
43
78
labels = LabelDict ()
44
79
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 )
46
84
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 ))
47
87
labels .add_metrics_label (self .get_metrics_field )
48
88
49
89
return labels
@@ -90,33 +130,38 @@ def get_labels(self, obj):
90
130
return labels
91
131
92
132
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" :
100
140
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 )
103
143
targets = get_interface_addresses (result )
104
144
return targets
105
- elif target == "loopback10" :
145
+ elif interface_name == "loopback10" :
106
146
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' )
109
149
targets = get_interface_addresses (result )
110
150
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
111
157
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 )]
115
160
116
161
def get_interface_addresses (interfaces ):
117
162
interfaces = [i for i in map (map_ip_address , interfaces ) if i is not None ]
118
163
return interfaces
119
164
120
165
def map_ip_address (interface ):
121
166
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