From c6595cda519f713f301f534cb525cca121750ae1 Mon Sep 17 00:00:00 2001 From: Damien Date: Thu, 5 Feb 2026 13:03:03 +0100 Subject: [PATCH] docs: replace ASCII architecture diagram with Excalidraw SVG Replace the text-based ASCII art representation of the system architecture with a linked Excalidraw SVG image. This improves visual clarity, readability, and maintainability of the architectural overview in the README. --- README.md | 56 +------------------ .../fabric-orchestration-archi.excalidraw.svg | 4 ++ 2 files changed, 5 insertions(+), 55 deletions(-) create mode 100644 docs/assets/architecture/fabric-orchestration-archi.excalidraw.svg diff --git a/README.md b/README.md index c98e624..ba59d4a 100644 --- a/README.md +++ b/README.md @@ -18,61 +18,7 @@ Think `terraform plan` and `terraform apply`, but for your network fabric β€” po ## πŸ—οΈ Architecture -``` -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ INTENT LAYER β”‚ -β”‚ β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ β”‚ This Git Repository β”‚ β”‚ -β”‚ β”‚ β”‚ β”‚ -β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ -β”‚ β”‚ β”‚ schemas/ β”‚ β”‚ data/ β”‚ β”‚ transforms/ β”‚ β”‚ β”‚ -β”‚ β”‚ β”‚ └─fabric.yml β”‚ β”‚ β”œβ”€devices.yml β”‚ β”‚ └─arista_config.j2 β”‚ β”‚ β”‚ -β”‚ β”‚ β”‚ (InfraHub β”‚ β”‚ β”œβ”€vlans.yml β”‚ β”‚ (Jinja2 templates) β”‚ β”‚ β”‚ -β”‚ β”‚ β”‚ schema) β”‚ β”‚ β”œβ”€bgp.yml β”‚ β”‚ β”‚ β”‚ β”‚ -β”‚ β”‚ β”‚ β”‚ β”‚ └─... β”‚ β”‚ β”‚ β”‚ β”‚ -β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ -β”‚ β”‚ β”‚ -β”‚ β–Ό β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ β”‚ InfraHub β”‚ β”‚ -β”‚ β”‚ (Runtime + GraphQL API) β”‚ β”‚ -β”‚ β”‚ Syncs schema & data from Git, exposes via GraphQL β”‚ β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ - β”‚ GraphQL / SDK - β–Ό -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ ORCHESTRATION LAYER (PREFECT) β”‚ -β”‚ β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ β”‚ Prefect Flows (Python) β”‚ β”‚ -β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ -β”‚ β”‚ β”‚ fabric_reconcile β”‚ β”‚ handle_drift β”‚ β”‚ drift_remediation β”‚ β”‚ β”‚ -β”‚ β”‚ β”‚ (plan/apply) β”‚ β”‚ (subscribe) β”‚ β”‚ (auto-fix) β”‚ β”‚ β”‚ -β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ -β”‚ β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ β”‚ Prefect Tasks (Python) β”‚ β”‚ -β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚ -β”‚ β”‚ β”‚ Intent Parser β”‚ β”‚ Diff Engine β”‚ β”‚ gNMI Client β”‚β”‚ β”‚ -β”‚ β”‚ β”‚ (InfraHubβ†’YANG) β”‚ β”‚ (Want vs Have) β”‚ β”‚ (pygnmi wrapper) β”‚β”‚ β”‚ -β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ gNMI Get/Set/Subscribe - β–Ό -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ DEVICE LAYER β”‚ -β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ -β”‚ β”‚ spine1 β”‚ β”‚ spine2 β”‚ β”‚ leaf1 β”‚ β”‚ leaf2 β”‚ ... β”‚ -β”‚ β”‚ gNMI:6030 β”‚ β”‚ gNMI:6030 β”‚ β”‚ gNMI:6030 β”‚ β”‚ gNMI:6030 β”‚ β”‚ -β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -``` +![architecture](docs/assets/architecture/fabric-orchestration-archi.excalidraw.svg) ## 🎯 Why InfraHub? diff --git a/docs/assets/architecture/fabric-orchestration-archi.excalidraw.svg b/docs/assets/architecture/fabric-orchestration-archi.excalidraw.svg new file mode 100644 index 0000000..baeccdb --- /dev/null +++ b/docs/assets/architecture/fabric-orchestration-archi.excalidraw.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1d6W7qWJf9X0+B8kmtKnXhOvNQP1rKSMg8T30/IVx1MDAwM4Y4XHUwMDAxm4CBkNKV+iH6XHT7SXqbJEw+JjbxvaFU5EpXic1wbK+119777LPPX7/kcmvBoOWs/Zlbc54rdsOttu3+2u/h8Z7T7ri+XHUwMDA3p8jw747fbVeGr7xcdTAwMGaCVufPP/5cdTAwMTi/w6r4zdd3OVxyp+l4QVx1MDAwN1733/B3LvfX8H8441bD9z50z9mDbO3nT4ovV63D552T4202fOvwRe+DaTuVwPbqXHJnfOpcdTAwMTmOXHUwMDBiSS2sKNdU8tGJQThEpixBhcRq4kTfrVx1MDAwNvdwUmNkXHQuyPjMvePW71x1MDAwMzjFObc41Wjy5Ov3/plDoyOdoO0/Opt+w2+Hg/tcdTAwMTd2wn/joZXtymO97Xe96ug1Qdv2Oi27XHL3Yvy6mttonFx1MDAwN4Php8P9hHu3NvNcdTAwMWTXb0MmM8fj3lx1MDAwNV9av/ecTmdqvH7LrrhBeF8wXHUwMDFhXHUwMDFmXHJH2CpWh4/m3+Mxte2mU1xmn43XbTRGh12v6oR3fM1GU9/mVd++berVXHUwMDFkx1x0P4FgLDiCWy1GZ8YowljNXHUwMDFlPfK9IaIwQVx1MDAxYTGM+fhcdTAwMTVuZ1x1MDAwYqBcdTAwMTRcZj+2Zjc6zvhmh4PYnoDZ+Fq6rar9+lx1MDAxNiwlXCKaSExcdTAwMTFcdTAwMWQ/2YbrPc5cdTAwMGW94VdcdTAwMWXH3zI8+v13XHUwMDEzcp18qVHoX+X1UfW50948vD7ZP1x1MDAwZqLIXHKc52BcdTAwMWG0XHUwMDE4XHRkUUpcdTAwMTDFZFx1MDAwNrVcdTAwMDJQO1x1MDAwYud31GKGLapcdTAwMTiVTL/+qCh8ibCklJRNvn+p4Vu1O/fOz8UvTodfxamMwS+Jwy8jSsBcdTAwMDNmZFx1MDAwMfhOjWNcdTAwMTbAWFx1MDAxMMCISlx1MDAwMeAxXHUwMDFlQ1x1MDAxY8L1XHUwMDE3vVx1MDAwML4pd2BcdTAwMGac9sSj9L3g3H1xhlx1MDAxN20xMmU3w5M7dtNthE9ATX3iesOthzdjreHUJpBcdTAwMDH3I3BBXGZGp1x1MDAwM781PluBz7Ndz2lHXHUwMDFmk992665nNy7mjtbuXHUwMDA2/pnTeVx1MDAxZG/Q7jqTN8TZfWdcdTAwMDO2XGKfQ+D9o9veS73sXFxcdTAwMTU2alx1MDAxN1x1MDAwN+LRL1x1MDAwN9xOLD1gSiyheYTDlFxuSyMyzcF3XHUwMDBlK4qtyTs7Ji5CllxmNemd3DJcdTAwMDV/SU07jP1T+EuS81x1MDAxN1x1MDAxM8yFRlQzXHUwMDAzfymL11x1MDAxZkS4hkcypn1cbvl5OzGG21x1MDAwNOSUPtsp+TvFVv9cZm9sXHUwMDFkXHUwMDE3+uuXjI6uZ1xudna77ffXRme+v/02R9ywXG7/ZSNuQbdP9sg1OTso3Z9cdTAwMTb29ktcdTAwMWKdYCs5N1x1MDAxOLeoxCjillFcdTAwMDWel8Zsyr96J1x1MDAwN6HcYoKpKeaMXHUwMDE4gom0uJzWzOWWNj9cYn4yNWhcbmpoQTXnXHUwMDAyI1x1MDAxMzWQjKNcdTAwMDZXWoGVXCKLUGOutFx1MDAxMZBaxFE28O3f7e067UqxdFu4cLqXXHUwMDBmNzvdvp9cdTAwMTi+8CQ02HA0XHUwMDEzXHUwMDA3vFx1MDAwMlx1MDAxOFtcdTAwMTibw4pcdTAwMTV+P4tfmVx1MDAwNr9cXIJMUqNrRllcdTAwMDTV7/jVXHUwMDFjYY3UXHUwMDA07LOJLLJE74l7sNd9zlx1MDAxZrSvXYTP9u+6lUa9lVx1MDAxY71cdTAwMDSCYvBcdTAwMTRcdTAwMTHmJvSuzO9cdTAwMGaDr0pcdTAwMDFfXGLTuFx1MDAxMlwiXHUwMDEyQoRPieBY60tcdGGIqEVcdTAwMDKLn4Xe0qnb8S6blFx1MDAwZXbxydYprvq8dJckLpaCWFqoXHUwMDE5l4Ehblx1MDAxOYJhxSyFwERTcPDgv1x0XHUwMDBmb1x1MDAwNFmBVkiNQep6XHUwMDFhpCqiJVPS5ENcdTAwMTNcdTAwMTRcdTAwMWJcdTAwMDNriGRcdTAwMDRcdTAwMDdj8/WOwlx1MDAxOHtvUWWncu807c5cdTAwMWbfvPBwzS633Yo1aDZe//616MFcctztlnOvr/vNXHUwMDE4JmMxdfSL4uOFrySbXHUwMDEw+uTwSlba2mt768dbjYPb/I3cKyfLgUEkzJDiUlx1MDAwMEooXHUwMDFkw2ioU1pZnFx0k5OFKbGA9yBuhCup9ESMNtYqtGJ+XHUwMDFj8zdSMVx1MDAxZjOlJ7OwXHUwMDEzXCKlaVx1MDAxY/Ox0Fx1MDAxMPtcdTAwMTG8WPicpUpFiFx1MDAwZlx1MDAxZmi/caXq9NyK01x1MDAxOZOl17C98V/lSmv8h2VZS2xcdTAwMDOyuKhszIGqdY61k69cXFx1MDAxZnXvd3a2W+Tp6MlLkVFcdTAwMTNgXHUwMDEyZjJng6GQI1x1MDAwYrBo8FlcdTAwMTXBlmbTSbixXHUwMDE5YMySsym6j+1BXHKpXG5C/1x1MDAxOHtQSJNO41x1MDAwMm6o5CZXXHUwMDAwWD/HIGDGicownWZUllx0JN6R8lWvc33jdE/7Z3e0urd5cXiRKptcdTAwMDbqg6ScpMHiLrF5NFx0ZFJjbEGgXHUwMDAwOslYmOBT07zg1MJiNtB751x1MDAwNlx1MDAwM4XFWoP3hmdeMWJcYlvpZCwvrlLwgoFQMq5MwVx1MDAxY5axqTRcIjDV8od4yFx1MDAxMkJ1klx1MDAwMrtcdTAwMTGh/PWs61x1MDAwNW7Tyf1nrtC2W/enXHUwMDA3ufWT4m/fvPOBV+m8uZO5/8iF2pOrtf1mruBcdTAwMDa/55znlt9xOrmea7+/L1x1MDAwYuGswFVPzv9EpLPpVquTcjKtnlx1MDAxZunSrKD+iIvPRmBcdTAwMWK7XHUwMDA3tWrx/vGidnvMmv7mI+36hmpcdIO/TUFDh1PHhEokXHUwMDEwn0lcZmlpkdmJ45HLraklwlhbXGIyk9NfxdpcdTAwMWZbks1cdTAwMTSGRFx1MDAxMY4lhtDHYEmYjI21MSOEUFx1MDAxOOuX54VcIoZk+CBrfrv5XHUwMDFlo9ptt1x1MDAxM9glYGjNrVtcdTAwMGbkLVLdc71cdTAwMDeb5Fx1MDAwMqfZasBcdTAwMTg6y1x1MDAxY3RncE3ZmFx1MDAwM3bm69LDQ+/yfOOG88HegdjeeklcdTAwMTZ+K1x1MDAwZZyeibGHPlx1MDAwNUZWjEOhTFx1MDAwNSerbHBcdTAwMWPvd1LwXHUwMDFliK9cdTAwMDSX2lx1MDAxNGmriDF4pz1cdTAwMDVzIdFkXHUwMDFk1d9jmpqCa/1cdTAwMTmbMsxq3XfLRlx1MDAxM0HQ1NEvq1uZXHUwMDFkYjaMv7aLhVx1MDAxZHu3fbt5eLzvPu5cdTAwMDetm9vdZIzn2sKUqEi9XG5TXHUwMDE2XHUwMDEzyFxccsZccmn1XHUwMDE15WMpX0xBeSAvOGOImKSeTGjurNRTjillnC9jXlx1MDAxZNzg3JlcdTAwMDNesFx1MDAxYvjtwVx1MDAxMtMzbqBcdTAwMTmlweaaz1x1MDAxOdM5zVJMpUVcdTAwMDW44oQpXHRcdTAwMDI9TrKGN4lTQ4bsnazIXHUwMDEyklx1MDAwMzAkUlRoNFlCNnbTiSVmjcAykFx1MDAxOM9cdTAwMWP/wvLmveRcdTAwMWNcdTAwMTZcZmvgTVSghzyNzY8rhZCWSGfPYIJcdTAwMTBjacqbR4dbvjvrXHUwMDE3jH/Lje/18I/R7//+3fzqWCSGP1x1MDAxM1x1MDAxOFx1MDAxY39QxG1cdTAwMDB/ulx1MDAxZGzAY3G9Olxma+ykvK8oKCao4YRXN/3qXHUwMDEwSH677E5mXG5cdTAwMDGcz071JLzsqatcdTAwMGVHz1H4WFx0PEKuOKJTo0dWWHSiIVx1MDAxZZZMYqqVjFxcxPfRRThe9eNLmO/EL3pcdJorXCJcdTAwMTT4hkogSaYuIY8sxuaMenjr10PjdO/YXHUwMDExpsA1TZ6btWJOo+z3XHUwMDEzJUXXTyvnQdk/X3/u+aXS1c6Jc7pTTzxZICSzXCLpiKGQaG7N1taPXHUwMDE2fiBpKTRcZnrQcFx1MDAxMjFqIZnk1uu84pKZyCVaXHUwMDAxsp/GzVx1MDAwMdPEw0UgXHUwMDA2XHUwMDFiSXFsoVx1MDAwYlZgNZTCXCLrOcQsV4Bs713e0+JcdTAwMTOveFx1MDAwZbHLXHUwMDFiir34retEaX2uLFx1MDAxNXXFNeZcdTAwMTaYXHUwMDE1YqwupFxmg1lcdTAwMDV0czQ9XHUwMDE3tlr8kVx1MDAwMrpcdTAwMDfJoauUpqGEXHUwMDE5S7RorIPOQ1x1MDAwN02QrDNxhEHE8Cnn/LhduXfgXHTYXHUwMDAxjPZ1RUXu15O2U1x1MDAwM1x1MDAwM2vOti3VSpCEw8/Gg+9cdTAwMWQ/3DZcdTAwMGb9jcJg56HQODu+9DerjVx1MDAxNFx1MDAxM9ncXHUwMDE4amtFLfAojKF27MpcdTAwMTDMhSV0mDZ5W/i1Wlx1MDAxOVx1MDAxMkfuw1x1MDAxNORcdTAwMGXnVKU2Jtr5PFlSUlOwXHRZ05syhlVGsnTG3MunfP+606pccmpnxe2LfP8qn1x1MDAxY7xMgI+koktqMVwiXHUwMDEwm6aue1fSmkSv1ing+8/KXHUwMDFlXHUwMDFkpanEkFxigihsniiKr8RQmIdVXHI063W1XHUwMDE0fFx1MDAxMpRcdTAwMTF8d/K9i8vioFxcXHUwMDE2XHUwMDFisiz2W0HzuZl8RThGXHUwMDE4W5TOevAjXHUwMDAwXHUwMDAzz2LK31x0XHUwMDFi1cZcdTAwMGaDXHUwMDAzasQyRO5cdTAwMTPL9FZYjsHycVxuLFx1MDAwYqpcdTAwMDTTxORncVx1MDAxZOtnQYhHJMTpmc95QsRcIiZcIsNPYbnyoG7rXHUwMDAz4j76zcLJzblXOlxu9neSY5lAMEo55dGVXHUwMDFjgGVlNsZwXFxcdTAwMTNcdTAwMWWGXGKz7sJcdTAwMTjGwkKMhKX2ry9cdTAwMTErXHUwMDE4x8D4JI1JhmdcIigyLkjiOLZcblxiU4bAKtPsbTLBTGa0XHUwMDFj1C/6crNzw697j7X1XHUwMDEy6ee3ulx1MDAwZoaMtmlNXHUwMDA3s5jBXHUwMDEyc/B2SUykXHUwMDBiNni4tlx1MDAwM4NPPJyiNsw7ryrXYjF7mlx1MDAxY7OAXHUwMDEwhsCLiE43rc1dRMckR1x1MDAwNGxS1slcdTAwMTlcIiVjaWoux1xifItcdTAwMTJfV0CUwKDCUN2G8837tdWwvdxcdTAwMWY5u9VqmKeklqOoJPHIs4lwXHUwMDBmelx1MDAwNc2v8Sap9+1Wu7TVYs9XxSSMxqC7lmJcdTAwMDJcdTAwMTlXbmDEuFx1MDAwNe5gzOJccsSHlWSYSjosSzUs3lgxO5bZZ8mZTVx0XHUwMDAzXHUwMDBmdtLRn1x1MDAxMCNcdTAwMTKp31x1MDAxZTtVKJyUXHUwMDE2mTtV4KcxRieRmpbZ97ZXbTilatutXHUwMDA1wI1Ot9yptN2ys8yFYlx0xpxccpvPjvrlm5uudlx1MDAxYbtPg73725vm+a1IWFx1MDAxN1xuSlx1MDAxY/qKxrpQoHNY+2muXHUwMDA3w0xcdTAwMGbZTDBcdTAwMTUh5VxynuaKzLFkvkxO5rBoXHUwMDE3PEjjXHUwMDFjipjXqoFw8KBcdTAwMTaqL59cdTAwMWbsU4xcdTAwMTeaZVx1MDAxZS3DXG5cdFx1MDAwMVLXdKruMJ9cdTAwMGLkXGKJkK+5z0tM52TDzobRV+X9x5vG5kN9+2FLn+JC8fj4Nlmld5hcdTAwMDCRSEa7i2lNrZm0yChqnGhVtSr0+pi818nJXHUwMDBiXHUwMDBlLWVTXHJTJjJ10fzdO3klhD9aZu9iU1x1MDAwNfKvJyGZlrxvcy65nYbf7+R+PVx1MDAxOVx1MDAwNPe+XHUwMDE3M4G0XHUwMDE0xV5cdTAwMWZccjhcdTAwMWLCXHUwMDFl3VR5XHUwMDEwXGboxuH+WaXUONwh+UolxZSRtCjVKrL2XHUwMDExYyEsXHUwMDE127RjNW30eTLfJiczZ+DGmlx1MDAxMpVCxFx1MDAwNsuYgGtcdTAwMDTPLvNSXHUwMDA2ypFONSU8XHUwMDA3vceV3W61RJ8vgsvdzePLbl50Tlx1MDAxMq1QhPuvLDHTXHUwMDEx6Vx1MDAxNbiKxEeCK8FJh9G75Fx1MDAxOMVcdTAwMThcdTAwMDRHhVx1MDAwNWBcdTAwMDac8jmrdMOaRFx1MDAwMVx1MDAwMUHWOGXggtJP9ax8t+BcdTAwMTd25/FvJTlxXHUwMDAzzqiBZeH4Jd9HtW1JXHUwMDA25+163zstNFMst1x1MDAxZi6Pn+2RPMQrwcSKKzNezfZmw2g7OaNcdFx1MDAwMtpcbq2MpUg82phnzGjwXHUwMDFiXGJhmbdRZiisNc5GeXaPXG6Npv3kcv+4QPR6885/3HBTTPeisCFcdTAwMWY3dI1cdTAwMTiieLb9w1xuxdmiuJxCl6SilFxuZmwkxVm8LoFcdTAwMDcsqMSZh0JcZlxiJUU2KO41nlx1MDAxZetCovOBf6h2X/a2aGWvmWaiV1g6bK1pRjGb7eCwgnG2MK4kh7HQXHUwMDA0lJOYbbGKr1x1MDAxY1x1MDAwM/NcdTAwMWROtS206mNcdTAwMWWKOfBqYmX4p1D8UvfYYWPgcnq6qTefcYnUJmv750zzRlBLjV37hLRImDGWTHBFTCU2S5YxXqKFSU5cblNLXHUwMDE5XHUwMDE23Dj5XHUwMDEzb2dcdTAwMTnDkjC2UJee+cuSmCA4VSudSFx1MDAwMPDaXHUwMDA23smd2O2O0/7mjVx1MDAxYtv93//873/lbtePXG6/5ZY4c5xy/NmEXHUwMDA3iJPzq+bupdrluzdicO8/bVx1MDAxZiZiM0aEQejOwzkh0DSlp9tcdTAwMGVcdTAwMDG5ITyI689H6JDiYO9A68NCpFx1MDAxNceTc7yWguNcdTAwMWODY4tVtFx1MDAwM+fa3K5DXHUwMDE4XHROOJNcdTAwMTOVdV/kTkVYvuXWarltXHUwMDBmmFx1MDAxM1Y/XFzbXpDrdXK7dm+pJ3lcdTAwMTONOlx1MDAxYkbbp0G/aZ/j5tVTY/1lfatcdTAwMTe0ereJXHUwMDE4TVx1MDAxMbdcdTAwMTRcdTAwMTaGUqyQzDpu/f/fr1x1MDAxMmuJyFxcT0FmXHUwMDFjLu/hjFx1MDAxYTvrkdjcsmJaQej7XHUwMDAzllx1MDAxMnNKNflcdTAwMTSb60eHxdxmw4WvXHUwMDBia5lcdTAwMDZ1r+nm+m271XLay8znhOPOSKOL5cHgbL2Wb+83+frO5dGGyCdv9S4gbKSzZZRD9DJcdFGjVNxcdTAwMWM2aqStmV2mJnai0dZrs8HXRbJjQi1cdTAwMDO9l2hcdTAwMTXsfVxueoM7JClcIuba4PhyLFx1MDAxY9bZIcHkQlr9dsLY4eei+qyexfbe9sPpzUvj4rn+7Fx1MDAxZfHRXHUwMDA1TWEvfYefcMEvSVPsNYcglVZQOFx1MDAxZNzWSp3zjaZwavmru+2DZE4sXHUwMDA0m+b0NtPYMi9cdTAwMTDHdPmnpZZI4dxcdTAwMTRcdTAwMTRQUlx1MDAxMiWVNFx1MDAwNaVzXHUwMDE0TtOwrH6hXHUwMDE2V/NcdTAwMDVOhonhz7mrw2bL83ZSW4q5KPMws5Gv7W5cdTAwMDdcdTAwMTGyXXnZ2bjtlUr5w9rp7WZi+ZJYW6ZCJcw5tuI278SCW+x1gYsp5algwEu4f2csab8g2fmQgrVEh81QzDVcdTAwMGZ4olg0UvNcdTAwMTDOyEix2DY7ZuH6qOXz0Vx1MDAwM3Ncbs1e6aTDTncu3P124awvU+pWSpMwh1x1MDAxOebRJNAtXHUwMDE4hEUh3tJSKrjvdCb3wiXAX8ctYtTiNV5DYeuX8Fx1MDAxMfx947WvIEaKns9cdTAwMWNcdTAwMDFmODPKmYhPvsCbhJST63aXR886LbD8+Js3XGaAwspiioyy9pObN3+gMZFcdTAwMWRR5l1FNqpHa7pRPGSX195DvlGzn0uDQ9VOrHpcdTAwMWEzS0dcdTAwMTa/jXRPRCazV8qXXHUwMDE1wb3k/CZcYjxcdTAwMTOlzO1cdTAwMTmjR8fZVUyV1nSh9oxcdTAwMGJcbt+JW5d3+iko7F8/b1x1MDAxNIu7XHUwMDA3XHUwMDBmteLjl1x0n3k0XHSETzNtgbtBkcRcXJuFL6430kr2hkdcdTAwMTdlRVxu2WNcdTAwMWFxXHUwMDAx0mfKU4p4d5BrXHUwMDAxcdxiuy7+XHUwMDE02SNLJ3tcdTAwMWaIjFH24q5cIlx1MDAxYtl72L/e7z1eXHUwMDFkVtB5qVh5dO1g48CwZDSuxlx1MDAwNZ6/pZEybHv/qntcdTAwMTFpW+leVlxm95NcdTAwMTNcXDElw5puY78+XHUwMDE0W95CkOCKXCIqXHUwMDE2Wji6mO5x75nerfNcdTAwMTdcdTAwMWK/XHUwMDFjX95Went7u032ZbpnXHUwMDFlTVx1MDAwMt3DmFGLXHUwMDEwoIdiKE744upcdTAwMThXyjc8uigv0lx1MDAwNHxaXHUwMDEySamxVUI0rz9q0U9cdTAwMDRcdTAwMTg3/Fx1MDAwMyboPi98XHLHri1fuPeByszq3ryLyEb2qndPqlx1MDAxMLyU8/m+fum1u+t74lQnlz06XFyOaSztXGZlj+vZXZVXspdcdTAwMTW9W8nZjVx1MDAxNVx1MDAwYieMhNGxpXNcdTAwMTI6NGyDgvDP3NvOed7v4bNjXutcdGdfii2vfe5cdTAwMDRfpnvm0STRPcqEhSCgXHUwMDBi+4jE6Vx1MDAxZYTa5lx1MDAxOeyV7uU+QYxcdTAwMTS6XHUwMDA3gCFYxuhe/Mw1+Iph0f5SJjpDzVi+gO9cdTAwMDOdMVx034+N9/Dx7nXlqbSt78/0w8PNTWdbb1x1MDAxOFY0XHUwMDFimM3D+lFcdTAwMTFtWsc1xHmKmjvgUkM1+ErcYjn8lKb8XHUwMDA0YjpcdTAwMGXuRrqC8LAxIyHgvS6j81x1MDAxYbcl83LMuf+AvZX79m3D3jrsnJS3WSv/8ujzvf5+lI3GTWVcdTAwMTCzOFGEXHUwMDEzXHUwMDEx7iU7w0qFlfXqSKKZTVx1MDAxMUaeqIUwIYhcdMQhmlHE1OlHaCvcXHUwMDAzNeVey/+oapkgOWNcdTAwMTlcdTAwMDSbglxuc1x1MDAxNkbF5lnDhsBcdTAwMWMz9Vx1MDAxM5MwlfW7W3Xe3L1Yd06d4ICe3O2cbKVzRiFCXCJcdTAwMGItXHUwMDBmz3TTmniQhz9cdTAwMTPwXHUwMDFlf1Dk2mY2rZndNyXmzE/ab8X8pJLIOVx1MDAxMmCbXHUwMDE44uCnK87lhNc3tFx1MDAxZlRb8n1XKrP9wGFcdTAwMTNQOCOkYkJIU09a8jfx1r/AbKTaiVpLhjU3TlviWLtcdTAwMDHWhmItfsDSL0lcdTAwMTRTn+r7975cdTAwMDPzXHUwMDFmufOt/WXw0z9cdTAwMTDiyFZz5vFn41x1MDAxNMwv453vXHUwMDE0YGRcdTAwMTHMXGZpKVx1MDAxYVaVx1TfIYjYmaBcdTAwMWG0KXyJwGSie/Q4OcUt+PzVPnPzaN1NwWqO4IZcdTAwMTNudFx1MDAwN1xiiqW10ooqJORC7Vx1MDAxZlx1MDAxNnNcdTAwMDd21qs9dn3RXHUwMDBmzmnLO7bZXX37yv+xxeM/xlx1MDAxZJhcdTAwMDf08GdcdTAwMTLiWXhcdTAwMDRxu8PNXyCSW2x3OCYlQVx1MDAxOGtcdTAwMTVuzEUnmsyZT0eu76fvXHUwMDE1Z4ZVXCLfXHUwMDA1vFx1MDAxM6GQ1ExcdFx1MDAwMn+MKfRq63TYzDgyK71aXHUwMDAwl4mJS+G5hFx1MDAxYptcdIyNKVxuXHUwMDEyn6JcdTAwMDBnh3HCXHUwMDE22o/nXHUwMDAzz4VRhNL0VYh4LsPUXFzBXHRC6Vx1MDAwZv//5p2/N1x1MDAwMF5cdTAwMDY/5lx1MDAwM9/BuCxu4mpyhotJ7dT88mYr1+xW6zyAXHUwMDA3MLKEaz3X6W9E2fGv2vAnlJShqVximeGET/Ov7798/389cHtcdTAwMDEifQ==Intent Layerschemas/ fabric.yml (InfraHub schema)data/ devices.yml vlan.yml bcp.yml ...(Runtime + GraphQL API)Syncs schema & data from Git, exposes via GraphQLtransforms/ arista_config.j2 (Jinja2 templates)InfrahubGit RepositoryOrchestration Layer (Prefect)fabric_reconcile(plan / applyhandle_drift(subscribe)drift_remediation(auto-fixPrefect Flows (Python)Prefect Tasks (Python)Intente Parser(InfraHub β€”> YANG) Diff Engine(Want vs Have)gNMI Client(pygnmi wrapper)Device Layerspine1gNMI : 6030spine2gNMI : 6030leaf1gNMI : 6030leaf2gNMI : 6030...GraphQL / SDKgNMI Get / Set /Subscribe \ No newline at end of file