Re: [core] YANG list to CBOR mapping

Michel Veillette <Michel.Veillette@trilliantinc.com> Fri, 20 November 2015 20:42 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 F02E51B3D8D for <core@ietfa.amsl.com>; Fri, 20 Nov 2015 12:42:21 -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 L4raHVnfOWtq for <core@ietfa.amsl.com>; Fri, 20 Nov 2015 12:42:18 -0800 (PST)
Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1bon0711.outbound.protection.outlook.com [IPv6:2a01:111:f400:fc10::1:711]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id D16171B3D8C for <core@ietf.org>; Fri, 20 Nov 2015 12:42:16 -0800 (PST)
Received: from BLUPR06MB1763.namprd06.prod.outlook.com (10.162.224.149) by BLUPR06MB1764.namprd06.prod.outlook.com (10.162.224.150) with Microsoft SMTP Server (TLS) id 15.1.331.20; Fri, 20 Nov 2015 20:41:56 +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; Fri, 20 Nov 2015 20:41:56 +0000
From: Michel Veillette <Michel.Veillette@trilliantinc.com>
To: "consultancy@vanderstok.org" <consultancy@vanderstok.org>, Core <core@ietf.org>
Thread-Topic: [core] YANG list to CBOR mapping
Thread-Index: AQHRIrIaNU9q4tL9iE+AdF+qow8vM56lToLA
Date: Fri, 20 Nov 2015 20:41:55 +0000
Message-ID: <BLUPR06MB1763CC28443C787020D60CF7FE1A0@BLUPR06MB1763.namprd06.prod.outlook.com>
References: <170106a36217a736a4b55991c4a5cf6a@xs4all.nl>
In-Reply-To: <170106a36217a736a4b55991c4a5cf6a@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; BLUPR06MB1764; 5:Ie1obPC9Ii79jueoE/T7hCtCZ9SmnGKEJLBJFw9oKHnwTof8seROkvYB46ZlVLhqbqfGrpp0CpQgPrAnwtcLmXRPe4n/WjFS0hhxb180e+1Eth4m73EAZj2q+Cs1LhjDbfh+pOwj84ovOD6qmywbYg==; 24:fjW98hlnPdOozgZX2HLX3BLfc1IstZpOVVqTYC6oBYFst16Tjd7K1LEvxsKz3Nsw9KVlBPwSdFcz6TlauZ/3mlujwrVCAB8AXjlQs1mxfYg=
x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR06MB1764;
x-microsoft-antispam-prvs: <BLUPR06MB1764230F937FFC93106EA10EFE1A0@BLUPR06MB1764.namprd06.prod.outlook.com>
x-exchange-antispam-report-test: UriScan:(256376046250027);
x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001); SRVR:BLUPR06MB1764; BCL:0; PCL:0; RULEID:; SRVR:BLUPR06MB1764;
x-forefront-prvs: 07665BE9D1
x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(6009001)(189002)(38414003)(377454003)(13464003)(199003)(377424004)(19580395003)(101416001)(81156007)(33656002)(2900100001)(15395725005)(19580405001)(5001960100002)(5001770100001)(97736004)(54356999)(189998001)(76176999)(86362001)(5003600100002)(50986999)(106356001)(5002640100001)(99286002)(106116001)(105586002)(122556002)(15975445007)(74316001)(92566002)(66066001)(5004730100002)(586003)(40100003)(77096005)(2950100001)(2501003)(76576001)(10400500002)(87936001)(5007970100001)(15974865002)(5008740100001)(11100500001)(102836003)(6116002)(3846002)(7059030); DIR:OUT; SFP:1102; SCL:1; SRVR:BLUPR06MB1764; H:BLUPR06MB1763.namprd06.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A: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: 20 Nov 2015 20:41:55.5910 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 4f6fbd13-0dfb-4150-85c3-d43260c04309
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR06MB1764
Archived-At: <http://mailarchive.ietf.org/arch/msg/core/PKVdRL89yRpNSD-SUP-7pGOps-4>
Cc: "ana@ackl.io" <ana@ackl.io>
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: Fri, 20 Nov 2015 20:42:22 -0000

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