Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FRR 4.0 integration with SONiC #2099

Merged
merged 2 commits into from
Oct 2, 2018
Merged

Conversation

zhenggen-xu
Copy link
Collaborator

@zhenggen-xu zhenggen-xu commented Sep 28, 2018

FRR 4.0 integration with SONiC
-- Uses SONiC FRR repo frr/4.0 (which has SONiC support) to build image
-- Makefile changes to make frr4.0 builtable.
-- Updated/Added FRR configuration files
-- Change FRR to use integrated-vtysh-config
-- Add FRR configuration template and tests

To build SONiC images with FRR4.0, simply edit rules/config file and change
routing stack to following:

SONIC_ROUTING_STACK = frr

and then build images as usual.

Note: With some changes, we can support FRR 5.0 as well, basic tests looked good too. I have code ready to switch between FRR versions with SONiC based on single line of rule/config change, but due to the interest at this time and test efforts, this PR is focusing on FRR4.0 support only.

- What I did
FRR 4.0 integration with SONiC

- How I did it
submodule changes, makefile changes, configuration file changes, template changes.

- How to verify it
Change rule/config file:
SONIC_ROUTING_STACK = frr

Build the image and load onto the switch with configuration:

admin@sonic:~$ sonic-cfggen -d --print-data
{
    "BGP_NEIGHBOR": {
        "10.0.0.1": {
            "rrclient": "0", 
            "name": "ARISTA01T2", 
            "local_addr": "10.0.0.0", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.3": {
            "rrclient": "0", 
            "name": "ARISTA02T2", 
            "local_addr": "10.0.0.2", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.5": {
            "rrclient": "0", 
            "name": "ARISTA03T2", 
            "local_addr": "10.0.0.4", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.7": {
            "rrclient": "0", 
            "name": "ARISTA04T2", 
            "local_addr": "10.0.0.6", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.9": {
            "rrclient": "0", 
            "name": "ARISTA05T2", 
            "local_addr": "10.0.0.8", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.11": {
            "rrclient": "0", 
            "name": "ARISTA06T2", 
            "local_addr": "10.0.0.10", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.13": {
            "rrclient": "0", 
            "name": "ARISTA07T2", 
            "local_addr": "10.0.0.12", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.15": {
            "rrclient": "0", 
            "name": "ARISTA08T2", 
            "local_addr": "10.0.0.14", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.17": {
            "rrclient": "0", 
            "name": "ARISTA09T2", 
            "local_addr": "10.0.0.16", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.19": {
            "rrclient": "0", 
            "name": "ARISTA10T2", 
            "local_addr": "10.0.0.18", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.21": {
            "rrclient": "0", 
            "name": "ARISTA11T2", 
            "local_addr": "10.0.0.20", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.23": {
            "rrclient": "0", 
            "name": "ARISTA12T2", 
            "local_addr": "10.0.0.22", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.25": {
            "rrclient": "0", 
            "name": "ARISTA13T2", 
            "local_addr": "10.0.0.24", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.27": {
            "rrclient": "0", 
            "name": "ARISTA14T2", 
            "local_addr": "10.0.0.26", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.29": {
            "rrclient": "0", 
            "name": "ARISTA15T2", 
            "local_addr": "10.0.0.28", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.31": {
            "rrclient": "0", 
            "name": "ARISTA16T2", 
            "local_addr": "10.0.0.30", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.33": {
            "rrclient": "0", 
            "name": "ARISTA17T2", 
            "local_addr": "10.0.0.32", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.35": {
            "rrclient": "0", 
            "name": "ARISTA18T2", 
            "local_addr": "10.0.0.34", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.37": {
            "rrclient": "0", 
            "name": "ARISTA19T2", 
            "local_addr": "10.0.0.36", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.39": {
            "rrclient": "0", 
            "name": "ARISTA20T2", 
            "local_addr": "10.0.0.38", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.41": {
            "rrclient": "0", 
            "name": "ARISTA21T2", 
            "local_addr": "10.0.0.40", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.43": {
            "rrclient": "0", 
            "name": "ARISTA22T2", 
            "local_addr": "10.0.0.42", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.45": {
            "rrclient": "0", 
            "name": "ARISTA23T2", 
            "local_addr": "10.0.0.44", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.47": {
            "rrclient": "0", 
            "name": "ARISTA24T2", 
            "local_addr": "10.0.0.46", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.49": {
            "rrclient": "0", 
            "name": "ARISTA25T2", 
            "local_addr": "10.0.0.48", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.51": {
            "rrclient": "0", 
            "name": "ARISTA26T2", 
            "local_addr": "10.0.0.50", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.53": {
            "rrclient": "0", 
            "name": "ARISTA27T2", 
            "local_addr": "10.0.0.52", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.55": {
            "rrclient": "0", 
            "name": "ARISTA28T2", 
            "local_addr": "10.0.0.54", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.57": {
            "rrclient": "0", 
            "name": "ARISTA29T2", 
            "local_addr": "10.0.0.56", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.59": {
            "rrclient": "0", 
            "name": "ARISTA30T2", 
            "local_addr": "10.0.0.58", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.61": {
            "rrclient": "0", 
            "name": "ARISTA31T2", 
            "local_addr": "10.0.0.60", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.63": {
            "rrclient": "0", 
            "name": "ARISTA32T2", 
            "local_addr": "10.0.0.62", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.65": {
            "rrclient": "0", 
            "name": "ARISTA33T2", 
            "local_addr": "10.0.0.64", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.67": {
            "rrclient": "0", 
            "name": "ARISTA34T2", 
            "local_addr": "10.0.0.66", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.69": {
            "rrclient": "0", 
            "name": "ARISTA35T2", 
            "local_addr": "10.0.0.68", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.71": {
            "rrclient": "0", 
            "name": "ARISTA36T2", 
            "local_addr": "10.0.0.70", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.73": {
            "rrclient": "0", 
            "name": "ARISTA37T2", 
            "local_addr": "10.0.0.72", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.75": {
            "rrclient": "0", 
            "name": "ARISTA38T2", 
            "local_addr": "10.0.0.74", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.77": {
            "rrclient": "0", 
            "name": "ARISTA39T2", 
            "local_addr": "10.0.0.76", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.79": {
            "rrclient": "0", 
            "name": "ARISTA40T2", 
            "local_addr": "10.0.0.78", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.81": {
            "rrclient": "0", 
            "name": "ARISTA41T2", 
            "local_addr": "10.0.0.80", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.83": {
            "rrclient": "0", 
            "name": "ARISTA42T2", 
            "local_addr": "10.0.0.82", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.85": {
            "rrclient": "0", 
            "name": "ARISTA43T2", 
            "local_addr": "10.0.0.84", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.87": {
            "rrclient": "0", 
            "name": "ARISTA44T2", 
            "local_addr": "10.0.0.86", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.89": {
            "rrclient": "0", 
            "name": "ARISTA45T2", 
            "local_addr": "10.0.0.88", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.91": {
            "rrclient": "0", 
            "name": "ARISTA46T2", 
            "local_addr": "10.0.0.90", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.93": {
            "rrclient": "0", 
            "name": "ARISTA47T2", 
            "local_addr": "10.0.0.92", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.95": {
            "rrclient": "0", 
            "name": "ARISTA48T2", 
            "local_addr": "10.0.0.94", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.97": {
            "rrclient": "0", 
            "name": "ARISTA49T2", 
            "local_addr": "10.0.0.96", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.99": {
            "rrclient": "0", 
            "name": "ARISTA50T2", 
            "local_addr": "10.0.0.98", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.101": {
            "rrclient": "0", 
            "name": "ARISTA51T2", 
            "local_addr": "10.0.0.100", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.103": {
            "rrclient": "0", 
            "name": "ARISTA52T2", 
            "local_addr": "10.0.0.102", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.105": {
            "rrclient": "0", 
            "name": "ARISTA53T2", 
            "local_addr": "10.0.0.104", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.107": {
            "rrclient": "0", 
            "name": "ARISTA54T2", 
            "local_addr": "10.0.0.106", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.109": {
            "rrclient": "0", 
            "name": "ARISTA55T2", 
            "local_addr": "10.0.0.108", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.111": {
            "rrclient": "0", 
            "name": "ARISTA56T2", 
            "local_addr": "10.0.0.110", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "65200", 
            "keepalive": "60"
        }, 
        "10.0.0.113": {
            "rrclient": "0", 
            "name": "ARISTA01T0", 
            "local_addr": "10.0.0.112", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64001", 
            "keepalive": "60"
        }, 
        "10.0.0.115": {
            "rrclient": "0", 
            "name": "ARISTA02T0", 
            "local_addr": "10.0.0.114", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64002", 
            "keepalive": "60"
        }, 
        "10.0.0.117": {
            "rrclient": "0", 
            "name": "ARISTA03T0", 
            "local_addr": "10.0.0.116", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64003", 
            "keepalive": "60"
        }, 
        "10.0.0.119": {
            "rrclient": "0", 
            "name": "ARISTA04T0", 
            "local_addr": "10.0.0.118", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64004", 
            "keepalive": "60"
        }, 
        "10.0.0.121": {
            "rrclient": "0", 
            "name": "ARISTA05T0", 
            "local_addr": "10.0.0.120", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64005", 
            "keepalive": "60"
        }, 
        "10.0.0.123": {
            "rrclient": "0", 
            "name": "ARISTA06T0", 
            "local_addr": "10.0.0.122", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64006", 
            "keepalive": "60"
        }, 
        "10.0.0.125": {
            "rrclient": "0", 
            "name": "ARISTA07T0", 
            "local_addr": "10.0.0.124", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64007", 
            "keepalive": "60"
        }, 
        "10.0.0.127": {
            "rrclient": "0", 
            "name": "ARISTA08T0", 
            "local_addr": "10.0.0.126", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64008", 
            "keepalive": "60"
        }, 
        "10.0.0.129": {
            "rrclient": "0", 
            "name": "ARISTA09T0", 
            "local_addr": "10.0.0.128", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64009", 
            "keepalive": "60"
        }, 
        "10.0.0.131": {
            "rrclient": "0", 
            "name": "ARISTA10T0", 
            "local_addr": "10.0.0.130", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64010", 
            "keepalive": "60"
        }, 
        "10.0.0.133": {
            "rrclient": "0", 
            "name": "ARISTA11T0", 
            "local_addr": "10.0.0.132", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64011", 
            "keepalive": "60"
        }, 
        "10.0.0.135": {
            "rrclient": "0", 
            "name": "ARISTA12T0", 
            "local_addr": "10.0.0.134", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64012", 
            "keepalive": "60"
        }, 
        "10.0.0.137": {
            "rrclient": "0", 
            "name": "ARISTA13T0", 
            "local_addr": "10.0.0.136", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64013", 
            "keepalive": "60"
        }, 
        "10.0.0.139": {
            "rrclient": "0", 
            "name": "ARISTA14T0", 
            "local_addr": "10.0.0.138", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64014", 
            "keepalive": "60"
        }, 
        "10.0.0.141": {
            "rrclient": "0", 
            "name": "ARISTA15T0", 
            "local_addr": "10.0.0.140", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64015", 
            "keepalive": "60"
        }, 
        "10.0.0.143": {
            "rrclient": "0", 
            "name": "ARISTA16T0", 
            "local_addr": "10.0.0.142", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64016", 
            "keepalive": "60"
        }, 
        "10.0.0.145": {
            "rrclient": "0", 
            "name": "ARISTA17T0", 
            "local_addr": "10.0.0.144", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64017", 
            "keepalive": "60"
        }, 
        "10.0.0.147": {
            "rrclient": "0", 
            "name": "ARISTA18T0", 
            "local_addr": "10.0.0.146", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64018", 
            "keepalive": "60"
        }, 
        "10.0.0.149": {
            "rrclient": "0", 
            "name": "ARISTA19T0", 
            "local_addr": "10.0.0.148", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64019", 
            "keepalive": "60"
        }, 
        "10.0.0.151": {
            "rrclient": "0", 
            "name": "ARISTA20T0", 
            "local_addr": "10.0.0.150", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64020", 
            "keepalive": "60"
        }, 
        "10.0.0.153": {
            "rrclient": "0", 
            "name": "ARISTA21T0", 
            "local_addr": "10.0.0.152", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64021", 
            "keepalive": "60"
        }, 
        "10.0.0.155": {
            "rrclient": "0", 
            "name": "ARISTA22T0", 
            "local_addr": "10.0.0.154", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64022", 
            "keepalive": "60"
        }, 
        "10.0.0.157": {
            "rrclient": "0", 
            "name": "ARISTA23T0", 
            "local_addr": "10.0.0.156", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64023", 
            "keepalive": "60"
        }, 
        "10.0.0.159": {
            "rrclient": "0", 
            "name": "ARISTA24T0", 
            "local_addr": "10.0.0.158", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64024", 
            "keepalive": "60"
        }, 
        "10.0.0.161": {
            "rrclient": "0", 
            "name": "ARISTA25T0", 
            "local_addr": "10.0.0.160", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64025", 
            "keepalive": "60"
        }, 
        "10.0.0.163": {
            "rrclient": "0", 
            "name": "ARISTA26T0", 
            "local_addr": "10.0.0.162", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64026", 
            "keepalive": "60"
        }, 
        "10.0.0.165": {
            "rrclient": "0", 
            "name": "ARISTA27T0", 
            "local_addr": "10.0.0.164", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64027", 
            "keepalive": "60"
        }, 
        "10.0.0.167": {
            "rrclient": "0", 
            "name": "ARISTA28T0", 
            "local_addr": "10.0.0.166", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64028", 
            "keepalive": "60"
        }, 
        "10.0.0.169": {
            "rrclient": "0", 
            "name": "ARISTA29T0", 
            "local_addr": "10.0.0.168", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64029", 
            "keepalive": "60"
        }, 
        "10.0.0.171": {
            "rrclient": "0", 
            "name": "ARISTA30T0", 
            "local_addr": "10.0.0.170", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64030", 
            "keepalive": "60"
        }, 
        "10.0.0.173": {
            "rrclient": "0", 
            "name": "ARISTA31T0", 
            "local_addr": "10.0.0.172", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64031", 
            "keepalive": "60"
        }, 
        "10.0.0.175": {
            "rrclient": "0", 
            "name": "ARISTA32T0", 
            "local_addr": "10.0.0.174", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64032", 
            "keepalive": "60"
        }, 
        "10.0.0.177": {
            "rrclient": "0", 
            "name": "ARISTA33T0", 
            "local_addr": "10.0.0.176", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64033", 
            "keepalive": "60"
        }, 
        "10.0.0.179": {
            "rrclient": "0", 
            "name": "ARISTA34T0", 
            "local_addr": "10.0.0.178", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64034", 
            "keepalive": "60"
        }, 
        "10.0.0.181": {
            "rrclient": "0", 
            "name": "ARISTA35T0", 
            "local_addr": "10.0.0.180", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64035", 
            "keepalive": "60"
        }, 
        "10.0.0.183": {
            "rrclient": "0", 
            "name": "ARISTA36T0", 
            "local_addr": "10.0.0.182", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64036", 
            "keepalive": "60"
        }, 
        "10.0.0.185": {
            "rrclient": "0", 
            "name": "ARISTA37T0", 
            "local_addr": "10.0.0.184", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64037", 
            "keepalive": "60"
        }, 
        "10.0.0.187": {
            "rrclient": "0", 
            "name": "ARISTA38T0", 
            "local_addr": "10.0.0.186", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64038", 
            "keepalive": "60"
        }, 
        "10.0.0.189": {
            "rrclient": "0", 
            "name": "ARISTA39T0", 
            "local_addr": "10.0.0.188", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64039", 
            "keepalive": "60"
        }, 
        "10.0.0.191": {
            "rrclient": "0", 
            "name": "ARISTA40T0", 
            "local_addr": "10.0.0.190", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64040", 
            "keepalive": "60"
        }, 
        "10.0.0.193": {
            "rrclient": "0", 
            "name": "ARISTA41T0", 
            "local_addr": "10.0.0.192", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64041", 
            "keepalive": "60"
        }, 
        "10.0.0.195": {
            "rrclient": "0", 
            "name": "ARISTA42T0", 
            "local_addr": "10.0.0.194", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64042", 
            "keepalive": "60"
        }, 
        "10.0.0.197": {
            "rrclient": "0", 
            "name": "ARISTA43T0", 
            "local_addr": "10.0.0.196", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64043", 
            "keepalive": "60"
        }, 
        "10.0.0.199": {
            "rrclient": "0", 
            "name": "ARISTA44T0", 
            "local_addr": "10.0.0.198", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64044", 
            "keepalive": "60"
        }, 
        "10.0.0.201": {
            "rrclient": "0", 
            "name": "ARISTA45T0", 
            "local_addr": "10.0.0.200", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64045", 
            "keepalive": "60"
        }, 
        "10.0.0.203": {
            "rrclient": "0", 
            "name": "ARISTA46T0", 
            "local_addr": "10.0.0.202", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64046", 
            "keepalive": "60"
        }, 
        "10.0.0.205": {
            "rrclient": "0", 
            "name": "ARISTA47T0", 
            "local_addr": "10.0.0.204", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64047", 
            "keepalive": "60"
        }, 
        "10.0.0.207": {
            "rrclient": "0", 
            "name": "ARISTA48T0", 
            "local_addr": "10.0.0.206", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64048", 
            "keepalive": "60"
        }, 
        "10.0.0.209": {
            "rrclient": "0", 
            "name": "ARISTA49T0", 
            "local_addr": "10.0.0.208", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64049", 
            "keepalive": "60"
        }, 
        "10.0.0.211": {
            "rrclient": "0", 
            "name": "ARISTA50T0", 
            "local_addr": "10.0.0.210", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64050", 
            "keepalive": "60"
        }, 
        "10.0.0.213": {
            "rrclient": "0", 
            "name": "ARISTA51T0", 
            "local_addr": "10.0.0.212", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64051", 
            "keepalive": "60"
        }, 
        "10.0.0.215": {
            "rrclient": "0", 
            "name": "ARISTA52T0", 
            "local_addr": "10.0.0.214", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64052", 
            "keepalive": "60"
        }, 
        "10.0.0.217": {
            "rrclient": "0", 
            "name": "ARISTA53T0", 
            "local_addr": "10.0.0.216", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64053", 
            "keepalive": "60"
        }, 
        "10.0.0.219": {
            "rrclient": "0", 
            "name": "ARISTA54T0", 
            "local_addr": "10.0.0.218", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64054", 
            "keepalive": "60"
        }, 
        "10.0.0.221": {
            "rrclient": "0", 
            "name": "ARISTA55T0", 
            "local_addr": "10.0.0.220", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64055", 
            "keepalive": "60"
        }, 
        "10.0.0.223": {
            "rrclient": "0", 
            "name": "ARISTA56T0", 
            "local_addr": "10.0.0.222", 
            "nhopself": "0", 
            "holdtime": "180", 
            "asn": "64056", 
            "keepalive": "60"
        }
    }, 
    "DEVICE_METADATA": {
        "localhost": {
            "hwsku": "Seastone-DX010-10-50", 
            "hostname": "sonic", 
            "platform": "x86_64-cel_seastone-r0", 
            "mac": "00:e0:ec:3c:0a:3e", 
            "bgp_asn": "65100", 
            "type": "LeafRouter"
        }
    }, 
    "PORT": {
        "Ethernet0": {
            "index": "1", 
            "lanes": "65", 
            "mtu": "9100", 
            "alias": "Eth1/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet1": {
            "index": "1", 
            "lanes": "66", 
            "mtu": "9100", 
            "alias": "Eth1/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet2": {
            "index": "1", 
            "lanes": "67", 
            "mtu": "9100", 
            "alias": "Eth1/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet3": {
            "index": "1", 
            "lanes": "68", 
            "mtu": "9100", 
            "alias": "Eth1/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet4": {
            "index": "2", 
            "lanes": "69", 
            "mtu": "9100", 
            "alias": "Eth2/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet5": {
            "index": "2", 
            "lanes": "70", 
            "mtu": "9100", 
            "alias": "Eth2/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet6": {
            "index": "2", 
            "lanes": "71", 
            "mtu": "9100", 
            "alias": "Eth2/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet7": {
            "index": "2", 
            "lanes": "72", 
            "mtu": "9100", 
            "alias": "Eth2/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet8": {
            "index": "3", 
            "lanes": "73", 
            "mtu": "9100", 
            "alias": "Eth3/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet9": {
            "index": "3", 
            "lanes": "74", 
            "mtu": "9100", 
            "alias": "Eth3/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet10": {
            "index": "3", 
            "lanes": "75", 
            "mtu": "9100", 
            "alias": "Eth3/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet11": {
            "index": "3", 
            "lanes": "76", 
            "mtu": "9100", 
            "alias": "Eth3/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet12": {
            "index": "4", 
            "lanes": "77", 
            "mtu": "9100", 
            "alias": "Eth4/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet13": {
            "index": "4", 
            "lanes": "78", 
            "mtu": "9100", 
            "alias": "Eth4/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet14": {
            "index": "4", 
            "lanes": "79", 
            "mtu": "9100", 
            "alias": "Eth4/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet15": {
            "index": "4", 
            "lanes": "80", 
            "mtu": "9100", 
            "alias": "Eth4/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet16": {
            "index": "5", 
            "lanes": "33", 
            "mtu": "9100", 
            "alias": "Eth5/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet17": {
            "index": "5", 
            "lanes": "34", 
            "mtu": "9100", 
            "alias": "Eth5/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet18": {
            "index": "5", 
            "lanes": "35", 
            "mtu": "9100", 
            "alias": "Eth5/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet19": {
            "index": "5", 
            "lanes": "36", 
            "mtu": "9100", 
            "alias": "Eth5/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet20": {
            "index": "6", 
            "lanes": "37", 
            "mtu": "9100", 
            "alias": "Eth6/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet21": {
            "index": "6", 
            "lanes": "38", 
            "mtu": "9100", 
            "alias": "Eth6/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet22": {
            "index": "6", 
            "lanes": "39", 
            "mtu": "9100", 
            "alias": "Eth6/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet23": {
            "index": "6", 
            "lanes": "40", 
            "mtu": "9100", 
            "alias": "Eth6/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet24": {
            "index": "7", 
            "lanes": "41", 
            "mtu": "9100", 
            "alias": "Eth7/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet25": {
            "index": "7", 
            "lanes": "42", 
            "mtu": "9100", 
            "alias": "Eth7/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet26": {
            "index": "7", 
            "lanes": "43", 
            "mtu": "9100", 
            "alias": "Eth7/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet27": {
            "index": "7", 
            "lanes": "44", 
            "mtu": "9100", 
            "alias": "Eth7/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet28": {
            "index": "8", 
            "lanes": "45", 
            "mtu": "9100", 
            "alias": "Eth8/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet29": {
            "index": "8", 
            "lanes": "46", 
            "mtu": "9100", 
            "alias": "Eth8/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet30": {
            "index": "8", 
            "lanes": "47", 
            "mtu": "9100", 
            "alias": "Eth8/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet31": {
            "index": "8", 
            "lanes": "48", 
            "mtu": "9100", 
            "alias": "Eth8/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet32": {
            "index": "9", 
            "lanes": "49", 
            "mtu": "9100", 
            "alias": "Eth9/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet33": {
            "index": "9", 
            "lanes": "50", 
            "mtu": "9100", 
            "alias": "Eth9/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet34": {
            "index": "9", 
            "lanes": "51", 
            "mtu": "9100", 
            "alias": "Eth9/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet35": {
            "index": "9", 
            "lanes": "52", 
            "mtu": "9100", 
            "alias": "Eth9/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet36": {
            "index": "10", 
            "lanes": "53", 
            "mtu": "9100", 
            "alias": "Eth10/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet37": {
            "index": "10", 
            "lanes": "54", 
            "mtu": "9100", 
            "alias": "Eth10/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet38": {
            "index": "10", 
            "lanes": "55", 
            "mtu": "9100", 
            "alias": "Eth10/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet39": {
            "index": "10", 
            "lanes": "56", 
            "mtu": "9100", 
            "alias": "Eth10/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet40": {
            "index": "11", 
            "lanes": "57", 
            "mtu": "9100", 
            "alias": "Eth11/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet41": {
            "index": "11", 
            "lanes": "58", 
            "mtu": "9100", 
            "alias": "Eth11/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet42": {
            "index": "11", 
            "lanes": "59", 
            "mtu": "9100", 
            "alias": "Eth11/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet43": {
            "index": "11", 
            "lanes": "60", 
            "mtu": "9100", 
            "alias": "Eth11/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet44": {
            "index": "12", 
            "lanes": "61", 
            "mtu": "9100", 
            "alias": "Eth12/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet45": {
            "index": "12", 
            "lanes": "62", 
            "mtu": "9100", 
            "alias": "Eth12/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet46": {
            "index": "12", 
            "lanes": "63", 
            "mtu": "9100", 
            "alias": "Eth12/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet47": {
            "index": "12", 
            "lanes": "64", 
            "mtu": "9100", 
            "alias": "Eth12/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet48": {
            "index": "13", 
            "lanes": "81", 
            "mtu": "9100", 
            "alias": "Eth13/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet49": {
            "index": "13", 
            "lanes": "82", 
            "mtu": "9100", 
            "alias": "Eth13/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet50": {
            "index": "13", 
            "lanes": "83", 
            "mtu": "9100", 
            "alias": "Eth13/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet51": {
            "index": "13", 
            "lanes": "84", 
            "mtu": "9100", 
            "alias": "Eth13/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet52": {
            "index": "14", 
            "lanes": "85", 
            "mtu": "9100", 
            "alias": "Eth14/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet53": {
            "index": "14", 
            "lanes": "86", 
            "mtu": "9100", 
            "alias": "Eth14/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet54": {
            "index": "14", 
            "lanes": "87", 
            "mtu": "9100", 
            "alias": "Eth14/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet55": {
            "index": "14", 
            "lanes": "88", 
            "mtu": "9100", 
            "alias": "Eth14/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet56": {
            "index": "15", 
            "lanes": "89", 
            "mtu": "9100", 
            "alias": "Eth15/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet57": {
            "index": "15", 
            "lanes": "90", 
            "mtu": "9100", 
            "alias": "Eth15/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet58": {
            "index": "15", 
            "lanes": "91", 
            "mtu": "9100", 
            "alias": "Eth15/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet59": {
            "index": "15", 
            "lanes": "92", 
            "mtu": "9100", 
            "alias": "Eth15/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet60": {
            "index": "16", 
            "lanes": "93", 
            "mtu": "9100", 
            "alias": "Eth16/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet61": {
            "index": "16", 
            "lanes": "94", 
            "mtu": "9100", 
            "alias": "Eth16/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet62": {
            "index": "16", 
            "lanes": "95", 
            "mtu": "9100", 
            "alias": "Eth16/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet63": {
            "index": "16", 
            "lanes": "96", 
            "mtu": "9100", 
            "alias": "Eth16/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet64": {
            "index": "17", 
            "lanes": "97", 
            "mtu": "9100", 
            "alias": "Eth17/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet65": {
            "index": "17", 
            "lanes": "98", 
            "mtu": "9100", 
            "alias": "Eth17/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet66": {
            "index": "17", 
            "lanes": "99", 
            "mtu": "9100", 
            "alias": "Eth17/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet67": {
            "index": "17", 
            "lanes": "100", 
            "mtu": "9100", 
            "alias": "Eth17/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet68": {
            "index": "18", 
            "lanes": "101", 
            "mtu": "9100", 
            "alias": "Eth18/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet69": {
            "index": "18", 
            "lanes": "102", 
            "mtu": "9100", 
            "alias": "Eth18/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet70": {
            "index": "18", 
            "lanes": "103", 
            "mtu": "9100", 
            "alias": "Eth18/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet71": {
            "index": "18", 
            "lanes": "104", 
            "mtu": "9100", 
            "alias": "Eth18/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet72": {
            "index": "19", 
            "lanes": "105", 
            "mtu": "9100", 
            "alias": "Eth19/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet73": {
            "index": "19", 
            "lanes": "106", 
            "mtu": "9100", 
            "alias": "Eth19/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet74": {
            "index": "19", 
            "lanes": "107", 
            "mtu": "9100", 
            "alias": "Eth19/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet75": {
            "index": "19", 
            "lanes": "108", 
            "mtu": "9100", 
            "alias": "Eth19/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet76": {
            "index": "20", 
            "lanes": "109", 
            "mtu": "9100", 
            "alias": "Eth20/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet77": {
            "index": "20", 
            "lanes": "110", 
            "mtu": "9100", 
            "alias": "Eth20/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet78": {
            "index": "20", 
            "lanes": "111", 
            "mtu": "9100", 
            "alias": "Eth20/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet79": {
            "index": "20", 
            "lanes": "112", 
            "mtu": "9100", 
            "alias": "Eth20/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet80": {
            "index": "21", 
            "lanes": "1", 
            "mtu": "9100", 
            "alias": "Eth21/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet81": {
            "index": "21", 
            "lanes": "2", 
            "mtu": "9100", 
            "alias": "Eth21/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet82": {
            "index": "21", 
            "lanes": "3", 
            "mtu": "9100", 
            "alias": "Eth21/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet83": {
            "index": "21", 
            "lanes": "4", 
            "mtu": "9100", 
            "alias": "Eth21/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet84": {
            "index": "22", 
            "lanes": "5", 
            "mtu": "9100", 
            "alias": "Eth22/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet85": {
            "index": "22", 
            "lanes": "6", 
            "mtu": "9100", 
            "alias": "Eth22/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet86": {
            "index": "22", 
            "lanes": "7", 
            "mtu": "9100", 
            "alias": "Eth22/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet87": {
            "index": "22", 
            "lanes": "8", 
            "mtu": "9100", 
            "alias": "Eth22/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet88": {
            "index": "23", 
            "lanes": "9", 
            "mtu": "9100", 
            "alias": "Eth23/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet89": {
            "index": "23", 
            "lanes": "10", 
            "mtu": "9100", 
            "alias": "Eth23/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet90": {
            "index": "23", 
            "lanes": "11", 
            "mtu": "9100", 
            "alias": "Eth23/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet91": {
            "index": "23", 
            "lanes": "12", 
            "mtu": "9100", 
            "alias": "Eth23/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet92": {
            "index": "24", 
            "lanes": "13", 
            "mtu": "9100", 
            "alias": "Eth24/1", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet93": {
            "index": "24", 
            "lanes": "14", 
            "mtu": "9100", 
            "alias": "Eth24/2", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet94": {
            "index": "25", 
            "lanes": "15", 
            "mtu": "9100", 
            "alias": "Eth24/3", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet95": {
            "index": "25", 
            "lanes": "16", 
            "mtu": "9100", 
            "alias": "Eth24/4", 
            "admin_status": "up", 
            "speed": "10000"
        }, 
        "Ethernet96": {
            "index": "26", 
            "lanes": "17,18", 
            "mtu": "9100", 
            "alias": "Eth25/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet98": {
            "index": "26", 
            "lanes": "19,20", 
            "mtu": "9100", 
            "alias": "Eth25/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet100": {
            "index": "27", 
            "lanes": "21,22", 
            "mtu": "9100", 
            "alias": "Eth26/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet102": {
            "index": "27", 
            "lanes": "23,24", 
            "mtu": "9100", 
            "alias": "Eth26/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet104": {
            "index": "28", 
            "lanes": "25,26", 
            "mtu": "9100", 
            "alias": "Eth27/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet106": {
            "index": "28", 
            "lanes": "27,28", 
            "mtu": "9100", 
            "alias": "Eth27/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet108": {
            "index": "29", 
            "lanes": "29,30", 
            "mtu": "9100", 
            "alias": "Eth28/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet110": {
            "index": "29", 
            "lanes": "31,32", 
            "mtu": "9100", 
            "alias": "Eth28/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet112": {
            "index": "30", 
            "lanes": "113,114", 
            "mtu": "9100", 
            "alias": "Eth29/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet114": {
            "index": "30", 
            "lanes": "115,116", 
            "mtu": "9100", 
            "alias": "Eth29/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet116": {
            "index": "31", 
            "lanes": "117,118", 
            "mtu": "9100", 
            "alias": "Eth30/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet118": {
            "index": "31", 
            "lanes": "119,120", 
            "mtu": "9100", 
            "alias": "Eth30/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet120": {
            "index": "32", 
            "lanes": "121,122", 
            "mtu": "9100", 
            "alias": "Eth31/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet122": {
            "index": "32", 
            "lanes": "123,124", 
            "mtu": "9100", 
            "alias": "Eth31/2", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet124": {
            "index": "32", 
            "lanes": "125,126", 
            "mtu": "9100", 
            "alias": "Eth32/1", 
            "admin_status": "up", 
            "speed": "50000"
        }, 
        "Ethernet126": {
            "index": "32", 
            "lanes": "127,128", 
            "mtu": "9100", 
            "alias": "Eth32/2", 
            "admin_status": "up", 
            "speed": "50000"
        }
    }, 
    "INTERFACE": {
        "Ethernet0|10.0.0.0/31": {}, 
        "Ethernet1|10.0.0.2/31": {}, 
        "Ethernet2|10.0.0.4/31": {}, 
        "Ethernet3|10.0.0.6/31": {}, 
        "Ethernet4|10.0.0.8/31": {}, 
        "Ethernet5|10.0.0.10/31": {}, 
        "Ethernet6|10.0.0.12/31": {}, 
        "Ethernet7|10.0.0.14/31": {}, 
        "Ethernet8|10.0.0.16/31": {}, 
        "Ethernet9|10.0.0.18/31": {}, 
        "Ethernet10|10.0.0.20/31": {}, 
        "Ethernet11|10.0.0.22/31": {}, 
        "Ethernet12|10.0.0.24/31": {}, 
        "Ethernet13|10.0.0.26/31": {}, 
        "Ethernet14|10.0.0.28/31": {}, 
        "Ethernet15|10.0.0.30/31": {}, 
        "Ethernet16|10.0.0.32/31": {}, 
        "Ethernet17|10.0.0.34/31": {}, 
        "Ethernet18|10.0.0.36/31": {}, 
        "Ethernet19|10.0.0.38/31": {}, 
        "Ethernet20|10.0.0.40/31": {}, 
        "Ethernet21|10.0.0.42/31": {}, 
        "Ethernet22|10.0.0.44/31": {}, 
        "Ethernet23|10.0.0.46/31": {}, 
        "Ethernet24|10.0.0.48/31": {}, 
        "Ethernet25|10.0.0.50/31": {}, 
        "Ethernet26|10.0.0.52/31": {}, 
        "Ethernet27|10.0.0.54/31": {}, 
        "Ethernet28|10.0.0.56/31": {}, 
        "Ethernet29|10.0.0.58/31": {}, 
        "Ethernet30|10.0.0.60/31": {}, 
        "Ethernet31|10.0.0.62/31": {}, 
        "Ethernet32|10.0.0.64/31": {}, 
        "Ethernet33|10.0.0.66/31": {}, 
        "Ethernet34|10.0.0.68/31": {}, 
        "Ethernet35|10.0.0.70/31": {}, 
        "Ethernet36|10.0.0.72/31": {}, 
        "Ethernet37|10.0.0.74/31": {}, 
        "Ethernet38|10.0.0.76/31": {}, 
        "Ethernet39|10.0.0.78/31": {}, 
        "Ethernet40|10.0.0.80/31": {}, 
        "Ethernet41|10.0.0.82/31": {}, 
        "Ethernet42|10.0.0.84/31": {}, 
        "Ethernet43|10.0.0.86/31": {}, 
        "Ethernet44|10.0.0.88/31": {}, 
        "Ethernet45|10.0.0.90/31": {}, 
        "Ethernet46|10.0.0.92/31": {}, 
        "Ethernet47|10.0.0.94/31": {}, 
        "Ethernet48|10.0.0.96/31": {}, 
        "Ethernet49|10.0.0.98/31": {}, 
        "Ethernet50|10.0.0.100/31": {}, 
        "Ethernet51|10.0.0.102/31": {}, 
        "Ethernet52|10.0.0.104/31": {}, 
        "Ethernet53|10.0.0.106/31": {}, 
        "Ethernet54|10.0.0.108/31": {}, 
        "Ethernet55|10.0.0.110/31": {}, 
        "Ethernet56|10.0.0.112/31": {}, 
        "Ethernet57|10.0.0.114/31": {}, 
        "Ethernet58|10.0.0.116/31": {}, 
        "Ethernet59|10.0.0.118/31": {}, 
        "Ethernet60|10.0.0.120/31": {}, 
        "Ethernet61|10.0.0.122/31": {}, 
        "Ethernet62|10.0.0.124/31": {}, 
        "Ethernet63|10.0.0.126/31": {}, 
        "Ethernet64|10.0.0.128/31": {}, 
        "Ethernet65|10.0.0.130/31": {}, 
        "Ethernet66|10.0.0.132/31": {}, 
        "Ethernet67|10.0.0.134/31": {}, 
        "Ethernet68|10.0.0.136/31": {}, 
        "Ethernet69|10.0.0.138/31": {}, 
        "Ethernet70|10.0.0.140/31": {}, 
        "Ethernet71|10.0.0.142/31": {}, 
        "Ethernet72|10.0.0.144/31": {}, 
        "Ethernet73|10.0.0.146/31": {}, 
        "Ethernet74|10.0.0.148/31": {}, 
        "Ethernet75|10.0.0.150/31": {}, 
        "Ethernet76|10.0.0.152/31": {}, 
        "Ethernet77|10.0.0.154/31": {}, 
        "Ethernet78|10.0.0.156/31": {}, 
        "Ethernet79|10.0.0.158/31": {}, 
        "Ethernet80|10.0.0.160/31": {}, 
        "Ethernet81|10.0.0.162/31": {}, 
        "Ethernet82|10.0.0.164/31": {}, 
        "Ethernet83|10.0.0.166/31": {}, 
        "Ethernet84|10.0.0.168/31": {}, 
        "Ethernet85|10.0.0.170/31": {}, 
        "Ethernet86|10.0.0.172/31": {}, 
        "Ethernet87|10.0.0.174/31": {}, 
        "Ethernet88|10.0.0.176/31": {}, 
        "Ethernet89|10.0.0.178/31": {}, 
        "Ethernet90|10.0.0.180/31": {}, 
        "Ethernet91|10.0.0.182/31": {}, 
        "Ethernet92|10.0.0.184/31": {}, 
        "Ethernet93|10.0.0.186/31": {}, 
        "Ethernet94|10.0.0.188/31": {}, 
        "Ethernet95|10.0.0.190/31": {}, 
        "Ethernet96|10.0.0.192/31": {}, 
        "Ethernet98|10.0.0.194/31": {}, 
        "Ethernet100|10.0.0.196/31": {}, 
        "Ethernet102|10.0.0.198/31": {}, 
        "Ethernet104|10.0.0.200/31": {}, 
        "Ethernet106|10.0.0.202/31": {}, 
        "Ethernet108|10.0.0.204/31": {}, 
        "Ethernet110|10.0.0.206/31": {}, 
        "Ethernet112|10.0.0.208/31": {}, 
        "Ethernet114|10.0.0.210/31": {}, 
        "Ethernet116|10.0.0.212/31": {}, 
        "Ethernet118|10.0.0.214/31": {}, 
        "Ethernet120|10.0.0.216/31": {}, 
        "Ethernet122|10.0.0.218/31": {}, 
        "Ethernet124|10.0.0.220/31": {}, 
        "Ethernet126|10.0.0.222/31": {}
    }, 
    "FLEX_COUNTER_TABLE": {
        "PFCWD": {
            "FLEX_COUNTER_STATUS": "enable"
        }, 
        "PORT": {
            "FLEX_COUNTER_STATUS": "enable"
        }, 
        "QUEUE": {
            "FLEX_COUNTER_STATUS": "enable"
        }
    }, 
    "LOOPBACK_INTERFACE": {
        "Loopback0|10.1.0.1/32": {}
    }
}

===
FRR log:
Sep 28 11:15:27.644655 sonic INFO bgp#liblogging-stdlog:  [origin software="rsyslogd" swVersion="8.23.0" x-pid="39" x-info="http://www.rsyslog.com"] start
Sep 28 11:15:27.762630 sonic INFO bgp.sh[5348]: [....] Starting enhanced syslogd: rsyslogd#033[?25l#0337#033[1G[#033[32m ok #033[39;49m#0338#033[?12l#033[?25h.
Sep 28 11:15:27.980757 sonic INFO bgp.sh[5348]: Starting Frr daemons (prio:10):. zebra2018/09/28 11:15:27 warnings: ZEBRA: Disabling MPLS support (no kernel support)
Sep 28 11:15:28.288277 sonic INFO bgp.sh[5348]: . bgpd.
Sep 28 11:15:28.324990 sonic NOTICE bgp#watchfrr[93]: watchfrr 4.0 watching [zebra bgpd]
Sep 28 11:15:28.628961 sonic NOTICE bgp#watchfrr[93]: bgpd state -> up : connect succeeded
Sep 28 11:15:28.920624 sonic NOTICE bgp#watchfrr[93]: zebra state -> up : connect succeeded
Sep 28 11:15:28.920624 sonic NOTICE bgp#watchfrr[93]: Watchfrr: Notifying Systemd we are up and running
Sep 28 11:15:29.330198 sonic INFO bgp.sh[5348]: Starting Frr monitor daemon: watchfrr.
Sep 28 11:15:29.330840 sonic INFO bgp.sh[5348]: Exiting from the script
Sep 28 11:15:29.379791 sonic INFO bgp.sh[5348]: root@sonic:/# Waiting for connection...
Sep 28 11:15:32.998936 sonic INFO bgp.sh[5348]: Connected!

======
admin@sonic:~$ vtysh

Hello, this is FRRouting (version 4.0).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

sonic# show running-config 
Building configuration...

Current configuration:
!
frr version 4.0
frr defaults traditional
hostname sonic
!
service integrated-vtysh-config
!
password zebra
!
log syslog informational
!
log facility local4
!
router bgp 65100
 bgp router-id 10.1.0.1
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 coalesce-time 1000
 bgp bestpath as-path multipath-relax
 neighbor 10.0.0.1 remote-as 65200
 neighbor 10.0.0.1 description ARISTA01T2
 neighbor 10.0.0.3 remote-as 65200
 neighbor 10.0.0.3 description ARISTA02T2
 neighbor 10.0.0.5 remote-as 65200
 neighbor 10.0.0.5 description ARISTA03T2
 neighbor 10.0.0.7 remote-as 65200
 neighbor 10.0.0.7 description ARISTA04T2
 neighbor 10.0.0.9 remote-as 65200
 neighbor 10.0.0.9 description ARISTA05T2
 neighbor 10.0.0.11 remote-as 65200
 neighbor 10.0.0.11 description ARISTA06T2
 neighbor 10.0.0.13 remote-as 65200
 neighbor 10.0.0.13 description ARISTA07T2
 neighbor 10.0.0.15 remote-as 65200
 neighbor 10.0.0.15 description ARISTA08T2
 neighbor 10.0.0.17 remote-as 65200
 neighbor 10.0.0.17 description ARISTA09T2
 neighbor 10.0.0.19 remote-as 65200
 neighbor 10.0.0.19 description ARISTA10T2
 neighbor 10.0.0.21 remote-as 65200
 neighbor 10.0.0.21 description ARISTA11T2
 neighbor 10.0.0.23 remote-as 65200
 neighbor 10.0.0.23 description ARISTA12T2
 neighbor 10.0.0.25 remote-as 65200
 neighbor 10.0.0.25 description ARISTA13T2
 neighbor 10.0.0.27 remote-as 65200
 neighbor 10.0.0.27 description ARISTA14T2
 neighbor 10.0.0.29 remote-as 65200
 neighbor 10.0.0.29 description ARISTA15T2
 neighbor 10.0.0.31 remote-as 65200
 neighbor 10.0.0.31 description ARISTA16T2
 neighbor 10.0.0.33 remote-as 65200
 neighbor 10.0.0.33 description ARISTA17T2
 neighbor 10.0.0.35 remote-as 65200
 neighbor 10.0.0.35 description ARISTA18T2
 neighbor 10.0.0.37 remote-as 65200
 neighbor 10.0.0.37 description ARISTA19T2
 neighbor 10.0.0.39 remote-as 65200
 neighbor 10.0.0.39 description ARISTA20T2
 neighbor 10.0.0.41 remote-as 65200
 neighbor 10.0.0.41 description ARISTA21T2
 neighbor 10.0.0.43 remote-as 65200
 neighbor 10.0.0.43 description ARISTA22T2
 neighbor 10.0.0.45 remote-as 65200
 neighbor 10.0.0.45 description ARISTA23T2
 neighbor 10.0.0.47 remote-as 65200
 neighbor 10.0.0.47 description ARISTA24T2
 neighbor 10.0.0.49 remote-as 65200
 neighbor 10.0.0.49 description ARISTA25T2
 neighbor 10.0.0.51 remote-as 65200
 neighbor 10.0.0.51 description ARISTA26T2
 neighbor 10.0.0.53 remote-as 65200
 neighbor 10.0.0.53 description ARISTA27T2
 neighbor 10.0.0.55 remote-as 65200
 neighbor 10.0.0.55 description ARISTA28T2
 neighbor 10.0.0.57 remote-as 65200
 neighbor 10.0.0.57 description ARISTA29T2
 neighbor 10.0.0.59 remote-as 65200
 neighbor 10.0.0.59 description ARISTA30T2
 neighbor 10.0.0.61 remote-as 65200
 neighbor 10.0.0.61 description ARISTA31T2
 neighbor 10.0.0.63 remote-as 65200
 neighbor 10.0.0.63 description ARISTA32T2
 neighbor 10.0.0.65 remote-as 65200
 neighbor 10.0.0.65 description ARISTA33T2
 neighbor 10.0.0.67 remote-as 65200
 neighbor 10.0.0.67 description ARISTA34T2
 neighbor 10.0.0.69 remote-as 65200
 neighbor 10.0.0.69 description ARISTA35T2
 neighbor 10.0.0.71 remote-as 65200
 neighbor 10.0.0.71 description ARISTA36T2
 neighbor 10.0.0.73 remote-as 65200
 neighbor 10.0.0.73 description ARISTA37T2
 neighbor 10.0.0.75 remote-as 65200
 neighbor 10.0.0.75 description ARISTA38T2
 neighbor 10.0.0.77 remote-as 65200
 neighbor 10.0.0.77 description ARISTA39T2
 neighbor 10.0.0.79 remote-as 65200
 neighbor 10.0.0.79 description ARISTA40T2
 neighbor 10.0.0.81 remote-as 65200
 neighbor 10.0.0.81 description ARISTA41T2
 neighbor 10.0.0.83 remote-as 65200
 neighbor 10.0.0.83 description ARISTA42T2
 neighbor 10.0.0.85 remote-as 65200
 neighbor 10.0.0.85 description ARISTA43T2
 neighbor 10.0.0.87 remote-as 65200
 neighbor 10.0.0.87 description ARISTA44T2
 neighbor 10.0.0.89 remote-as 65200
 neighbor 10.0.0.89 description ARISTA45T2
 neighbor 10.0.0.91 remote-as 65200
 neighbor 10.0.0.91 description ARISTA46T2
 neighbor 10.0.0.93 remote-as 65200
 neighbor 10.0.0.93 description ARISTA47T2
 neighbor 10.0.0.95 remote-as 65200
 neighbor 10.0.0.95 description ARISTA48T2
 neighbor 10.0.0.97 remote-as 65200
 neighbor 10.0.0.97 description ARISTA49T2
 neighbor 10.0.0.99 remote-as 65200
 neighbor 10.0.0.99 description ARISTA50T2
 neighbor 10.0.0.101 remote-as 65200
 neighbor 10.0.0.101 description ARISTA51T2
 neighbor 10.0.0.103 remote-as 65200
 neighbor 10.0.0.103 description ARISTA52T2
 neighbor 10.0.0.105 remote-as 65200
 neighbor 10.0.0.105 description ARISTA53T2
 neighbor 10.0.0.107 remote-as 65200
 neighbor 10.0.0.107 description ARISTA54T2
 neighbor 10.0.0.109 remote-as 65200
 neighbor 10.0.0.109 description ARISTA55T2
 neighbor 10.0.0.111 remote-as 65200
 neighbor 10.0.0.111 description ARISTA56T2
 neighbor 10.0.0.113 remote-as 64001
 neighbor 10.0.0.113 description ARISTA01T0
 neighbor 10.0.0.115 remote-as 64002
 neighbor 10.0.0.115 description ARISTA02T0
 neighbor 10.0.0.117 remote-as 64003
 neighbor 10.0.0.117 description ARISTA03T0
 neighbor 10.0.0.119 remote-as 64004
 neighbor 10.0.0.119 description ARISTA04T0
 neighbor 10.0.0.121 remote-as 64005
 neighbor 10.0.0.121 description ARISTA05T0
 neighbor 10.0.0.123 remote-as 64006
 neighbor 10.0.0.123 description ARISTA06T0
 neighbor 10.0.0.125 remote-as 64007
 neighbor 10.0.0.125 description ARISTA07T0
 neighbor 10.0.0.127 remote-as 64008
 neighbor 10.0.0.127 description ARISTA08T0
 neighbor 10.0.0.129 remote-as 64009
 neighbor 10.0.0.129 description ARISTA09T0
 neighbor 10.0.0.131 remote-as 64010
 neighbor 10.0.0.131 description ARISTA10T0
 neighbor 10.0.0.133 remote-as 64011
 neighbor 10.0.0.133 description ARISTA11T0
 neighbor 10.0.0.135 remote-as 64012
 neighbor 10.0.0.135 description ARISTA12T0
 neighbor 10.0.0.137 remote-as 64013
 neighbor 10.0.0.137 description ARISTA13T0
 neighbor 10.0.0.139 remote-as 64014
 neighbor 10.0.0.139 description ARISTA14T0
 neighbor 10.0.0.141 remote-as 64015
 neighbor 10.0.0.141 description ARISTA15T0
 neighbor 10.0.0.143 remote-as 64016
 neighbor 10.0.0.143 description ARISTA16T0
 neighbor 10.0.0.145 remote-as 64017
 neighbor 10.0.0.145 description ARISTA17T0
 neighbor 10.0.0.147 remote-as 64018
 neighbor 10.0.0.147 description ARISTA18T0
 neighbor 10.0.0.149 remote-as 64019
 neighbor 10.0.0.149 description ARISTA19T0
 neighbor 10.0.0.151 remote-as 64020
 neighbor 10.0.0.151 description ARISTA20T0
 neighbor 10.0.0.153 remote-as 64021
 neighbor 10.0.0.153 description ARISTA21T0
 neighbor 10.0.0.155 remote-as 64022
 neighbor 10.0.0.155 description ARISTA22T0
 neighbor 10.0.0.157 remote-as 64023
 neighbor 10.0.0.157 description ARISTA23T0
 neighbor 10.0.0.159 remote-as 64024
 neighbor 10.0.0.159 description ARISTA24T0
 neighbor 10.0.0.161 remote-as 64025
 neighbor 10.0.0.161 description ARISTA25T0
 neighbor 10.0.0.163 remote-as 64026
 neighbor 10.0.0.163 description ARISTA26T0
 neighbor 10.0.0.165 remote-as 64027
 neighbor 10.0.0.165 description ARISTA27T0
 neighbor 10.0.0.167 remote-as 64028
 neighbor 10.0.0.167 description ARISTA28T0
 neighbor 10.0.0.169 remote-as 64029
 neighbor 10.0.0.169 description ARISTA29T0
 neighbor 10.0.0.171 remote-as 64030
 neighbor 10.0.0.171 description ARISTA30T0
 neighbor 10.0.0.173 remote-as 64031
 neighbor 10.0.0.173 description ARISTA31T0
 neighbor 10.0.0.175 remote-as 64032
 neighbor 10.0.0.175 description ARISTA32T0
 neighbor 10.0.0.177 remote-as 64033
 neighbor 10.0.0.177 description ARISTA33T0
 neighbor 10.0.0.179 remote-as 64034
 neighbor 10.0.0.179 description ARISTA34T0
 neighbor 10.0.0.181 remote-as 64035
 neighbor 10.0.0.181 description ARISTA35T0
 neighbor 10.0.0.183 remote-as 64036
 neighbor 10.0.0.183 description ARISTA36T0
 neighbor 10.0.0.185 remote-as 64037
 neighbor 10.0.0.185 description ARISTA37T0
 neighbor 10.0.0.187 remote-as 64038
 neighbor 10.0.0.187 description ARISTA38T0
 neighbor 10.0.0.189 remote-as 64039
 neighbor 10.0.0.189 description ARISTA39T0
 neighbor 10.0.0.191 remote-as 64040
 neighbor 10.0.0.191 description ARISTA40T0
 neighbor 10.0.0.193 remote-as 64041
 neighbor 10.0.0.193 description ARISTA41T0
 neighbor 10.0.0.195 remote-as 64042
 neighbor 10.0.0.195 description ARISTA42T0
 neighbor 10.0.0.197 remote-as 64043
 neighbor 10.0.0.197 description ARISTA43T0
 neighbor 10.0.0.199 remote-as 64044
 neighbor 10.0.0.199 description ARISTA44T0
 neighbor 10.0.0.201 remote-as 64045
 neighbor 10.0.0.201 description ARISTA45T0
 neighbor 10.0.0.203 remote-as 64046
 neighbor 10.0.0.203 description ARISTA46T0
 neighbor 10.0.0.205 remote-as 64047
 neighbor 10.0.0.205 description ARISTA47T0
 neighbor 10.0.0.207 remote-as 64048
 neighbor 10.0.0.207 description ARISTA48T0
 neighbor 10.0.0.209 remote-as 64049
 neighbor 10.0.0.209 description ARISTA49T0
 neighbor 10.0.0.211 remote-as 64050
 neighbor 10.0.0.211 description ARISTA50T0
 neighbor 10.0.0.213 remote-as 64051
 neighbor 10.0.0.213 description ARISTA51T0
 neighbor 10.0.0.215 remote-as 64052
 neighbor 10.0.0.215 description ARISTA52T0
 neighbor 10.0.0.217 remote-as 64053
 neighbor 10.0.0.217 description ARISTA53T0
 neighbor 10.0.0.219 remote-as 64054
 neighbor 10.0.0.219 description ARISTA54T0
 neighbor 10.0.0.221 remote-as 64055
 neighbor 10.0.0.221 description ARISTA55T0
 neighbor 10.0.0.223 remote-as 64056
 neighbor 10.0.0.223 description ARISTA56T0
 !
 address-family ipv4 unicast
  network 10.1.0.1/32
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 soft-reconfiguration inbound
  neighbor 10.0.0.3 activate
  neighbor 10.0.0.3 soft-reconfiguration inbound
  neighbor 10.0.0.5 activate
  neighbor 10.0.0.5 soft-reconfiguration inbound
  neighbor 10.0.0.7 activate
  neighbor 10.0.0.7 soft-reconfiguration inbound
  neighbor 10.0.0.9 activate
  neighbor 10.0.0.9 soft-reconfiguration inbound
  neighbor 10.0.0.11 activate
  neighbor 10.0.0.11 soft-reconfiguration inbound
  neighbor 10.0.0.13 activate
  neighbor 10.0.0.13 soft-reconfiguration inbound
  neighbor 10.0.0.15 activate
  neighbor 10.0.0.15 soft-reconfiguration inbound
  neighbor 10.0.0.17 activate
  neighbor 10.0.0.17 soft-reconfiguration inbound
  neighbor 10.0.0.19 activate
  neighbor 10.0.0.19 soft-reconfiguration inbound
  neighbor 10.0.0.21 activate
  neighbor 10.0.0.21 soft-reconfiguration inbound
  neighbor 10.0.0.23 activate
  neighbor 10.0.0.23 soft-reconfiguration inbound
  neighbor 10.0.0.25 activate
  neighbor 10.0.0.25 soft-reconfiguration inbound
  neighbor 10.0.0.27 activate
  neighbor 10.0.0.27 soft-reconfiguration inbound
  neighbor 10.0.0.29 activate
  neighbor 10.0.0.29 soft-reconfiguration inbound
  neighbor 10.0.0.31 activate
  neighbor 10.0.0.31 soft-reconfiguration inbound
  neighbor 10.0.0.33 activate
  neighbor 10.0.0.33 soft-reconfiguration inbound
  neighbor 10.0.0.35 activate
  neighbor 10.0.0.35 soft-reconfiguration inbound
  neighbor 10.0.0.37 activate
  neighbor 10.0.0.37 soft-reconfiguration inbound
  neighbor 10.0.0.39 activate
  neighbor 10.0.0.39 soft-reconfiguration inbound
  neighbor 10.0.0.41 activate
  neighbor 10.0.0.41 soft-reconfiguration inbound
  neighbor 10.0.0.43 activate
  neighbor 10.0.0.43 soft-reconfiguration inbound
  neighbor 10.0.0.45 activate
  neighbor 10.0.0.45 soft-reconfiguration inbound
  neighbor 10.0.0.47 activate
  neighbor 10.0.0.47 soft-reconfiguration inbound
  neighbor 10.0.0.49 activate
  neighbor 10.0.0.49 soft-reconfiguration inbound
  neighbor 10.0.0.51 activate
  neighbor 10.0.0.51 soft-reconfiguration inbound
  neighbor 10.0.0.53 activate
  neighbor 10.0.0.53 soft-reconfiguration inbound
  neighbor 10.0.0.55 activate
  neighbor 10.0.0.55 soft-reconfiguration inbound
  neighbor 10.0.0.57 activate
  neighbor 10.0.0.57 soft-reconfiguration inbound
  neighbor 10.0.0.59 activate
  neighbor 10.0.0.59 soft-reconfiguration inbound
  neighbor 10.0.0.61 activate
  neighbor 10.0.0.61 soft-reconfiguration inbound
  neighbor 10.0.0.63 activate
  neighbor 10.0.0.63 soft-reconfiguration inbound
  neighbor 10.0.0.65 activate
  neighbor 10.0.0.65 soft-reconfiguration inbound
  neighbor 10.0.0.67 activate
  neighbor 10.0.0.67 soft-reconfiguration inbound
  neighbor 10.0.0.69 activate
  neighbor 10.0.0.69 soft-reconfiguration inbound
  neighbor 10.0.0.71 activate
  neighbor 10.0.0.71 soft-reconfiguration inbound
  neighbor 10.0.0.73 activate
  neighbor 10.0.0.73 soft-reconfiguration inbound
  neighbor 10.0.0.75 activate
  neighbor 10.0.0.75 soft-reconfiguration inbound
  neighbor 10.0.0.77 activate
  neighbor 10.0.0.77 soft-reconfiguration inbound
  neighbor 10.0.0.79 activate
  neighbor 10.0.0.79 soft-reconfiguration inbound
  neighbor 10.0.0.81 activate
  neighbor 10.0.0.81 soft-reconfiguration inbound
  neighbor 10.0.0.83 activate
  neighbor 10.0.0.83 soft-reconfiguration inbound
  neighbor 10.0.0.85 activate
  neighbor 10.0.0.85 soft-reconfiguration inbound
  neighbor 10.0.0.87 activate
  neighbor 10.0.0.87 soft-reconfiguration inbound
  neighbor 10.0.0.89 activate
  neighbor 10.0.0.89 soft-reconfiguration inbound
  neighbor 10.0.0.91 activate
  neighbor 10.0.0.91 soft-reconfiguration inbound
  neighbor 10.0.0.93 activate
  neighbor 10.0.0.93 soft-reconfiguration inbound
  neighbor 10.0.0.95 activate
  neighbor 10.0.0.95 soft-reconfiguration inbound
  neighbor 10.0.0.97 activate
  neighbor 10.0.0.97 soft-reconfiguration inbound
  neighbor 10.0.0.99 activate
  neighbor 10.0.0.99 soft-reconfiguration inbound
  neighbor 10.0.0.101 activate
  neighbor 10.0.0.101 soft-reconfiguration inbound
  neighbor 10.0.0.103 activate
  neighbor 10.0.0.103 soft-reconfiguration inbound
  neighbor 10.0.0.105 activate
  neighbor 10.0.0.105 soft-reconfiguration inbound
  neighbor 10.0.0.107 activate
  neighbor 10.0.0.107 soft-reconfiguration inbound
  neighbor 10.0.0.109 activate
  neighbor 10.0.0.109 soft-reconfiguration inbound
  neighbor 10.0.0.111 activate
  neighbor 10.0.0.111 soft-reconfiguration inbound
  neighbor 10.0.0.113 activate
  neighbor 10.0.0.113 soft-reconfiguration inbound
  neighbor 10.0.0.115 activate
  neighbor 10.0.0.115 soft-reconfiguration inbound
  neighbor 10.0.0.117 activate
  neighbor 10.0.0.117 soft-reconfiguration inbound
  neighbor 10.0.0.119 activate
  neighbor 10.0.0.119 soft-reconfiguration inbound
  neighbor 10.0.0.121 activate
  neighbor 10.0.0.121 soft-reconfiguration inbound
  neighbor 10.0.0.123 activate
  neighbor 10.0.0.123 soft-reconfiguration inbound
  neighbor 10.0.0.125 activate
  neighbor 10.0.0.125 soft-reconfiguration inbound
  neighbor 10.0.0.127 activate
  neighbor 10.0.0.127 soft-reconfiguration inbound
  neighbor 10.0.0.129 activate
  neighbor 10.0.0.129 soft-reconfiguration inbound
  neighbor 10.0.0.131 activate
  neighbor 10.0.0.131 soft-reconfiguration inbound
  neighbor 10.0.0.133 activate
  neighbor 10.0.0.133 soft-reconfiguration inbound
  neighbor 10.0.0.135 activate
  neighbor 10.0.0.135 soft-reconfiguration inbound
  neighbor 10.0.0.137 activate
  neighbor 10.0.0.137 soft-reconfiguration inbound
  neighbor 10.0.0.139 activate
  neighbor 10.0.0.139 soft-reconfiguration inbound
  neighbor 10.0.0.141 activate
  neighbor 10.0.0.141 soft-reconfiguration inbound
  neighbor 10.0.0.143 activate
  neighbor 10.0.0.143 soft-reconfiguration inbound
  neighbor 10.0.0.145 activate
  neighbor 10.0.0.145 soft-reconfiguration inbound
  neighbor 10.0.0.147 activate
  neighbor 10.0.0.147 soft-reconfiguration inbound
  neighbor 10.0.0.149 activate
  neighbor 10.0.0.149 soft-reconfiguration inbound
  neighbor 10.0.0.151 activate
  neighbor 10.0.0.151 soft-reconfiguration inbound
  neighbor 10.0.0.153 activate
  neighbor 10.0.0.153 soft-reconfiguration inbound
  neighbor 10.0.0.155 activate
  neighbor 10.0.0.155 soft-reconfiguration inbound
  neighbor 10.0.0.157 activate
  neighbor 10.0.0.157 soft-reconfiguration inbound
  neighbor 10.0.0.159 activate
  neighbor 10.0.0.159 soft-reconfiguration inbound
  neighbor 10.0.0.161 activate
  neighbor 10.0.0.161 soft-reconfiguration inbound
  neighbor 10.0.0.163 activate
  neighbor 10.0.0.163 soft-reconfiguration inbound
  neighbor 10.0.0.165 activate
  neighbor 10.0.0.165 soft-reconfiguration inbound
  neighbor 10.0.0.167 activate
  neighbor 10.0.0.167 soft-reconfiguration inbound
  neighbor 10.0.0.169 activate
  neighbor 10.0.0.169 soft-reconfiguration inbound
  neighbor 10.0.0.171 activate
  neighbor 10.0.0.171 soft-reconfiguration inbound
  neighbor 10.0.0.173 activate
  neighbor 10.0.0.173 soft-reconfiguration inbound
  neighbor 10.0.0.175 activate
  neighbor 10.0.0.175 soft-reconfiguration inbound
  neighbor 10.0.0.177 activate
  neighbor 10.0.0.177 soft-reconfiguration inbound
  neighbor 10.0.0.179 activate
  neighbor 10.0.0.179 soft-reconfiguration inbound
  neighbor 10.0.0.181 activate
  neighbor 10.0.0.181 soft-reconfiguration inbound
  neighbor 10.0.0.183 activate
  neighbor 10.0.0.183 soft-reconfiguration inbound
  neighbor 10.0.0.185 activate
  neighbor 10.0.0.185 soft-reconfiguration inbound
  neighbor 10.0.0.187 activate
  neighbor 10.0.0.187 soft-reconfiguration inbound
  neighbor 10.0.0.189 activate
  neighbor 10.0.0.189 soft-reconfiguration inbound
  neighbor 10.0.0.191 activate
  neighbor 10.0.0.191 soft-reconfiguration inbound
  neighbor 10.0.0.193 activate
  neighbor 10.0.0.193 soft-reconfiguration inbound
  neighbor 10.0.0.195 activate
  neighbor 10.0.0.195 soft-reconfiguration inbound
  neighbor 10.0.0.197 activate
  neighbor 10.0.0.197 soft-reconfiguration inbound
  neighbor 10.0.0.199 activate
  neighbor 10.0.0.199 soft-reconfiguration inbound
  neighbor 10.0.0.201 activate
  neighbor 10.0.0.201 soft-reconfiguration inbound
  neighbor 10.0.0.203 activate
  neighbor 10.0.0.203 soft-reconfiguration inbound
  neighbor 10.0.0.205 activate
  neighbor 10.0.0.205 soft-reconfiguration inbound
  neighbor 10.0.0.207 activate
  neighbor 10.0.0.207 soft-reconfiguration inbound
  neighbor 10.0.0.209 activate
  neighbor 10.0.0.209 soft-reconfiguration inbound
  neighbor 10.0.0.211 activate
  neighbor 10.0.0.211 soft-reconfiguration inbound
  neighbor 10.0.0.213 activate
  neighbor 10.0.0.213 soft-reconfiguration inbound
  neighbor 10.0.0.215 activate
  neighbor 10.0.0.215 soft-reconfiguration inbound
  neighbor 10.0.0.217 activate
  neighbor 10.0.0.217 soft-reconfiguration inbound
  neighbor 10.0.0.219 activate
  neighbor 10.0.0.219 soft-reconfiguration inbound
  neighbor 10.0.0.221 activate
  neighbor 10.0.0.221 soft-reconfiguration inbound
  neighbor 10.0.0.223 activate
  neighbor 10.0.0.223 soft-reconfiguration inbound
  maximum-paths 64
 exit-address-family
!
route-map set-next-hop-global-v6 permit 10
 set ipv6 next-hop prefer-global 
!
route-map ISOLATE permit 10
 set as-path prepend 65100
!
route-map TO_BGP_SPEAKER_V4 deny 10
!
route-map FROM_BGP_SPEAKER_V4 permit 10
!
route-map RM_SET_SRC permit 10
 set src 10.1.0.1
!
ip protocol bgp route-map RM_SET_SRC
!
line vty
!
end

===== FPM test ====

admin@sonic:~$ vtysh

Hello, this is FRRouting (version 4.0).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

sonic# configure terminal 
sonic(config)# ip route 100.1.1.0/24 10.0.0.17
sonic(config)# 



admin@sonic:~$ redis-cli
127.0.0.1:6379> keys ROUTE*
1) "ROUTE_TABLE:10.0.0.32/31"
2) "ROUTE_TABLE:10.1.0.1"
3) "ROUTE_TABLE:172.25.11.0/24"
4) "ROUTE_TABLE:100.1.1.0/24"
5) "ROUTE_TABLE:10.0.0.218/31"
6) "ROUTE_TABLE:10.0.0.18/31"
7) "ROUTE_TABLE:fe80::/64"
8) "ROUTE_TABLE:10.0.0.16/31"
9) "ROUTE_TABLE:0.0.0.0/0"
127.0.0.1:6379> hgetall ROUTE_TABLE:100.1.1.0/24
1) "nexthop"
2) "10.0.0.17"
3) "ifname"
4) "Ethernet8"

Full regression test on testbed is also in progress...

- Description for the changelog

- A picture of a cute animal (not mandatory but encouraged)

-- Uses SONiC FRR repo frr/4.0 (which has SONiC support) to build image
-- Makefile changes to make frr4.0 builtable.
-- Updated/Added FRR configuration files
-- bgpd jinja template fixes

To build SONiC images with FRR4.0, simply edit rules/config file and change
routing stack to following:

SONIC_ROUTING_STACK = frr

and then build images as usual.
Copy link
Collaborator

@jipanyang jipanyang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you put one set of bgpd.conf and zebra.conf sample out for FRR as that for quagga under sonci-conifg-engine/tests/sample_output? It will help people understand the typical config for FRR.

@lguohan
Copy link
Collaborator

lguohan commented Sep 29, 2018

agree with jipan, please add a configuration generation test for frr bgpd.conf

https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-config-engine/tests/test_j2files.py#L67

Copy link
Collaborator

@lguohan lguohan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need config gen unit test for bgpd.conf in frr

@nikos-github
Copy link
Collaborator

I am of the opinion that frr should use the unified config.

@zhenggen-xu
Copy link
Collaborator Author

@nikos-github The current change in PR disabled " integrated-vtysh-config" to make it consistent with quagga configurations, means separated configuration files.

@lguohan @jipanyang Do you see concerns to move the configurations to unified config? In such case, we will have frr.conf instead of multiple configuration files.

@nikos-github
Copy link
Collaborator

@zhenggen-xu I understand. Today though, bgpd has no purpose in running by itself (without zebra) in a sonic device and if it did, it wouldn't be able to communicate with sonic without zebra. So from frr's perspective, multiple configuration files don't really offer anything in my opinion. For simplicity, I propose that we move into unified config.

@rodnymolina
Copy link
Contributor

Agree with Nikos here. We should exclusively rely on the Integrated-vtysh-mode (frr.conf) which is becoming the common/default operational mode in FRR community. It's not only simpler from an operational perspective, but it's also better tested nowadays.

@jipanyang
Copy link
Collaborator

@zhenggen-xu Switching to Integrated-vtysh-mode for FRR looks like a good move to me.

Changed to single template: frr.conf.j2 for configuration and added tests
@zhenggen-xu
Copy link
Collaborator Author

Changed the code to use integrated-vtysh-config in FRR, also updated the template and test cases.
Ansible tests also looked good, a few tweaks will be sent to sonic-mgmt PR.

@lguohan
Copy link
Collaborator

lguohan commented Oct 2, 2018

what about unit test? need config gen unit test for frr.conf in frr. can you add. other changes are fine with me.

@nikos-github
Copy link
Collaborator

I have approved this. However if you don't mind, I'd like to propose one more change for this PR. Move frr.conf under /etc/sonic/frr or /etc/sonic/bgp directories (preferably bgp to match the docker name) and if you want to take one more extra step, mount the directory into the docker as rw.

@lguohan lguohan merged commit 673bb65 into sonic-net:master Oct 2, 2018
@zhenggen-xu
Copy link
Collaborator Author

what about unit test? need config gen unit test for frr.conf in frr. can you add. other changes are fine with me.

As talked, unit tests were already included in the commit.

@zhenggen-xu
Copy link
Collaborator Author

I have approved this. However if you don't mind, I'd like to propose one more change for this PR. Move frr.conf under /etc/sonic/frr or /etc/sonic/bgp directories (preferably bgp to match the docker name) and if you want to take one more extra step, mount the directory into the docker as rw.

@nikos-github Let's have that change in a later PR with a design and use case. Also it could/should be done not only for frr.

@nikos-github
Copy link
Collaborator

Ok. I will send out a design next week along with use cases next week.

@zhenggen-xu zhenggen-xu deleted the master-frr4.0 branch June 7, 2019 19:32
taras-keryk pushed a commit to taras-keryk/sonic-buildimage that referenced this pull request Apr 28, 2022
…t#2120)

#### What I did
Fixes sonic-net#2099

Grouping all fields under tables/keys to be added/deleted in 1 JsonChange.


**BEFORE** how did we generate moves to try?
- Start with the low level differences, low level means differences that has no children
- Then extend this low level by different extenders, the most used is the `UpperLevelMoveExtender`
- Extended the already extended moves to go upper in level, and do that multiple times until there are no possible moves to extend

The diagram below shows:
- Generation (low level):
```json
{"op":"replace", "path":"/ACL_RULE/SNMP_ACL|RULE_1/SRC_IP", "value": "1.1.1.1/21"}
{"op":"remove", "path":"/ACL_RULE/SNMP_ACL|RULE_2/PRIORITY"}
{"op":"remove", "path":"/ACL_RULE/SNMP_ACL|RULE_2/SRC_IP"}
{"op":"remove", "path":"/ACL_RULE/SNMP_ACL|RULE_2/IP_PROTOCOL"}
{"op":"remove", "path":"/ACL_RULE/SNMP_ACL|RULE_2/PACKET_ACTION"}
{"op":"add", "path":"/ACL_RULE/SNMP_ACL|RULE_3/PRIORITY", "value": "9997"}
{"op":"add", "path":"/ACL_RULE/SNMP_ACL|RULE_3/SRC_IP", "value": "3.3.3.3/20"}
{"op":"add", "path":"/ACL_RULE/SNMP_ACL|RULE_3/IP_PROTOCOL", "value": "17"}
{"op":"add", "path":"/ACL_RULE/SNMP_ACL|RULE_3/PACKET_ACTION", "value": "ACCEPT"}
```
- Extension - 1st level
```json
{"op":"replace", "path":"/ACL_RULE/SNMP_ACL|RULE_1", "value": {"PRIORITY": "9999","SRC_IP": "2.2.2.2/21","SRC_IP": "1.1.1.1/21","IP_PROTOCOL": "17","PACKET_ACTION": "ACCEPT"}}
{"op":"remove", "path":"/ACL_RULE/SNMP_ACL|RULE_2"}
{"op":"add", "path":"/ACL_RULE/SNMP_ACL|RULE_3", "value": {"PRIORITY": "9997","SRC_IP": "3.3.3.3/20","IP_PROTOCOL": "17","PACKET_ACTION": "ACCEPT"}}
```
- Extension - 2nd level
```json
{"op":"replace", "path":"/ACL_RULE", "value": {"SNMP_ACL|RULE_1": {"PRIORITY": "9999","SRC_IP": "1.1.1.1/21","IP_PROTOCOL": "17","PACKET_ACTION": "ACCEPT"},"SNMP_ACL|RULE_3": {"PRIORITY": "9997","SRC_IP": "3.3.3.3/20","IP_PROTOCOL": "17","PACKET_ACTION": "ACCEPT"},"SNMP_ACL|DEFAULT_RULE": {"PRIORITY": "1","ETHER_TYPE": "2048","PACKET_ACTION": "DROP"}}}
```
- Extension - 3rd level
 ```json
{"op":"replace", "path":"", "value": {"ACL_RULE": {"SNMP_ACL|RULE_1": {"PRIORITY": "9999","SRC_IP": "1.1.1.1/21","IP_PROTOCOL": "17","PACKET_ACTION": "ACCEPT"},"SNMP_ACL|RULE_3": {"PRIORITY": "9997","SRC_IP": "3.3.3.3/20","IP_PROTOCOL": "17","PACKET_ACTION": "ACCEPT"},"SNMP_ACL|DEFAULT_RULE": {"PRIORITY": "1","ETHER_TYPE": "2048","PACKET_ACTION": "DROP"}},"ACL_TABLE": {"SNMP_ACL": {"type": "CTRLPLANE","policy_desc": "SNMP_ACL","services": ["SNMP"]}}}}
```
![image](https://user-images.githubusercontent.com/3927651/160676723-29688656-3382-4247-8358-cb988cda5134.png)


**AFTER**
In this PR, we introduce a different kind of generator. The non-extendable generators i.e. generators that their moves do not get extended using the extenders. We added 2 generators:
- KeyLevelGenerator: if a whole key to be deleted or added, do that directly.
- TableLevelGenerator: if a whole table to be deleted or added, do that directly.

Only **enabled** KeyLevelGenerator, to enable **TableLevelGenerator** we have to confirm with Renuka if it is possible to update a whole table at once in the `ChangeApplier` (instead of just keys like it is today). We have to be able to update a table as a whole because within the table there can be internal dependencies between the object, so we have to guarantee all objects are deleted together. For the keys it is guaranteed for the whole key to be updated at once according to the `ChangeApplier`.

**Why non-extendable generators?**
Calling the non-extendable generators precedes the extendable ones, it is like checking for the low hanging fruits. If we use the same extenders for these new generators we will always go up the config tree. Imaging a move that tries to update a key but fails, then we call the extenders on this move. What will happen is the extenders will go up the config tree to the table level, will first try to replace the table, then try to delete the table. Deleting the table is a problem because it affects multiple more than intended and thus violates the minimum disruption guarantee. We decided to leave the extenders only for the LowLevelGenerator thus making sure we try all possible moves from the lowest levels and go up from there.

Another way to look at it is like this:
- Non-extendable generators do top-down search: Check tables, keys in this order
- Extendable generators and extenders do bottom-up approach: Check fields, keys, tables in this order

#### How I did it
Modifying the `MoveWrapper.Generate` method to allow for different type of move generators

#### How to verify it
Unit-test

Please check `tests/generic_config_updater/files/patch_sorter_test_success.json` to see how the moved generated got much compacted.

#### Previous command output (if the output of a command-line utility has changed)

#### New command output (if the output of a command-line utility has changed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants