Skip to content

Commit 0e497f6

Browse files
thomas-manginclaude
andcommitted
feat: Add group command withdraw support and move decode_to_api_command
Extend group command encoding to handle withdraws with attributes for FlowSpec, MUP, and MPLS-VPN routes. Move decode_to_api_command function to src/exabgp/configuration/command.py for better code organization. Update API test files to use new group syntax for round-trip testing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 6449739 commit 0e497f6

File tree

6 files changed

+397
-378
lines changed

6 files changed

+397
-378
lines changed

qa/api/api-broken-flow.ci

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ option:file:api-broken-flow.conf
77
1:cmd:announce ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32 extended-community [rate-limit:1]
88
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0045:02:0000002E4001010040020040050400000064C01008800600003F800000800E1200018500000C0120AAAAAAAA0220AAAAAAAA
99
7:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"extended-community":[{"value":9225060887780392960,"string":"rate-limit:1"}]},"announce":{"ipv4 flow":{"no-nexthop":[{"destination-ipv4":["170.170.170.170/32"],"source-ipv4":["170.170.170.170/32"],"string":"flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32"}]}}}}}}
10-
# No cmd: withdraw with attributes (unusual BGP - standard withdraws have no attributes)
11-
2:cmd:withdraw ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32 next-hop 0.0.0.0 extended-community [rate-limit:1]
10+
2:cmd:group attributes origin igp local-preference 100 extended-community [0x800600003f800000] ; withdraw ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32
1211
2:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0043:02:0000002C4001010040020040050400000064C01008800600003F800000800F100001850C0120AAAAAAAA0220AAAAAAAA
1312
8:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"extended-community":[{"value":9225060887780392960,"string":"rate-limit:1"}]},"withdraw":{"ipv4 flow":[{"destination-ipv4":["170.170.170.170/32"],"source-ipv4":["170.170.170.170/32"],"string":"flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32"}]}}}}}
1413

@@ -24,14 +23,12 @@ option:file:api-broken-flow.conf
2423
7:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"extended-community":[{"value":9225060887780392960,"string":"rate-limit:1"}]},"announce":{"ipv4 flow":{"no-nexthop":[{"destination-ipv4":["170.170.170.170/32"],"source-ipv4":["170.170.170.170/32"],"string":"flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32"}]}}}}}}
2524

2625
# Withdraw, Announce, Withdraw
27-
# No cmd: withdraw with attributes (unusual BGP - standard withdraws have no attributes)
28-
6:cmd:withdraw ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32 next-hop 0.0.0.0 extended-community [rate-limit:1]
26+
6:cmd:group attributes origin igp local-preference 100 extended-community [0x800600003f800000] ; withdraw ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32
2927
6:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0043:02:0000002C4001010040020040050400000064C01008800600003F800000800F100001850C0120AAAAAAAA0220AAAAAAAA
3028
8:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"extended-community":[{"value":9225060887780392960,"string":"rate-limit:1"}]},"withdraw":{"ipv4 flow":[{"destination-ipv4":["170.170.170.170/32"],"source-ipv4":["170.170.170.170/32"],"string":"flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32"}]}}}}}
3129
7:cmd:announce ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32 extended-community [rate-limit:1]
3230
7:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0045:02:0000002E4001010040020040050400000064C01008800600003F800000800E1200018500000C0120AAAAAAAA0220AAAAAAAA
3331
7:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"extended-community":[{"value":9225060887780392960,"string":"rate-limit:1"}]},"announce":{"ipv4 flow":{"no-nexthop":[{"destination-ipv4":["170.170.170.170/32"],"source-ipv4":["170.170.170.170/32"],"string":"flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32"}]}}}}}}
34-
# No cmd: withdraw with attributes (unusual BGP - standard withdraws have no attributes)
35-
8:cmd:withdraw ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32 next-hop 0.0.0.0 extended-community [rate-limit:1]
32+
8:cmd:group attributes origin igp local-preference 100 extended-community [0x800600003f800000] ; withdraw ipv4 flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32
3633
8:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0043:02:0000002C4001010040020040050400000064C01008800600003F800000800F100001850C0120AAAAAAAA0220AAAAAAAA
3734
8:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"extended-community":[{"value":9225060887780392960,"string":"rate-limit:1"}]},"withdraw":{"ipv4 flow":[{"destination-ipv4":["170.170.170.170/32"],"source-ipv4":["170.170.170.170/32"],"string":"flow destination-ipv4 170.170.170.170/32 source-ipv4 170.170.170.170/32"}]}}}}}

