Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-20 Thread Andy Bierman
On Mon, Dec 20, 2021 at 1:53 PM Christian Hopps  wrote:

>
>
> > On Dec 18, 2021, at 11:33 AM, Andy Bierman  wrote:
> >
> > Thank you for caring about backward compatibility and stability.
> >
>
> I guess I left as implicit in my question of whether we could do something
> to fix it, that that "could" implied a fix wouldn't break things. I
> certainly care about stability and backward compatibility.
>
>

good point.

Sometimes we forget that changing the RFCs is the easy part.
People that don't even know this mailing list exists have to learn and
implement the changes.
Then the operator community has to deal with tool incompatibilities for
years to come.

The "industry" expects stability from YANG at this point.
They are focused on implementing and deploying YANG models.
The foundation is good enough. Not perfect. Nobody is expecting that.

Thanks,
> Chris.



Andy
___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-20 Thread Christian Hopps



> On Dec 18, 2021, at 11:33 AM, Andy Bierman  wrote:
> 
> Thank you for caring about backward compatibility and stability.
> 

I guess I left as implicit in my question of whether we could do something to 
fix it, that that "could" implied a fix wouldn't break things. I certainly care 
about stability and backward compatibility.

Thanks,
Chris.
___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-19 Thread Ladislav Lhotka
Carsten Bormann  writes:

> On 18. Dec 2021, at 19:04, Ladislav Lhotka  wrote:
>> 
>>'foo: null'?  Doesn't that make testing for empty values a major
>>pain?  'if (foo)' would not work.
>
> Same with »false«, which 7951 is not escaping into an array.  This
> argument simply doesn’t hold water.  As was mentioned, you would
> check »”foo” in o«, which works for null, false, and all other
> values that may happen to be falsy(*) in the platform.

The whole story is that Phil wanted to have both empty and boolean values as 
JSON strings. The result was a compromise, and I thought that [null] was a much 
better choice because, unlike "null" string, it cannot otherwise appear as a 
valid value of a YANG leaf.

>
>>JSON evolved from Javascript, so it must keep the javascript
>>meanings for these keywords.
>
> That is a common misconception that must be stamped out, but we have
> j...@ietf.org for that discussion.

It's not that I am defending these views. I did argue with RFC 4627, but not 
too hard, as this seemed like a marginal issue at that time - much more 
fundamental objections against the JSON representation were raised back then.

>
>> It is indeed true that tests in JavaScript cannot really distinguish between 
>> a non-existent member and member with the value of 'null'. I remember I 
>> wasn't happy about this change but I thought it wasn't a big deal.
>
> As mentioned, they can.
> And, yes, this little unnecessary complexity is not a big deal even if it is 
> based on mistaken beliefs; every non-trivial protocol has some unburied 
> zombies in the basement.

Right, in hindsight it was a mistake. It is also worth noting that [null] is 
only an on-the-wire value, so e.g. None can be used internally in Python. I 
have written a lot of related running code and don't find it a serious problem. 
 

Lada

>
> Grüße, Carsten
>
> (*) falsy: converted to false when implicitly coerced to a Boolean (Ant.: 
> truthy)
>

-- 
Ladislav Lhotka
Head, CZ.NIC Labs
PGP Key ID: 0xB8F92B08A9F76C67

___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Carsten Bormann
On 18. Dec 2021, at 19:04, Ladislav Lhotka  wrote:
> 
>'foo: null'?  Doesn't that make testing for empty values a major
>pain?  'if (foo)' would not work.

Same with »false«, which 7951 is not escaping into an array.
This argument simply doesn’t hold water.
As was mentioned, you would check »”foo” in o«, which works for null, false, 
and all other values that may happen to be falsy(*) in the platform.

>JSON evolved from Javascript, so it must keep the javascript
>meanings for these keywords.

That is a common misconception that must be stamped out, but we have 
j...@ietf.org for that discussion.

> It is indeed true that tests in JavaScript cannot really distinguish between 
> a non-existent member and member with the value of 'null'. I remember I 
> wasn't happy about this change but I thought it wasn't a big deal.

As mentioned, they can.
And, yes, this little unnecessary complexity is not a big deal even if it is 
based on mistaken beliefs; every non-trivial protocol has some unburied zombies 
in the basement.

Grüße, Carsten

(*) falsy: converted to false when implicitly coerced to a Boolean (Ant.: 
truthy)

___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Ladislav Lhotka
Christian Hopps  writes:

>> On Dec 18, 2021, at 7:59 AM, Carsten Bormann  wrote:
>> 
>> On 2021-12-18, at 09:20, Eliot Lear  wrote:
>>> 
>>> Still it seems like the right thing to do, in order to fall into line with 
>>> the target language spec.
>> 
>> But that’s not what YANG was designed for.
>> YANG is a data modeling language, which incidentally has a couple of 
>> representation formats (YANG-XML, YANG-JSON, YANG-CBOR).
>> There is no intention for the YANG generic data model (the set of all data 
>> models YANG can express) to cover the generic data model of the 
>> representation format.
>
> To be clear, the question I raised is about an encoding of YANG modeled data. 
> In particular the JSON encoding of the YANG empty leaf element.
>
>   https://datatracker.ietf.org/doc/html/rfc7951#section-6.9
>
> the justification for having the very odd encoding was that there was some 
> belief that some programming languages might have trouble with the obvious 
> JSON "null" encoding (which stands for "no value" in JSON -- exactly what we 
> want here). An old email gave a python example to try and illustrate this, 
> except the python example was an incorrect use of python for this case 
> (presence check) and not a problem with the natural JSON encoding for no 
> value items. In fact correctly written python code has no problem at all with 
> the more natural "null" encoding, and results in the correct internal 
> representation in python to boot.
>
> This isn't about the YANG specification in general, or making YANG
> conform to any particular language. It's just about the a choice in
> the specification for the encoding of YANG in a particular format
> (JSON).

The original proposal (even before my individual draft appeared in the NETMOD 
WG) was actually just "null". We'd been discussing it back in March 2012 in a 
smaller group (Andy, Jürgen, Martin, Phil Shafer and myself), and Phil objected 
to this encoding of empty values. His arguments were, for example:

'foo: null'?  Doesn't that make testing for empty values a major
pain?  'if (foo)' would not work.

JSON evolved from Javascript, so it must keep the javascript
meanings for these keywords.

It is indeed true that tests in JavaScript cannot really distinguish between a 
non-existent member and member with the value of 'null'. I remember I wasn't 
happy about this change but I thought it wasn't a big deal.

Lada

>
> Thanks,
> Chris.
>
>
>
>> 
>> While RFC 8791 (and before it RFC 8040) extended YANG to be able to describe 
>> data in flight, there is no intention that YANG can be used to describe the 
>> entire expressibility of the representation format.  We have Relax-NG, CDDL, 
>> and a few other modeling approaches if we need that.
>
>> Grüße, Carsten
>> 
>

-- 
Ladislav Lhotka
Head, CZ.NIC Labs
PGP Key ID: 0xB8F92B08A9F76C67

___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Andy Bierman
On Sat, Dec 18, 2021 at 6:14 AM Carsten Bormann  wrote:

> On 2021-12-18, at 14:35, Christian Hopps  wrote:
> >
> > This isn't about the YANG specification in general, or making YANG
> conform to any particular language. It's just about the a choice in the
> specification for the encoding of YANG in a particular format (JSON).
>
> I understand the objective to have a good representation for YANG data.
>
> For instance, in YANG-CBOR, a YANG empty is represented as a CBOR null
> (0xf6, in case you need to visualize the bits); there is no expectation
> that this will be difficult to handle by CBOR implementations.
>
> However, there is nothing wrong with representing empty with the array
> »[null]« in YANG-JSON.  It is just more complex, and apparently
> unnecessarily so.
> Whether removing this complexity to save two characters is worth doing an
> incompatible upgrade to the YANG-JSON representation format can be debated.
> I’d say: emphatically no.
>
>
Thank you for caring about backward compatibility and stability.

The other motivation that came up in this thread is that it is natural to
> have null as a value in JSON and YANG cannot describe such formats via
> YANG-JSON.  This was what I was reacting to, but, as you say, that wasn’t
> your question.
>
> Grüße, Carsten
>
>
Andy


> ___
> netmod mailing list
> netmod@ietf.org
> https://www.ietf.org/mailman/listinfo/netmod
>
___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Christian Hopps


> On Dec 18, 2021, at 7:59 AM, Carsten Bormann  wrote:
> 
> On 2021-12-18, at 09:20, Eliot Lear  wrote:
>> 
>> Still it seems like the right thing to do, in order to fall into line with 
>> the target language spec.
> 
> But that’s not what YANG was designed for.
> YANG is a data modeling language, which incidentally has a couple of 
> representation formats (YANG-XML, YANG-JSON, YANG-CBOR).
> There is no intention for the YANG generic data model (the set of all data 
> models YANG can express) to cover the generic data model of the 
> representation format.

To be clear, the question I raised is about an encoding of YANG modeled data. 
In particular the JSON encoding of the YANG empty leaf element.

  https://datatracker.ietf.org/doc/html/rfc7951#section-6.9

the justification for having the very odd encoding was that there was some 
belief that some programming languages might have trouble with the obvious JSON 
"null" encoding (which stands for "no value" in JSON -- exactly what we want 
here). An old email gave a python example to try and illustrate this, except 
the python example was an incorrect use of python for this case (presence 
check) and not a problem with the natural JSON encoding for no value items. In 
fact correctly written python code has no problem at all with the more natural 
"null" encoding, and results in the correct internal representation in python 
to boot.

This isn't about the YANG specification in general, or making YANG conform to 
any particular language. It's just about the a choice in the specification for 
the encoding of YANG in a particular format (JSON).

Thanks,
Chris.



> 
> While RFC 8791 (and before it RFC 8040) extended YANG to be able to describe 
> data in flight, there is no intention that YANG can be used to describe the 
> entire expressibility of the representation format.  We have Relax-NG, CDDL, 
> and a few other modeling approaches if we need that.

> Grüße, Carsten
> 

___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Carsten Bormann
On 2021-12-18, at 09:20, Eliot Lear  wrote:
> 
> Still it seems like the right thing to do, in order to fall into line with 
> the target language spec.

But that’s not what YANG was designed for.
YANG is a data modeling language, which incidentally has a couple of 
representation formats (YANG-XML, YANG-JSON, YANG-CBOR).
There is no intention for the YANG generic data model (the set of all data 
models YANG can express) to cover the generic data model of the representation 
format.

While RFC 8791 (and before it RFC 8040) extended YANG to be able to describe 
data in flight, there is no intention that YANG can be used to describe the 
entire expressibility of the representation format.  We have Relax-NG, CDDL, 
and a few other modeling approaches if we need that.

Grüße, Carsten

___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Eliot Lear
Just following this up, I see in my own work it occurs a little bit, so 
it is out there.  It doesn't create ambiguities, tho, because it is used 
in null-valued leafs.  It just creates syntax breakage.  Some parsers 
will have a problem with recognizing a naked null as valid.  On the 
other hand, in the case of MUD, we separately added versioning into the 
model, so we could bump this if the serialization updates.


On 18.12.21 09:20, Eliot Lear wrote:


Possibly.  The issue with fixing it is that it would create an 
ambiguity between null and [  null ].  I am not sure how often [ null 
] would not have that semantic equivalence in earlier work.  This is 
further complicated by a lack of self-descriptive versioning in YANG 
serializations.


Still it seems like the right thing to do, in order to fall into line 
with the target language spec.


Eliot

On 18.12.21 07:47, Christian Hopps wrote:

Hi,

I was just going over json encoding of YANG, and got to the empty 
leaf encoding and it's odd use of "[null]" rather than just "null". I 
read the explanation, but had a hard time believing what it said. So, 
running code time. The first thing I tried was Python to see if 
something weird happened:


In [1]: import json
In [2]: json.loads('{"foo": null}')
Out[2]: {'foo': None}

Nope, seems fine. Then checked the "definitive source" for json, 
javascript:


js> JSON.parse("{\"foo\": 1, \"bar\": null}")
({foo:1, bar:null})


Seems fine here too..

So I went searching the mailing list and found this:


On Jun 29, 2015, at 5:49 AM, Ladislav Lhotka  wrote:
Juergen Schoenwaelder  writes:

...

- I am not sure I understand the argument why [null] is better than
 null for the empty type. Perhaps it is but the text does not
really
 tell me.


"foo": null

may sometimes appear as if the "foo" instance is not present at
all - in
some languages this is probably more serious than in others.
This is how
it works in Python:


import json
obj = json.loads('{"foo": null, "bar": [null]}')
"YES" if obj["foo"] else "NO"

'NO'

"YES" if obj["bar"] else "NO"

'YES'

So the special value "[null]" seems safer and it cannot appear
in any
other context.


The justifying example here is, unfortunately, wrong. One does not 
(normally) check for the presence of a dictionary item in python by 
trying to access the value of that item (which is what the code above 
is doing). The standard python code to check for the presence of an 
item is as follows, and it works fine with a "null" json value:


In [1]: import json
In [2]: o = json.loads('{"foo": null}')
In [3]: o
Out[3]: {'foo': None}
In [4]: "YES" if "foo" in o else "NO"
Out[4]: 'YES'

Indeed in python if you try and check for a missing item the way the 
email above describes, and the item is missing, an exception is raised:


In [5]: o["bar"]
---
KeyError                                Traceback (most recent
call last)


One *could* catch the "KeyError" to check for missing items which 
will also work using "null" son values for empty leafs, but the more 
common form is "if key in dict" in my experience.


Furthermore, using "access the value" for presence check will also 
"fail" for zero values and for empty strings, but we don't have odd 
encodings for integers or strings...


In [1]: import json
In [2]: o = json.loads('{"foo": 0, "bar": ""}')
In [3]: o
Out[3]: {'foo': 0, 'bar': ''}
In [4]: "YES" if o["foo"] else "NO"
Out[4]: 'NO'
In [5]: "YES" if o["bar"] else "NO"
Out[5]: 'NO'


Point being, evaluating an items value is not the right way to check 
for "presence", it's the way to check the "value" of the item. An 
empty leaf has no value so it's basically never correct to try to 
access that value in code.


Javascript is basically the same as python here:

js> o = JSON.parse('{"foo": null}')
({foo:null})
js> if ("foo" in o) { "YES" } else { "NO" }
"YES"


So, do we think it would it ever be possible to change (fix) this 
encoding oddity?


Thanks,
Chris.


___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


OpenPGP_signature
Description: OpenPGP digital signature
___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


Re: [netmod] json empty leaf encoding strangeness [Re: WG Last Call for draft-ietf-netmod-yang-json-04 (until 2015-06-29)]

2021-12-18 Thread Eliot Lear
Possibly.  The issue with fixing it is that it would create an ambiguity 
between null and [  null ].  I am not sure how often [ null ] would not 
have that semantic equivalence in earlier work. This is further 
complicated by a lack of self-descriptive versioning in YANG serializations.


Still it seems like the right thing to do, in order to fall into line 
with the target language spec.


Eliot

On 18.12.21 07:47, Christian Hopps wrote:

Hi,

I was just going over json encoding of YANG, and got to the empty leaf 
encoding and it's odd use of "[null]" rather than just "null". I read 
the explanation, but had a hard time believing what it said. So, 
running code time. The first thing I tried was Python to see if 
something weird happened:


In [1]: import json
In [2]: json.loads('{"foo": null}')
Out[2]: {'foo': None}

Nope, seems fine. Then checked the "definitive source" for json, 
javascript:


js> JSON.parse("{\"foo\": 1, \"bar\": null}")
({foo:1, bar:null})


Seems fine here too..

So I went searching the mailing list and found this:


On Jun 29, 2015, at 5:49 AM, Ladislav Lhotka  wrote:
Juergen Schoenwaelder  writes:

...

- I am not sure I understand the argument why [null] is better than
 null for the empty type. Perhaps it is but the text does not really
 tell me.


"foo": null

may sometimes appear as if the "foo" instance is not present at
all - in
some languages this is probably more serious than in others. This
is how
it works in Python:


import json
obj = json.loads('{"foo": null, "bar": [null]}')
"YES" if obj["foo"] else "NO"

'NO'

"YES" if obj["bar"] else "NO"

'YES'

So the special value "[null]" seems safer and it cannot appear in any
other context.


The justifying example here is, unfortunately, wrong. One does not 
(normally) check for the presence of a dictionary item in python by 
trying to access the value of that item (which is what the code above 
is doing). The standard python code to check for the presence of an 
item is as follows, and it works fine with a "null" json value:


In [1]: import json
In [2]: o = json.loads('{"foo": null}')
In [3]: o
Out[3]: {'foo': None}
In [4]: "YES" if "foo" in o else "NO"
Out[4]: 'YES'

Indeed in python if you try and check for a missing item the way the 
email above describes, and the item is missing, an exception is raised:


In [5]: o["bar"]
---
KeyError                              Traceback (most recent call
last)


One *could* catch the "KeyError" to check for missing items which will 
also work using "null" son values for empty leafs, but the more common 
form is "if key in dict" in my experience.


Furthermore, using "access the value" for presence check will also 
"fail" for zero values and for empty strings, but we don't have odd 
encodings for integers or strings...


In [1]: import json
In [2]: o = json.loads('{"foo": 0, "bar": ""}')
In [3]: o
Out[3]: {'foo': 0, 'bar': ''}
In [4]: "YES" if o["foo"] else "NO"
Out[4]: 'NO'
In [5]: "YES" if o["bar"] else "NO"
Out[5]: 'NO'


Point being, evaluating an items value is not the right way to check 
for "presence", it's the way to check the "value" of the item. An 
empty leaf has no value so it's basically never correct to try to 
access that value in code.


Javascript is basically the same as python here:

js> o = JSON.parse('{"foo": null}')
({foo:null})
js> if ("foo" in o) { "YES" } else { "NO" }
"YES"


So, do we think it would it ever be possible to change (fix) this 
encoding oddity?


Thanks,
Chris.


___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod


OpenPGP_signature
Description: OpenPGP digital signature
___
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod