From: Herbert Wolverson <herberticus@gmail.com>
Cc: libreqos <libreqos@lists.bufferbloat.net>
Subject: Re: [LibreQoS] Integration system, aka fun with graph theory
Date: Fri, 28 Oct 2022 14:54:53 -0500 [thread overview]
Message-ID: <CA+erpM7yUq5qdY46_ZmoVhtkR==Nfr228dzkfMposD7QtuNcow@mail.gmail.com> (raw)
In-Reply-To: <CAOZyJospLVrJ68Hqs_7JmrK7rn6NenhT_hOe4VNYdy1d1ezJww@mail.gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 10246 bytes --]
One more update, and I'm going to sleep until "pick up daughter" time. :-)
The tree at
https://github.com/thebracket/LibreQoS/tree/integration-common-graph can
now build a network.json, ShapedDevices.csv, and
integrationUISPBandwidth.csv and follows pretty much the same logic as the
previous importer - other than using data links to build the hierarchy and
letting (requiring, currently) you specify the root node. It's handling our
bizarre UISP setup pretty well now - so if anyone wants to test it (I
recommend just running integrationUISP.py and checking the output rather
than throwing it into production), I'd appreciate any feedback.
Still on my list: handling the Mikrotik IPv6 connections, and exceptionCPE
and site exclusion.
If you want the pretty graphics, you need to "pip install graphviz" and
"sudo apt install graphviz". It *should* detect that these aren't present
and not try to draw pictures, otherwise.
On Fri, Oct 28, 2022 at 2:06 PM Robert Chacón <
robert.chacon@jackrabbitwireless.com> wrote:
> Wow. This is very nicely done. Awesome work!
>
> On Fri, Oct 28, 2022 at 11:44 AM Herbert Wolverson via LibreQoS <
> libreqos@lists.bufferbloat.net> wrote:
>
>> The integration is coming along nicely. Some progress updates:
>>
>> - You can specify a variable in ispConfig.py named "uispSite". This
>> sets where in the topology you want the tree to start. This has two
>> purposes:
>> - It's hard to be psychic and know for sure where the shaper is in
>> the network.
>> - You could run multiple shapers at different egress points, with
>> failover - and rebuild the entire topology from the point of view of a
>> network node.
>> - "Child node with children" are now automatically converted into a
>> "(Generated Site) name" site, and their children rearranged. This:
>> - Allows you to set the "site" bandwidth independently of the
>> client site bandwidth.
>> - Makes for easier trees, because we're inserting the site that
>> really should be there.
>> - Network.json generation (not the shaped devices file yet) is
>> automatically generated from a tree, once PrepareTree() and
>> createNetworkJson() are called.
>> - There's a unit test that generates the network.example.json file
>> and compares it with the original to ensure that they match.
>> - Unit test coverage hits every function in the graph system, now.
>>
>> I'm liking this setup. With the non-vendor-specific logic contained
>> inside the NetworkGraph type, the actual UISP code to generate the example
>> tree is down to 65
>> lines of code, including comments. That'll grow a bit as I re-insert some
>> automatic speed limit determination, AP/Site speed overrides (
>> i.e. the integrationUISPbandwidths.csv file). Still pretty clean.
>>
>> Creating the network.example.json file only requires:
>> from integrationCommon import NetworkGraph, NetworkNode, NodeType
>> import json
>> net = NetworkGraph()
>> net.addRawNode(NetworkNode("Site_1", "Site_1", "", NodeType.site,
>> 1000, 1000))
>> net.addRawNode(NetworkNode("Site_2", "Site_2", "", NodeType.site,
>> 500, 500))
>> net.addRawNode(NetworkNode("AP_A", "AP_A", "Site_1", NodeType.ap,
>> 500, 500))
>> net.addRawNode(NetworkNode("Site_3", "Site_3", "Site_1", NodeType
>> .site, 500, 500))
>> net.addRawNode(NetworkNode("PoP_5", "PoP_5", "Site_3", NodeType.
>> site, 200, 200))
>> net.addRawNode(NetworkNode("AP_9", "AP_9", "PoP_5", NodeType.ap,
>> 120, 120))
>> net.addRawNode(NetworkNode("PoP_6", "PoP_6", "PoP_5", NodeType.
>> site, 60, 60))
>> net.addRawNode(NetworkNode("AP_11", "AP_11", "PoP_6", NodeType.ap,
>> 30, 30))
>> net.addRawNode(NetworkNode("PoP_1", "PoP_1", "Site_2", NodeType.
>> site, 200, 200))
>> net.addRawNode(NetworkNode("AP_7", "AP_7", "PoP_1", NodeType.ap,
>> 100, 100))
>> net.addRawNode(NetworkNode("AP_1", "AP_1", "Site_2", NodeType.ap,
>> 150, 150))
>> net.prepareTree()
>> net.createNetworkJson()
>>
>> (The id and name fields are duplicated right now, I'm using readable
>> names to keep me sane. The third string is the parent, and the last two
>> numbers are bandwidth limits)
>> The nice, readable format being:
>> NetworkNode(id="Site_1", displayName="Site_1", parentId="", type=NodeType
>> .site, download=1000, upload=1000)
>>
>> That in turns gives you the example network:
>> [image: image.png]
>>
>>
>> On Fri, Oct 28, 2022 at 7:40 AM Herbert Wolverson <herberticus@gmail.com>
>> wrote:
>>
>>> Dave: I love those Gource animations! Game development is my other
>>> hobby, I could easily get lost for weeks tweaking the shaders to make the
>>> glow "just right". :-)
>>>
>>> Dan: Discovery would be nice, but I don't think we're ready to look in
>>> that direction yet. I'm trying to build a "common grammar" to make it
>>> easier to express network layout from integrations; that would be another
>>> form/layer of integration and a lot easier to work with once there's a
>>> solid foundation. Preseem does some of this (admittedly over-eagerly;
>>> nothing needs to query SNMP that often!), and the SNMP route is quite
>>> remarkably convoluted. Their support turned on a few "extra" modules to
>>> deal with things like PMP450 clients that change MAC when you put them in
>>> bridge mode vs NAT mode (and report the bridge mode CPE in some places
>>> either way), Elevate CPEs that almost but not quite make sense. Robert's
>>> code has the beginnings of some of this, scanning Mikrotik routers for IPv6
>>> allocations by MAC (this is also the hardest part for me to test, since I
>>> don't have any v6 to test, currently).
>>>
>>> We tend to use UISP as the "source of truth" and treat it like a
>>> database for a ton of external tools (mostly ones we've created).
>>>
>>> On Thu, Oct 27, 2022 at 7:27 PM dan <dandenson@gmail.com> wrote:
>>>
>>>> we're pretty similar in that we've made UISP a mess. Multiple paths to
>>>> a pop. multiple pops on the network. failover between pops. Lots of
>>>> 'other' devices. handing out /29 etc to customers.
>>>>
>>>> Some sort of discovery would be nice. Ideally though, pulling
>>>> something from SNMP or router APIs etc to build the paths, but having a
>>>> 'network elements' list with each of the links described. ie, backhaul 12
>>>> has MACs ..01 and ...02 at 300x100 and then build the topology around that
>>>> from discovery.
>>>>
>>>> I've also thought about doing routine trace routes or watching TTLs or
>>>> something like that to get some indication that topology has changed and
>>>> then do another discovery and potential tree rebuild.
>>>>
>>>> On Thu, Oct 27, 2022 at 3:48 PM Robert Chacón via LibreQoS <
>>>> libreqos@lists.bufferbloat.net> wrote:
>>>>
>>>>> This is awesome! Way to go here. Thank you for contributing this.
>>>>> Being able to map out these complex integrations will help ISPs a ton,
>>>>> and I really like that it is sharing common features between the Splynx and
>>>>> UISP integrations.
>>>>>
>>>>> Thanks,
>>>>> Robert
>>>>>
>>>>> On Thu, Oct 27, 2022 at 3:33 PM Herbert Wolverson via LibreQoS <
>>>>> libreqos@lists.bufferbloat.net> wrote:
>>>>>
>>>>>> So I've been doing some work on getting UISP integration (and
>>>>>> integrations in general) to work a bit more smoothly.
>>>>>>
>>>>>> I started by implementing a graph structure that mirrors both the
>>>>>> networks and sites system. It's not done yet, but the basics are coming
>>>>>> together nicely. You can see my progress so far at:
>>>>>> https://github.com/thebracket/LibreQoS/tree/integration-common-graph
>>>>>>
>>>>>> Our UISP instance is a *great* testcase for torturing the system. I
>>>>>> even found a case of UISP somehow auto-generating a circular portion of the
>>>>>> tree. We have:
>>>>>>
>>>>>> - Non Ubiquiti devices as "other devices"
>>>>>> - Sections that need shaping by subnet (e.g. "all of
>>>>>> 192.168.1.0/24 shared 100 mbit")
>>>>>> - Bridge mode devices using Option 82 to always allocate the same
>>>>>> IP, with a "service IP" entry
>>>>>> - Various bits of infrastructure mapped
>>>>>> - Sites that go to client sites, which go to other client sites
>>>>>>
>>>>>> In other words, over the years we've unleashed a bit of a monster.
>>>>>> Cleaning it up is a useful talk, but I wanted the integration to be able to
>>>>>> handle pathological cases like us!
>>>>>>
>>>>>> So I fed our network into the current graph generator, and used
>>>>>> graphviz to spit out a directed graph:
>>>>>> [image: image.png]
>>>>>> That doesn't include client sites! Legend:
>>>>>>
>>>>>>
>>>>>> - Green = the root site.
>>>>>> - Red = a site
>>>>>> - Blue = an access point
>>>>>> - Magenta = a client site that has children
>>>>>>
>>>>>> So the part in "common" is designed heavily to reduce repetition.
>>>>>> When it's done, you should be able to feed in sites, APs, clients, devices,
>>>>>> etc. in a pretty flexible manner. Given how much code is shared between the
>>>>>> UISP and Splynx integration code, I'm pretty sure both will be cut to a
>>>>>> tiny fraction of the total code. :-)
>>>>>>
>>>>>> I can't post the full tree, it's full of client names.
>>>>>> _______________________________________________
>>>>>> LibreQoS mailing list
>>>>>> LibreQoS@lists.bufferbloat.net
>>>>>> https://lists.bufferbloat.net/listinfo/libreqos
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Robert Chacón
>>>>> CEO | JackRabbit Wireless LLC <http://jackrabbitwireless.com>
>>>>> _______________________________________________
>>>>> LibreQoS mailing list
>>>>> LibreQoS@lists.bufferbloat.net
>>>>> https://lists.bufferbloat.net/listinfo/libreqos
>>>>>
>>>> _______________________________________________
>> LibreQoS mailing list
>> LibreQoS@lists.bufferbloat.net
>> https://lists.bufferbloat.net/listinfo/libreqos
>>
>
>
> --
> Robert Chacón
> CEO | JackRabbit Wireless LLC <http://jackrabbitwireless.com>
> Dev | LibreQoS.io
>
>
[-- Attachment #1.2: Type: text/html, Size: 26755 bytes --]
[-- Attachment #2: image.png --]
[-- Type: image/png, Size: 573568 bytes --]
[-- Attachment #3: image.png --]
[-- Type: image/png, Size: 115596 bytes --]
next prev parent reply other threads:[~2022-10-28 19:55 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-27 21:33 Herbert Wolverson
2022-10-27 21:41 ` Dave Taht
2022-10-27 21:44 ` Dave Taht
2022-10-27 21:48 ` Robert Chacón
2022-10-28 0:27 ` dan
2022-10-28 12:40 ` Herbert Wolverson
2022-10-28 17:43 ` Herbert Wolverson
2022-10-28 19:05 ` Robert Chacón
2022-10-28 19:54 ` Herbert Wolverson [this message]
2022-10-28 21:15 ` Robert Chacón
2022-10-29 15:57 ` Herbert Wolverson
2022-10-29 19:05 ` Robert Chacón
2022-10-29 19:43 ` Dave Taht
2022-10-30 1:45 ` Herbert Wolverson
2022-10-31 0:15 ` Dave Taht
2022-10-31 1:15 ` Robert Chacón
2022-10-31 1:26 ` Herbert Wolverson
2022-10-31 1:36 ` Herbert Wolverson
2022-10-31 1:46 ` Herbert Wolverson
2022-10-31 2:21 ` Dave Taht
2022-10-31 3:26 ` Robert Chacón
2022-10-31 14:47 ` [LibreQoS] metaverse-ready metrics Dave Taht
2022-10-31 14:50 ` Dave Taht
2022-10-31 15:56 ` [LibreQoS] Integration system, aka fun with graph theory dan
2022-10-31 21:19 ` Herbert Wolverson
2022-10-31 21:54 ` Dave Taht
2022-10-31 21:57 ` Robert Chacón
2022-10-31 23:31 ` dan
2022-10-31 23:45 ` Dave Taht
2022-11-01 3:31 ` Dave Taht
2022-11-01 13:38 ` Herbert Wolverson
2022-10-29 19:18 ` Dave Taht
2022-10-30 1:10 ` Herbert Wolverson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://lists.bufferbloat.net/postorius/lists/libreqos.lists.bufferbloat.net/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CA+erpM7yUq5qdY46_ZmoVhtkR==Nfr228dzkfMposD7QtuNcow@mail.gmail.com' \
--to=herberticus@gmail.com \
--cc=libreqos@lists.bufferbloat.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox