Re: [core] YANG list to CBOR mapping

Michel Veillette <Michel.Veillette@trilliantinc.com> Mon, 23 November 2015 16:16 UTC

Return-Path: <Michel.Veillette@trilliantinc.com>
X-Original-To: core@ietfa.amsl.com
Delivered-To: core@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 033C21A89EB for <core@ietfa.amsl.com>; Mon, 23 Nov 2015 08:16:47 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.902
X-Spam-Level:
X-Spam-Status: No, score=-1.902 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZFClv8NhjAq7 for <core@ietfa.amsl.com>; Mon, 23 Nov 2015 08:16:43 -0800 (PST)
Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1bon0723.outbound.protection.outlook.com [IPv6:2a01:111:f400:fc10::1:723]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 5EDE01A89ED for <core@ietf.org>; Mon, 23 Nov 2015 08:16:42 -0800 (PST)
Received: from BLUPR06MB1763.namprd06.prod.outlook.com (10.162.224.149) by BLUPR06MB1763.namprd06.prod.outlook.com (10.162.224.149) with Microsoft SMTP Server (TLS) id 15.1.331.20; Mon, 23 Nov 2015 16:16:24 +0000
Received: from BLUPR06MB1763.namprd06.prod.outlook.com ([10.162.224.149]) by BLUPR06MB1763.namprd06.prod.outlook.com ([10.162.224.149]) with mapi id 15.01.0331.019; Mon, 23 Nov 2015 16:16:24 +0000
From: Michel Veillette <Michel.Veillette@trilliantinc.com>
To: "consultancy@vanderstok.org" <consultancy@vanderstok.org>
Thread-Topic: [core] YANG list to CBOR mapping
Thread-Index: AQHRIrIaNU9q4tL9iE+AdF+qow8vM56lToLAgAQGNoCAAHb+YA==
Date: Mon, 23 Nov 2015 16:16:24 +0000
Message-ID: <BLUPR06MB17633FB706D866D2C3E917B0FE070@BLUPR06MB1763.namprd06.prod.outlook.com>
References: <170106a36217a736a4b55991c4a5cf6a@xs4all.nl> <BLUPR06MB1763CC28443C787020D60CF7FE1A0@BLUPR06MB1763.namprd06.prod.outlook.com> <b02eb0119020ae52bbddfaed84dc1b01@xs4all.nl>
In-Reply-To: <b02eb0119020ae52bbddfaed84dc1b01@xs4all.nl>
Accept-Language: fr-CA, en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
authentication-results: spf=none (sender IP is ) smtp.mailfrom=Michel.Veillette@trilliantinc.com;
x-originating-ip: [207.96.192.122]
x-microsoft-exchange-diagnostics: 1; BLUPR06MB1763; 5:DhYHWzv7XIkJM1tRP2umVrxFLuaBtbwBIFfNfkeq70saUv+fAPtJeDHxY0RtN5y8Ljt0u16pk5rhgCO5xOCAmGQr3FZf6GwVlfeVaYzOU8/gt5EEErKMffhfBgXiDH3K9zN/4JG5puVFqDJPsDKIQQ==; 24:f498x3H4VfLGowcM5mcb+FLG9XgrTw+KtuSNSB314N/z1tZz3VHL7OYVOdudy6FpgrkEqD4XXVC9f4kwP9oh1GqmPzG0lBX9tkPdGLF0rkU=
x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR06MB1763;
x-microsoft-antispam-prvs: <BLUPR06MB1763A313DEAC540639DAFBC8FE070@BLUPR06MB1763.namprd06.prod.outlook.com>
x-exchange-antispam-report-test: UriScan:(256376046250027)(262738631018165);
x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(10201501046)(3002001); SRVR:BLUPR06MB1763; BCL:0; PCL:0; RULEID:; SRVR:BLUPR06MB1763;
x-forefront-prvs: 07697999E6
x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(6009001)(377454003)(13464003)(377424004)(38414003)(199003)(189002)(40100003)(5008740100001)(5007970100001)(19580395003)(19580405001)(586003)(50986999)(99286002)(6116002)(106116001)(86362001)(105586002)(2351001)(106356001)(87936001)(101416001)(76176999)(54356999)(15975445007)(77096005)(4001150100001)(3846002)(74316001)(102836003)(2900100001)(5001960100002)(5002640100001)(92566002)(2501003)(110136002)(5003600100002)(97736004)(66066001)(76576001)(2950100001)(15395725005)(10400500002)(15974865002)(11100500001)(5004730100002)(33656002)(122556002)(81156007)(189998001)(7059030); DIR:OUT; SFP:1102; SCL:1; SRVR:BLUPR06MB1763; H:BLUPR06MB1763.namprd06.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en;
received-spf: None (protection.outlook.com: trilliantinc.com does not designate permitted sender hosts)
spamdiagnosticoutput: 1:23
spamdiagnosticmetadata: NSPM
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
MIME-Version: 1.0
X-OriginatorOrg: trilliantinc.com
X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Nov 2015 16:16:24.4037 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 4f6fbd13-0dfb-4150-85c3-d43260c04309
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR06MB1763
Archived-At: <http://mailarchive.ietf.org/arch/msg/core/EGV_E2A3rNaZ5F8kpg4Jmg0ArLM>
Cc: "ana@ackl.io" <ana@ackl.io>, Core <core@ietf.org>
Subject: Re: [core] YANG list to CBOR mapping
X-BeenThere: core@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: "Constrained RESTful Environments \(CoRE\) Working Group list" <core.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/core>, <mailto:core-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/core/>
List-Post: <mailto:core@ietf.org>
List-Help: <mailto:core-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/core>, <mailto:core-request@ietf.org?subject=subscribe>
X-List-Received-Date: Mon, 23 Nov 2015 16:16:47 -0000

Hi Peter

Have you defined an MergePatch() function similar to RFC 7396 section 2 for your proposed extension?
Do we intent to support two PATCH approaches, RFC 7396 style and draft-ietf-netconf-yang-patch style?
IF so, why list need to be supported by the RFC 7396 style since this approach provide a partial coverage (list without keys and user ordered list is not fully supported) ? Should we address list only in the draft-ietf-netconf-yang-patch style?

Michel Veillette
System Architecture Director
Trilliant Inc.
Tel: 450-375-0556 ext. 237


-----Original Message-----
From: peter van der Stok [mailto:stokcons@xs4all.nl] 
Sent: November-23-15 3:58 AM
To: Michel Veillette <Michel.Veillette@trilliantinc.com>
Subject: RE: [core] YANG list to CBOR mapping

Hi Michel,

the point is to express in the payload the replacement criteria independent of application.
It is a CBOR extension to the patch format of RFC 7396.
The latter allows the replacement of complete arrays, not a subset of the array.

Peter

Michel Veillette schreef op 2015-11-20 21:41:
> Reference: YANG list to CBOR mapping
> https://core-wg.github.io/yang-cbor/#rfc.section.3.1.17
> 
> Hi Peter
> 
> Your proposed solution for lists have some drawbacks and I'll like to 
> understand better its advantages to evaluate the PROS and CONS.
> 
> List of CONS
> - Your proposed solution is not aligned with
> draft-ietf-netmod-yang-json-06
> - Your proposed solution take one extra byte per list entry
> - Your proposed solution use a map as key for a map, which is uncommon 
> (Illegal in JSON but not in CBOR)
> - The encoding of list defined with keys or without keys are done 
> differently
> 
> CoMI-CoOL clients and servers known which data nodes of a list are 
> keys and which ones are associated information.
> I don’t the see value of implementing the keys on the left side of the 
> ':' (key) and the rest of the data nodes on the right side of the ':"
> (value).
> This semantic is already known by both ends, why we need to add it to 
> the encoding?
> 
> === Examples
> 
> Map of map solution with CoMI IDs (88 Bytes)
>   {
>     11111111 : {
>       {22222222 : "book1", 33333333 : "author2"} : {44444444 : 500,
> 55555555: 66} ,
>       {22222222 : "book5", 33333333 : "author3"} : {44444444 : 444,
> 55555555: 11}
>     }
>   }
> 
> Array of map solution with CoMI IDs (86 Bytes)
>   {
>     11111111 : [
>       {
>         22222222 : "book1",
>         33333333 : "author2",
>         44444444 : 500,
>         55555555: 66
>       } ,
>       {
>         22222222 : "book5",
>         33333333 : "author3",
>         44444444 : 444,
>         55555555: 11
>       }
>     ]
>   }
> 
> Map of map solution with CoOL IDs (56 Bytes)
> 
>     {
>       11111111 : {
>         {2 : "book1", 3 : "author2"} : {4 : 500, 5: 66} ,
>         {2 : "book5", 3 : "author3"} : {4 : 444, 5: 11}
>       }
>     }
> 
> Array of map solution with CoOL IDs (54 Bytes)
> 
>     {
>       11111111 : [
>         {
>           2 : "book1",
>           3 : "author2",
>           4 : 500,
>           5: 66
>         } ,
>         {
>           2 : "book5",
>           3 : "author3",
>           4 : 444,
>           5: 11
>         }
>       ]
>     }
> 
> You say "It is the wish to transport only those list elements with a 
> unique key value, either to support a PATCH or a FETCH command".
> I don’t see why this is not the case for both representations.
> 
> Michel Veillette
> System Architecture Director
> Trilliant Inc.
> Tel: 450-375-0556 ext. 237
> michel.veillette@trilliantinc.com
> www.trilliantinc.com
> 
> 
> -----Original Message-----
> From: core [mailto:core-bounces@ietf.org] On Behalf Of peter van der 
> Stok
> Sent: November-19-15 5:06 AM
> To: Core <core@ietf.org>
> Cc: lhotka@nic.cz
> Subject: [core] YANG list to CBOR mapping
> 
> Hi CoOL authors,
> 
> This e_mail complements my earlier e-mail on YANG to CBOR mapping, and 
> explains the proposed list encoding.
> 
> Both the draft yang-json and the CoOL draft encode a list as an array.
> In the yang-json case as a JSON array, and in the CoOL case as major 
> type 4 of major type 5 objects.
> This encoding prevents the selection of list instances on the basis of 
> the key values from the payload alone. In CoMI the list is encoded as 
> a major type 5 of major type 5 objects. This deviation from the 
> yang-json mapping is motivated by the wish to transport individual 
> list instances and identify the instances in the payload from the key 
> values. This is especially important in case of PATCH operation on 
> list instances.
> Two cases are to be looked at: (1) the list definition specifies one 
> or more key elements, and (2) the list definition does not specify a 
> key element. We will start with a list containing key elements.
> It is the wish to transport only those list elements with a unique key 
> value, either to support a PATCH or a FETCH command. Therefore it is 
> required that the payload allows the selection and identification of 
> these list element on the basis of their key values. Using the 
> diagnostic JSON notation used for CBOR diagnostics, the payload 
> containing a number of elements with key values should look like a 
> JSON object with the structure list-name: {key: value}. Both key and 
> value are composed of JSON objects separated by commas. For example 
> consider the following YANG list specification:
> module foo {
>      namespace http://example.com/book;
>      prefix “fo”;
>      revision  2015-06-07;
> 
>     list B {
>        key “key1 key2”;
>        leaf key1 {type string;}
>        leaf key2 {type string;}
>        leaf coll {type int32;}
>        leaf counter {type int32;}
>     }
> }
> 
> Consider the transport of two instances specified by <“key1” = 
> “book1”, “key2” = “author2”> and by <“key1” = “book5”, “key2” = 
> “author3”> out of a larger set of instances. The representation is 
> different from the yang-json one for the reasons explained above.
> 
> The payload will look like:
> {"B" :{
>      {"key1" : "book1", "key2" : "author2"} :
>      {"coll" : 500, "counter": 66} ,
>      {"key1" : "book5", "key2" : "author3"} :
>      {"coll" : 444, "counter": 11}
>      }
> }
> 
> 
> Which translated to CBOR yields:
> 
> a1                         # map(1)
>     61                      # text(1)
>        42                   # "B"
>     a2                      # map(2)
>        a2                   # map(2)
>           64                # text(4)
>              6b657931       # "key1"
>           65                # text(5)
>              626f6f6b31     # "book1"
>           64                # text(4)
>              6b657932       # "key2"
>           67                # text(7)
>              617574686f7232 # "author2"
>        a2                   # map(2)
>           64                # text(4)
>              636f6c6c       # "coll"
>           19 01f4           # unsigned(500)
>           67                # text(7)
>              636f756e746572 # "counter"
>           18 42             # unsigned(66)
>        a2                   # map(2)
>           64                # text(4)
>              6b657931       # "key1"
>           65                # text(5)
>              626f6f6b35     # "book5"
>           64                # text(4)
>              6b657932       # "key2"
>           67                # text(7)
>              617574686f7233 # "author3"
>        a2                   # map(2)
>           64                # text(4)
>              636f6c6c       # "coll"
>           19 01bc           # unsigned(444)
>           67                # text(7)
>              636f756e746572 # "counter"
>           0b                # unsigned(11)
> 
> The corresponding yang-json draft encoding - that allows transport of 
> a selection of instances- does not specify the key fields and would 
> have looked like:
> 
> {"B" : [
>      {"key1" : "book1",
>        "key2" : "author2”,
>         "coll" : 500,
>         "counter": 66
>       } ,
>      {"key1" : "book5",
>        "key2" : "author3",
>        "coll" : 444,
>        "counter": 11,
>      }
>    ]
> }
> 
> Suppose there are no key elements specified. In that case it is 
> impossible to specify the wanted list elements, and always the whole 
> list must be transported. In the case of a list without key 
> specification is is best to use major type 4 composed of major type 5 
> to transport the list, as is specified in yang-json draft.
> 
> Consider the following YANG list
> 
> Module foo{
>      Namespace http://example.com/book;
>      Prefix “bo”
>      Revision  2015-06-7
> List B {
>     Leaf title {type string;}
>     Leaf author {type string;}
>     Leaf coll {type int32}
>     Leaf counter {type int32}
>     }
> }
> 
> Suppose the list contains two elements. The transport payload of the 
> two elements looks like:
> 
> {"B" :[
>      {"title" : "book1", "author" : "author2", "coll" : 500, "counter":
> 66} ,
>      {"title" : "book5", "author" : "author3",  “coll" : 444,
> "counter":
> 11}
>      ]
> }
> 
> This payload is identical to the yang-json payload.
> Which yields the corresponding CBOR code.
> 
> a1                         # map(1)
>     61                      # text(1)
>        42                   # "B"
>     82                      # array(2)
>        a4                   # map(4)
>           65                # text(5)
>              7469746c65     # "title"
>           65                # text(5)
>              626f6f6b31     # "book1"
>           66                # text(6)
>              617574686f72   # "author"
>           67                # text(7)
>              617574686f7232 # "author2"
>           64                # text(4)
>              636f6c6c       # "coll"
>           19 01f4           # unsigned(500)
>           67                # text(7)
>              636f756e746572 # "counter"
>           18 42             # unsigned(66)
>        a4                   # map(4)
>           65                # text(5)
>              7469746c65     # "title"
>           65                # text(5)
>              626f6f6b35     # "book5"
>           66                # text(6)
>              617574686f72   # "author"
>           67                # text(7)
>              617574686f7233 # "author3"
>           64                # text(4)
>              636f6c6c       # "coll"
>           19 01bc           # unsigned(444)
>           67                # text(7)
>              636f756e746572 # "counter"
>           0b                # unsigned(11)
> 
> 
> --
> Peter van der Stok
> vanderstok consultancy
> mailto: consultancy@vanderstok.org
> 
> _______________________________________________
> core mailing list
> core@ietf.org
> https://www.ietf.org/mailman/listinfo/core