On 21 March 2025 7:18:46 am GMT+01:00, Saku Ytti via NANOG 
<[email protected]> wrote: 
>I think netconf and yang completely misunderstood what our problem is.
>Problem wasn't that as a programmer I couldn't work with MIB/ASN1, the
>problem was, MIB/ASN1 didn't have the coverage that I needed. Now we
>are in the same exact place, except instead of having poor coverage
>MIB we have poor coverage MIB and poor coverage YANG. So we pay more
>to be in the same position.
>
>Standard MIB and YANG are pipe dreams and the benefit is actually
>somewhat marginal.  It is not hard ask when you add a new vendor, that
>you punch 1:1 mapping to old vendor - new vendor OIDs/YANGs. It's all
>formal data, you just figure out keys from old to new, and your whole
>stack works. You could ask the vendor to provide this mapping as part
>of procurement.
>
>AFAIK the only vendor who had 100% coverage in MIB was Nokia, because
>their internal provisioning system used that API.
>
>Any vendor who did this correctly to begin with, had Internal
>Representation of state in some proprietary format. Which they then
>programmatically transform to Config ASCII, enterprise MIB/YANG, and
>those are not pretty, but they always could offer you 100% coverage.
>There is no way to transform the internal state into any standard
>representation, it will never be a thing because it cannot be. There
>the problem continues, because we keep asking for the wrong thing.

I have some experience with this. When I worked at Aviat several years ago, it 
was on a new generation of products that was built on some YANG-first (note: 
not NETCONF-first) hype. When we had to make some third-party code 
configurable, we translated it to a YANG model. For example we had a 
translation layer between YANG operations and sending control packets to the 
NTP daemon (as well as starting/stopping the NTP daemon and so on).

The CLI was completely built with a vendor product (ConfD by Tail-f - 
recommended, thought it has warts) upon annotated YANG models, so our YANG 
models were often designed based on how we thought the CLI should look, and 
this usually resulted in YANGs that were also pretty suitable for NETCONF use, 
though not always. Standard YANGs (not many existed at that time) rarely 
resulted in a good auto-generated CLI - so we rarely used them. Sometimes we 
had a request to support a particular standard YANG so we implemented it as 
well.

The web UI used the same YANGs as the CLI (but with more code in front) and the 
limited support for SNMP was also implemented as a mechanical MIB-to-YANG 
translation, followed by a handwritten YANG-to-YANG translation. (That worked 
okay but the performance wasn't ideal - especially certain SNMP GETNEXT 
requests in large tables could cause us to have to walk over the whole table, 
fetching one row at a time by RPC call, and then sorting it in this layer 
because the underlying table wasn't in SNMP-compatible order.

[That's a leaky abstraction, and probably if we went for an architecture with 
fewer abstraction layers, we could have kept the table indexed in both SNMP 
order and NETCONF order. After I left that job I've learned more about the 
pitfalls of layered architectures - they can seem great in principle, keeping 
concerns separate and so on, but they can easily prevent you from writing 
mechanically sympathetic code that actually runs well.])

Other issues with translating everything are edge cases where some data that 
looked consistent on the outer-facing model would violate a constraint 
internally and you'd get an incomprehensible error message back. Or it just 
silently fails - I don't remember exactly what happened if you tried to set an 
interface as half-duplex gigabit, but I remember there was a problem around 
this. It might have accepted but silently ignored all port configuration 
updates until you set it back to auto. The underlying component was sending an 
error code back, asynchronously, after the configuration has been accepted.

Another issue is when some outer-facing-layer operations are non-idempotent, 
non-commutative or non-reversible because some internal secondary object gets 
created whenever you're using a certain feature, for example. This could also 
confuse the transaction manager because it sees a client created something and 
deleted it, yet the data store is different from how it started. In most of 
these cases it makes no difference whether the internal edit gets reverted or 
committed, but it still causes weird transaction semantics.
# exit
Do you want to commit your changes? (commit/discard/cancel) cancel
# show config changes
No uncommitted changes.
#

You have to make sure each client doesn't see overlapping views of data, or it 
can write conflicting data simultaneously to different places because the 
transaction layer isn't aware of the translation going on (and I'm not sure how 
it would - you could set the entire configuration in a single Netconf 
operation). We had hacks so that <default-operation>replace wouldn't delete all 
the inner-facing models. (Were I the architect on a similar design, I'd at 
least consider running an entirely separate database process for each 
translation)

Conclusion: this was mostly just rambling because I suck at writing, but I 
think the conclusion is that while YANGs are cool and it would make sense for 
everything to be YANG, and you could build a system from scratch where 
everything was a YANG, I can't really blame other vendors for not fully 
integrating their existing systems with YANGs because it's hard.
_______________________________________________
NANOG mailing list 
https://lists.nanog.org/archives/list/[email protected]/message/YIHHJJX2N2JKMVEJN2DP6JYQV6KBHQKB/

Reply via email to