Skip to content

Commit cbface1

Browse files
authored
Merge pull request #58 from kpetremann/bgp_timer_aggregate_network
feat(bgp): add delayopentimer + aggregate + network
2 parents 1bb68e2 + 493c417 commit cbface1

12 files changed

Lines changed: 43111 additions & 40314 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
go-version-file: 'go.mod'
2020

2121
- name: Run golangci-lint
22-
uses: golangci/golangci-lint-action@v3
22+
uses: golangci/golangci-lint-action@v8
2323

2424
- name: Test
2525
run: go test -v ./...

.golangci.yml

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
---
2-
run:
3-
timeout: 15m
4-
1+
version: "2"
52
linters:
6-
# additional linters:
73
enable:
84
- asasalint
95
- asciicheck
@@ -16,8 +12,6 @@ linters:
1612
- gocheckcompilerdirectives
1713
- gocritic
1814
- godot
19-
- gofmt
20-
- goimports
2115
- gosec
2216
- grouper
2317
- makezero
@@ -27,26 +21,45 @@ linters:
2721
- prealloc
2822
- predeclared
2923
- reassign
30-
- tenv
3124
- tparallel
3225
- unconvert
3326
- unparam
3427
- usestdlibvars
3528
- wastedassign
3629
- whitespace
3730
- zerologlint
38-
39-
issues:
40-
exclude: []
41-
exclude-rules:
42-
- path: '(.+)_test\.go'
43-
linters:
44-
- goconst
45-
- path: '(.+)_test\.go'
46-
linters:
47-
- govet
48-
text: 'fieldalignment: .*'
49-
exclude-files:
50-
- internal/model/openconfig/oc_path.go
51-
- internal/model/openconfig/oc.go
52-
- internal/model/ietf/ietf.go
31+
exclusions:
32+
generated: lax
33+
presets:
34+
- comments
35+
- common-false-positives
36+
- legacy
37+
- std-error-handling
38+
rules:
39+
- linters:
40+
- goconst
41+
path: (.+)_test\.go
42+
- linters:
43+
- govet
44+
path: (.+)_test\.go
45+
text: 'fieldalignment: .*'
46+
paths:
47+
- internal/model/openconfig/oc_path.go
48+
- internal/model/openconfig/oc.go
49+
- internal/model/ietf/ietf.go
50+
- third_party$
51+
- builtin$
52+
- examples$
53+
formatters:
54+
enable:
55+
- gofmt
56+
- goimports
57+
exclusions:
58+
generated: lax
59+
paths:
60+
- internal/model/openconfig/oc_path.go
61+
- internal/model/openconfig/oc.go
62+
- internal/model/ietf/ietf.go
63+
- third_party$
64+
- builtin$
65+
- examples$

internal/convertor/bgp/bgp.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package bgp
22

33
import (
4+
"fmt"
5+
46
"github.com/criteo/data-aggregation-api/internal/model/cmdb/bgp"
57
"github.com/criteo/data-aggregation-api/internal/model/openconfig"
68
)
@@ -10,11 +12,16 @@ import (
1012
func BGPToOpenconfig(hostname string, bgpGlobal *bgp.BGPGlobal, sessions []*bgp.Session, peerGroups []*bgp.PeerGroup) (*openconfig.NetworkInstance_Protocol_Bgp, error) {
1113
neighbors, err := NeighborsToOpenconfig(hostname, sessions)
1214
if err != nil {
13-
return nil, err
15+
return nil, fmt.Errorf("failed to convert Neighbors to Openconfig: %w", err)
16+
}
17+
18+
globalConf, err := BGPGlobalToOpenconfig(bgpGlobal)
19+
if err != nil {
20+
return nil, fmt.Errorf("failed to convert BGPGlobal to Openconfig: %w", err)
1421
}
1522

1623
defaultInstance := openconfig.NetworkInstance_Protocol_Bgp{
17-
Global: BGPGlobalToOpenconfig(bgpGlobal),
24+
Global: globalConf,
1825
Neighbor: neighbors,
1926
PeerGroup: PeerGroupsToOpenconfig(peerGroups),
2027
}

internal/convertor/bgp/bgp_test.go

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,3 +208,218 @@ func TestBGPToOpenConfig(t *testing.T) {
208208
t.Errorf("unexpected diff for '%s': %s\n", "BGP integration test", diff)
209209
}
210210
}
211+
212+
func TestBGPToOpenConfigTimersAndAggretates(t *testing.T) {
213+
// some vars because we need pointers!
214+
var as65000 uint32 = 65000
215+
var as65001 uint32 = 65001
216+
var flagTrue = true
217+
var ebgpDistance221 uint8 = 221
218+
var ibgpDistance222 uint8 = 222
219+
var restartTime uint16 = 60
220+
var routerID5001 = "127.0.0.1:5001"
221+
var ecmpMaximumPaths64 uint32 = 64
222+
var maxPrefixes10 uint32 = 10
223+
var awesomePassword = "awesomepassword"
224+
var descriptionToTOR01 = "TO:TOR01-01"
225+
var neighborAddress0 = "192.0.2.0"
226+
227+
globalConfig := cmdbBGP.BGPGlobal{
228+
Device: struct {
229+
Name string "json:\"name\" validate:\"required\""
230+
}{
231+
Name: "spine01-01",
232+
},
233+
LocalAsn: common.ASN{
234+
Number: &as65001,
235+
Organization: "Lab-65001",
236+
},
237+
RouterID: "127.0.0.1:5001",
238+
EBGPAdministrativeDistance: &ebgpDistance221,
239+
IBGPAdministrativeDistance: &ibgpDistance222,
240+
GracefulRestartEnabled: &flagTrue,
241+
GracefulRestartTime: &restartTime,
242+
EcmpEnabled: &flagTrue,
243+
EcmpMaximumPaths: &ecmpMaximumPaths64,
244+
AfiSafis: []*cmdbBGP.GlobalAfiSafi{
245+
{
246+
Name: cmdbBGP.IPv4Unicast,
247+
Aggregates: []cmdbBGP.Network{{Prefix: "10.0.0.0/16"}},
248+
RedistributedNetworks: []cmdbBGP.Network{{Prefix: "192.2.0.0/24"}, {Prefix: "192.2.1.0/24"}},
249+
},
250+
},
251+
}
252+
253+
sessions := []*cmdbBGP.Session{
254+
{
255+
PeerA: cmdbBGP.DeviceSession{
256+
Device: struct {
257+
Name string `json:"name" validate:"required"`
258+
}{
259+
Name: "tor01-01",
260+
},
261+
LocalAddress: cmdbBGP.Address{
262+
Address: types.CIDR{
263+
IP: net.ParseIP("192.0.2.0"),
264+
Netmask: 31,
265+
},
266+
Family: 4,
267+
},
268+
LocalAsn: common.ASN{
269+
Number: &as65000,
270+
Organization: "Lab-65000",
271+
},
272+
AfiSafis: []*cmdbBGP.AfiSafi{
273+
{
274+
Name: "ipv4-unicast",
275+
RoutePolicyIn: &cmdbRP.RoutePolicyLite{
276+
Name: "LAN:IN:MAINTENANCE",
277+
Description: "MAINTENANCE MODE",
278+
},
279+
RoutePolicyOut: &cmdbRP.RoutePolicyLite{
280+
Name: "LAN:OUT:MAINTENANCE",
281+
Description: "MAINTENANCE MODE",
282+
},
283+
},
284+
},
285+
PeerGroup: nil,
286+
RoutePolicyIn: &cmdbRP.RoutePolicyLite{
287+
Name: "LAN:IN",
288+
Description: "",
289+
},
290+
RoutePolicyOut: &cmdbRP.RoutePolicyLite{
291+
Name: "SERVER:PROD:OUT",
292+
Description: "Server VLAN prod",
293+
},
294+
Description: "TO:SPINE01-01",
295+
MaximumPrefixes: 128,
296+
EnforceFirstAs: true,
297+
Enabled: &flagTrue,
298+
},
299+
PeerB: cmdbBGP.DeviceSession{
300+
Device: struct {
301+
Name string `json:"name" validate:"required"`
302+
}{
303+
Name: "spine01-01",
304+
},
305+
LocalAddress: cmdbBGP.Address{
306+
Address: types.CIDR{
307+
IP: net.ParseIP("192.0.2.1"),
308+
Netmask: 31,
309+
},
310+
Family: 4,
311+
},
312+
LocalAsn: common.ASN{
313+
Number: &as65001,
314+
Organization: "Lab-65001",
315+
},
316+
AfiSafis: []*cmdbBGP.AfiSafi{
317+
{
318+
Name: "ipv4-unicast",
319+
RoutePolicyIn: &cmdbRP.RoutePolicyLite{
320+
Name: "SERVER:PROD:MAINTENANCE:IN",
321+
Description: "",
322+
},
323+
RoutePolicyOut: &cmdbRP.RoutePolicyLite{
324+
Name: "LAN:MAINTENANCE:OUT",
325+
Description: "",
326+
},
327+
},
328+
},
329+
PeerGroup: nil,
330+
RoutePolicyIn: &cmdbRP.RoutePolicyLite{
331+
Name: "SERVER:PROD:IN",
332+
Description: "",
333+
},
334+
RoutePolicyOut: &cmdbRP.RoutePolicyLite{
335+
Name: "LAN:OUT",
336+
Description: "",
337+
},
338+
Description: "TO:TOR01-01",
339+
MaximumPrefixes: 10,
340+
EnforceFirstAs: true,
341+
Enabled: &flagTrue,
342+
DelayOpenTimer: 5,
343+
},
344+
Password: awesomePassword,
345+
},
346+
}
347+
348+
expectedDelayOpenTimer := uint16(5)
349+
want := &openconfig.NetworkInstance_Protocol_Bgp{
350+
Global: &openconfig.NetworkInstance_Protocol_Bgp_Global{
351+
As: &as65001,
352+
DefaultRouteDistance: &openconfig.NetworkInstance_Protocol_Bgp_Global_DefaultRouteDistance{
353+
ExternalRouteDistance: &ebgpDistance221,
354+
InternalRouteDistance: &ibgpDistance222,
355+
},
356+
GracefulRestart: &openconfig.NetworkInstance_Protocol_Bgp_Global_GracefulRestart{
357+
Enabled: &flagTrue,
358+
RestartTime: &restartTime,
359+
},
360+
RouterId: &routerID5001,
361+
UseMultiplePaths: &openconfig.NetworkInstance_Protocol_Bgp_Global_UseMultiplePaths{
362+
Enabled: &flagTrue,
363+
Ebgp: &openconfig.NetworkInstance_Protocol_Bgp_Global_UseMultiplePaths_Ebgp{
364+
MaximumPaths: &ecmpMaximumPaths64,
365+
},
366+
Ibgp: &openconfig.NetworkInstance_Protocol_Bgp_Global_UseMultiplePaths_Ibgp{
367+
MaximumPaths: &ecmpMaximumPaths64,
368+
},
369+
},
370+
AfiSafi: map[openconfig.E_BgpTypes_AFI_SAFI_TYPE]*openconfig.NetworkInstance_Protocol_Bgp_Global_AfiSafi{
371+
openconfig.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST: {
372+
AfiSafiName: openconfig.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST,
373+
Aggregates: []string{"10.0.0.0/16"},
374+
RedistributedNetworks: []string{"192.2.0.0/24", "192.2.1.0/24"},
375+
},
376+
},
377+
},
378+
Neighbor: map[string]*openconfig.NetworkInstance_Protocol_Bgp_Neighbor{
379+
"192.0.2.0": {
380+
AfiSafi: map[openconfig.E_BgpTypes_AFI_SAFI_TYPE]*openconfig.NetworkInstance_Protocol_Bgp_Neighbor_AfiSafi{
381+
openconfig.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST: {
382+
AfiSafiName: openconfig.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST,
383+
ApplyPolicy: &openconfig.NetworkInstance_Protocol_Bgp_Neighbor_AfiSafi_ApplyPolicy{
384+
ExportPolicy: []string{"LAN:MAINTENANCE:OUT"},
385+
ImportPolicy: []string{"SERVER:PROD:MAINTENANCE:IN"},
386+
},
387+
Enabled: &flagTrue,
388+
Ipv4Unicast: &openconfig.NetworkInstance_Protocol_Bgp_Neighbor_AfiSafi_Ipv4Unicast{
389+
PrefixLimit: &openconfig.NetworkInstance_Protocol_Bgp_Neighbor_AfiSafi_Ipv4Unicast_PrefixLimit{
390+
MaxPrefixes: &maxPrefixes10,
391+
},
392+
},
393+
},
394+
},
395+
ApplyPolicy: &openconfig.NetworkInstance_Protocol_Bgp_Neighbor_ApplyPolicy{
396+
ExportPolicy: []string{"LAN:OUT"},
397+
ImportPolicy: []string{"SERVER:PROD:IN"},
398+
},
399+
AuthPassword: &awesomePassword,
400+
Description: &descriptionToTOR01,
401+
Enabled: &flagTrue,
402+
LocalAs: &as65001,
403+
NeighborAddress: &neighborAddress0,
404+
PeerAs: &as65000,
405+
PeerGroup: nil,
406+
PeerType: 0,
407+
RemovePrivateAs: 0,
408+
SendCommunity: 0,
409+
Timers: &openconfig.NetworkInstance_Protocol_Bgp_Neighbor_Timers{
410+
DelayOpenTimer: &expectedDelayOpenTimer,
411+
},
412+
},
413+
},
414+
PeerGroup: map[string]*openconfig.NetworkInstance_Protocol_Bgp_PeerGroup{},
415+
}
416+
417+
ret, err := bgp.BGPToOpenconfig("spine01-01", &globalConfig, sessions, nil)
418+
if err != nil {
419+
t.Errorf("failed to convert BGP to OpenConfig")
420+
}
421+
422+
if diff := cmp.Diff(ret, want); diff != "" {
423+
t.Errorf("unexpected diff for '%s': %s\n", "BGP integration test", diff)
424+
}
425+
}

0 commit comments

Comments
 (0)