qa/api/api-ipv4.ci

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ option:file:api-ipv4.conf
1111
1:cmd:withdraw route 10.0.1.0/24
1212
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:001B:02:0004180A00010000
1313
1:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":65000,"peer":65000},"direction":"in","message":{"update":{"withdraw":{"ipv4 unicast":[{"nlri":"10.0.1.0/24"}]}}}}}
14-
# No cmd: MUP withdraw with attributes (unusual BGP - standard withdraws have no attributes)
14+
1:cmd:group attributes origin igp local-preference 100 extended-community [target:10:10] bgp-prefix-sid-srv6 ( l3-service 2001:db8:1:1:: 0x48 [64,24,16,0,0,0] ) ; withdraw ipv4 mup mup-isd 10.0.1.0/24 rd 100:100 next-hop 0.0.0.0
1515
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:006E:02:000000574001010040020040050400000064C010080002000A0000000AC028250500220001001E0020010DB800010001000000000000000000004800010006401810000000800F130001550100010C0000006400000064180A0001

qa/api/api-ipv6.ci

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ option:file:api-ipv6.conf
1111
1:cmd:withdraw ipv6 unicast fc00:1::/64
1212
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0026:02:0000000F800F0C00020140FC00000100000000
1313
1:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":65000,"peer":65000},"direction":"in","message":{"update":{"withdraw":{"ipv6 unicast":[{"nlri":"fc00:1::/64"}]}}}}}
14-
# No cmd: MUP withdraw with attributes (unusual BGP - standard withdraws have no attributes)
14+
1:cmd:group attributes origin igp local-preference 100 extended-community [target:10:10] bgp-prefix-sid-srv6 ( l3-service 2001:db8:1:1:: 0x47 [64,24,16,0,0,0] ) ; withdraw ipv6 mup mup-isd 2001::/64 rd 100:100 next-hop 0.0.0.0
1515
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0073:02:0000005C4001010040020040050400000064C010080002000A0000000AC028250500220001001E0020010DB800010001000000000000000000004700010006401810000000800F18000255010001110000006400000064402001000000000000

qa/api/api-vpnv4.ci

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ option:file:api-vpnv4.conf
44
1:cmd:announce route 1.4.0.0/16 next-hop 101.1.101.1 rd 65000:1 label 1000 origin igp local-preference 100 community [100:1] extended-community [target:65001:1]
55
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0060:02:00000049400101004002004003046501650140050400000064C0080400640001C010080002FDE900000001800E1F0001800C0000000000000000650165010068003E810000FDE8000000010104
66
1:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","local-preference":100,"community":[[100,1]],"extended-community":[{"value":842127122628609,"string":"target:65001:1"}]},"announce":{"ipv4 mpls-vpn":{"101.1.101.1":[{"nlri":"1.4.0.0/16","label":[[1000,16001]],"rd":"65000:1"}]}}}}}}
7-
# No cmd: for withdraw below - original message has attributes in withdraw (unusual BGP)
7+
1:cmd:group attributes origin igp next-hop 101.1.101.1 local-preference 100 community [100:1] extended-community [target:65001:1] ; withdraw route 1.4.0.0/16 rd 65000:1 label 1000
88
1:raw:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:0052:02:0000003B400101004002004003046501650140050400000064C0080400640001C010080002FDE900000001800F1100018068003E810000FDE8000000010104
99
1:json:{"exabgp":"6.0.0","type":"update","neighbor":{"address":{"local":"127.0.0.1","peer":"127.0.0.1"},"asn":{"local":1,"peer":1},"direction":"in","message":{"update":{"attribute":{"origin":"igp","next-hop":"101.1.101.1","local-preference":100,"community":[[100,1]],"extended-community":[{"value":842127122628609,"string":"target:65001:1"}]},"withdraw":{"ipv4 mpls-vpn":[{"nlri":"1.4.0.0/16","label":[[1000,16001]],"rd":"65000:1"}]}}}}}
1010

0 commit comments

Comments
 (0)