@@ -10,13 +10,13 @@ package netbox
10
10
import (
11
11
"fmt"
12
12
"regexp"
13
- "strconv"
14
13
"strings"
15
14
"sync"
16
15
"sync/atomic"
17
16
"time"
18
17
19
18
dbModel "github.com/cloudflare/octopus/pkg/connector/netbox/model"
19
+ nbUtils "github.com/cloudflare/octopus/pkg/connector/netbox/utils"
20
20
"github.com/cloudflare/octopus/pkg/model"
21
21
"github.com/cloudflare/octopus/proto/octopus"
22
22
@@ -192,7 +192,7 @@ func (n *NetboxConnector) addDevices(t *model.Topology) error {
192
192
topoDev .Role = d .DeviceRole .Slug
193
193
topoDev .DeviceType = d .DeviceType .Slug
194
194
195
- md , err := metaDataFromTags (d .Tags )
195
+ md , err := nbUtils . GetMetaDataFromTags (d .Tags )
196
196
if err != nil {
197
197
return fmt .Errorf ("unable to get meta data: %v" , err )
198
198
}
@@ -218,7 +218,7 @@ func (n *NetboxConnector) addInterfaces(t *model.Topology) error {
218
218
t .DevicesByInterfaceID [nbIfa .ID ] = d
219
219
t .Interfaces [nbIfa .ID ] = ifa
220
220
221
- md , err := metaDataFromTags (nbIfa .Tags )
221
+ md , err := nbUtils . GetMetaDataFromTags (nbIfa .Tags )
222
222
if err != nil {
223
223
return fmt .Errorf ("unable to get meta data: %v" , err )
224
224
}
@@ -255,15 +255,15 @@ func (n *NetboxConnector) addInterfaceUnits(t *model.Topology) error {
255
255
return fmt .Errorf ("can not find interface %s:%s" , nbIfa .Device .Name , nbIfa .Parent .Name )
256
256
}
257
257
258
- vlanTag , err := parseUnitStr (unitStr )
258
+ vlanTag , err := nbUtils . ParseUnitStr (unitStr )
259
259
if err != nil {
260
260
return fmt .Errorf ("Unable to convert unit %q (id=%d) (interface %q) to int for %s:%s. Ignoring logical interface." , unitStr , nbIfa .ID , nbIfa .Name , nbIfa .Device .Name , nbIfa .Parent .Name )
261
261
}
262
262
263
263
u := ifa .AddUnitIfNotExists (vlanTag )
264
264
t .DevicesByInterfaceID [nbIfa .ID ] = d
265
265
266
- md , err := metaDataFromTags (nbIfa .Tags )
266
+ md , err := nbUtils . GetMetaDataFromTags (nbIfa .Tags )
267
267
if err != nil {
268
268
return fmt .Errorf ("unable to get meta data: %v" , err )
269
269
}
@@ -274,34 +274,6 @@ func (n *NetboxConnector) addInterfaceUnits(t *model.Topology) error {
274
274
return nil
275
275
}
276
276
277
- func parseUnitStr (unitStr string ) (model.VLANTag , error ) {
278
- if strings .Contains (unitStr , "." ) {
279
- parts := strings .Split (unitStr , "." )
280
- if len (parts ) != 2 {
281
- return model.VLANTag {}, fmt .Errorf ("invalid unit string %q" , unitStr )
282
- }
283
-
284
- outerTag , err := strconv .Atoi (parts [0 ])
285
- if err != nil {
286
- return model.VLANTag {}, fmt .Errorf ("unable to convert %q to int: %v" , parts [0 ], err )
287
- }
288
-
289
- innerTag , err := strconv .Atoi (parts [1 ])
290
- if err != nil {
291
- return model.VLANTag {}, fmt .Errorf ("unable to convert %q to int: %v" , parts [1 ], err )
292
- }
293
-
294
- return model .NewVLANTag (uint16 (outerTag ), uint16 (innerTag )), nil
295
- }
296
-
297
- ctag , err := strconv .Atoi (unitStr )
298
- if err != nil {
299
- return model.VLANTag {}, fmt .Errorf ("unable to convert %q to int: %v" , unitStr , err )
300
- }
301
-
302
- return model .NewVLANTag (0 , uint16 (ctag )), nil
303
- }
304
-
305
277
func (n * NetboxConnector ) addIPAddresses (t * model.Topology ) error {
306
278
for _ , nbIP := range n .ipAddresses {
307
279
if nbIP .AssignedObjectID == 0 || nbIP .AssignedObjectTypeID != n .client .GetDcimInterfaceTypeID () {
@@ -323,18 +295,18 @@ func (n *NetboxConnector) addIPAddresses(t *model.Topology) error {
323
295
return fmt .Errorf ("interface with id %d not found" , ifaID )
324
296
}
325
297
326
- _ , vt , err := getInterfaceAndVLANTag (dcimIfa .Name )
298
+ _ , vt , err := nbUtils . GetInterfaceAndVLANTag (dcimIfa .Name )
327
299
if err != nil {
328
300
return fmt .Errorf ("unable to extract interface name and unit from %q: %v" , dcimIfa .Name , err )
329
301
}
330
302
331
- pfx , err := bnet .PrefixFromString (sanitizeIPAddress (nbIP .Address ))
303
+ pfx , err := bnet .PrefixFromString (nbUtils . SanitizeIPAddress (nbIP .Address ))
332
304
if err != nil {
333
305
return fmt .Errorf ("failed to parse IP %q: %v" , nbIP .Address , err )
334
306
}
335
307
336
308
ip := model .NewIP (* pfx )
337
- getCustomFieldData (ip .MetaData , nbIP .CustomFieldData )
309
+ nbUtils . GetCustomFieldData (ip .MetaData , nbIP .CustomFieldData )
338
310
339
311
u := ifa .AddUnitIfNotExists (vt )
340
312
if pfx .Addr ().IsIPv4 () {
@@ -347,26 +319,14 @@ func (n *NetboxConnector) addIPAddresses(t *model.Topology) error {
347
319
return nil
348
320
}
349
321
350
- func sanitizeIPAddress (addr string ) string {
351
- if strings .Contains (addr , "/" ) {
352
- return addr
353
- }
354
-
355
- if strings .Contains (addr , "." ) {
356
- return addr + "/32"
357
- }
358
-
359
- return addr + "/128"
360
- }
361
-
362
322
func (n * NetboxConnector ) addPrefixes (t * model.Topology ) error {
363
323
for _ , p := range n .prefixes {
364
324
pfx , err := bnet .PrefixFromString (p .Prefix )
365
325
if err != nil {
366
326
return fmt .Errorf ("failed to parse Prefix %q: %v" , p .Prefix , err )
367
327
}
368
328
369
- md , err := metaDataFromTags (p .Tags )
329
+ md , err := nbUtils . GetMetaDataFromTags (p .Tags )
370
330
if err != nil {
371
331
return fmt .Errorf ("failed to get Tags for Prefix %q: %v" , p .Prefix , err )
372
332
}
@@ -380,36 +340,6 @@ func (n *NetboxConnector) addPrefixes(t *model.Topology) error {
380
340
return nil
381
341
}
382
342
383
- func metaDataFromTags (tags []string ) (* model.MetaData , error ) {
384
- ret := model .NewMetaData ()
385
- for _ , tag := range tags {
386
- parts := strings .Split (tag , "=" )
387
-
388
- // Semantic Tag
389
- if len (parts ) == 2 {
390
- if _ , exists := ret .SemanticTags [parts [0 ]]; exists {
391
- return nil , fmt .Errorf ("Key %q exists already: %q vs. %q" , parts [0 ], ret .SemanticTags [parts [0 ]], parts [1 ])
392
- }
393
-
394
- ret .SemanticTags [parts [0 ]] = parts [1 ]
395
-
396
- } else {
397
- // Regular Tag
398
- ret .Tags = append (ret .Tags , tag )
399
- }
400
- }
401
-
402
- return ret , nil
403
- }
404
-
405
- func getCustomFieldData (md * model.MetaData , customFieldData string ) {
406
- if customFieldData == "" || customFieldData == "{}" {
407
- return
408
- }
409
-
410
- md .CustomFieldData = customFieldData
411
- }
412
-
413
343
func (n * NetboxConnector ) getCableEnd (terminationType int32 , terminationID int64 , t * model.Topology ) (* model.CableEnd , error ) {
414
344
ce := model.CableEnd {}
415
345
@@ -573,62 +503,6 @@ func (n *NetboxConnector) addFrontPorts(t *model.Topology) error {
573
503
return nil
574
504
}
575
505
576
- func getInterfaceAndVLANTag (name string ) (ifName string , vt model.VLANTag , err error ) {
577
- if isLogicalInterface (name ) {
578
- return extractInterfaceAndUnit (name )
579
- }
580
-
581
- return name , model.VLANTag {}, nil
582
- }
583
-
584
- func isLogicalInterface (name string ) bool {
585
- return strings .Contains (name , "." )
586
- }
587
-
588
- func extractInterfaceAndUnit (name string ) (string , model.VLANTag , error ) {
589
- extractedVars := reSubMatchMap (ifNameTagsRegexp , name )
590
- if _ , exists := extractedVars ["intf_name" ]; ! exists {
591
- return "" , model.VLANTag {}, fmt .Errorf ("unable to extract interface name from %q" , name )
592
- }
593
-
594
- if _ , exists := extractedVars ["inner_tag" ]; ! exists {
595
- return "" , model.VLANTag {}, fmt .Errorf ("unable to extract inner tag from %q" , name )
596
- }
597
-
598
- innerTag , err := strconv .Atoi (extractedVars ["inner_tag" ])
599
- if err != nil {
600
- return "" , model.VLANTag {}, fmt .Errorf ("unable to convert inner tag from string %q to int (%q)" , extractedVars ["inner_tag" ], name )
601
- }
602
-
603
- vt := model.VLANTag {
604
- InnerTag : uint16 (innerTag ),
605
- }
606
-
607
- outerTagStr := extractedVars ["outer_tag" ]
608
- if outerTagStr != "" {
609
- outerTag , err := strconv .Atoi (outerTagStr )
610
- if err != nil {
611
- return "" , model.VLANTag {}, fmt .Errorf ("unable to convert outer tag from string %q to int (%q)" , outerTagStr , name )
612
- }
613
-
614
- vt .OuterTag = uint16 (outerTag )
615
- }
616
-
617
- return extractedVars ["intf_name" ], vt , nil
618
- }
619
-
620
- func reSubMatchMap (r * regexp.Regexp , str string ) map [string ]string {
621
- match := r .FindStringSubmatch (str )
622
- subMatchMap := make (map [string ]string )
623
- for i , name := range r .SubexpNames () {
624
- if i != 0 && name != "" && i <= len (match ) {
625
- subMatchMap [name ] = match [i ]
626
- }
627
- }
628
-
629
- return subMatchMap
630
- }
631
-
632
506
func (n * NetboxConnector ) StartRefreshRoutine () {
633
507
go n .refreshRoutine ()
634
508
}
0 commit comments