[Netmod-ver-dt] [meeting minutes] RE: YANG package updates

"Rob Wilton (rwilton)" <rwilton@cisco.com> Fri, 20 December 2019 10:56 UTC

Return-Path: <rwilton@cisco.com>
X-Original-To: netmod-ver-dt@ietfa.amsl.com
Delivered-To: netmod-ver-dt@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id B8A241208AD for <netmod-ver-dt@ietfa.amsl.com>; Fri, 20 Dec 2019 02:56:25 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -14.499
X-Spam-Level:
X-Spam-Status: No, score=-14.499 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_HI=-5, SPF_PASS=-0.001, URIBL_BLOCKED=0.001, USER_IN_DEF_DKIM_WL=-7.5] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=cisco.com header.b=Ox4mrMkh; dkim=pass (1024-bit key) header.d=cisco.onmicrosoft.com header.b=xRf8U/ux
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 R78_JxqX9NCh for <netmod-ver-dt@ietfa.amsl.com>; Fri, 20 Dec 2019 02:56:22 -0800 (PST)
Received: from alln-iport-1.cisco.com (alln-iport-1.cisco.com [173.37.142.88]) (using TLSv1.2 with cipher DHE-RSA-SEED-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id E5BEF1208A9 for <netmod-ver-dt@ietf.org>; Fri, 20 Dec 2019 02:56:20 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=61150; q=dns/txt; s=iport; t=1576839381; x=1578048981; h=from:to:subject:date:message-id:mime-version; bh=ZS3CYNDZUs791m7GejTq2C0oaQAS6+tKGRHLz9ujXxY=; b=Ox4mrMkhsApHANaNnk3jryBXkpl6qtqEmryE/ymQTAbmKOY0roPXiZJ4 sv4c9WrTH/NwT3qwaE2LHCkhjyS73u13MUX2HaTFtpVjh/qxXGEKMGF9H La/vVwWtEa5JQLL4REGU0YylhplnbNTal9xnRW19Exhrp/e8FVg2w+ySx c=;
IronPort-PHdr: 9a23:0cuKnxF1yFTkptZGkFN+lp1GYnJ96bzpIg4Y7IYmgLtSc6Oluo7vJ1Hb+e4z1A3SRYuO7fVChqKWqK3mVWEaqbe5+HEZON0pNVcejNkO2QkpAcqLE0r+eeT1bigmG8JqX15+9Hb9Ok9QS47z
X-IronPort-Anti-Spam-Filtered: true
X-IronPort-Anti-Spam-Result: A0B8GgAUqPxd/40NJK1bCh4BCxyDGi9QBWxYIAQLKgqHQwOKc06aGYFCgRADVAkBAQEMAQEtAgEBhEACghwkOBMCAw0BAQQBAQECAQUEbYU3AQuFXgEBFxUGEwEBMAgRARkEAQEhAT8dCQEEEwgagwGBeU0DLgECoDECgTiIYYF0M4J+AQEFhRIYggwJgTaMGRqBQT+BEUeDCoQWAQcEBwEHGoNAgiyNNYhaJIk9jyEKgjSMbgeJPppVjlGaVAIEAgQFAg4BAQWBaSJncXAVO4JsUBgNgxiJegsYg1CKU3SBKI9vDxeBCwGBDwEB
X-IronPort-AV: E=Sophos;i="5.69,335,1571702400"; d="scan'208,217";a="386801158"
Received: from alln-core-8.cisco.com ([173.36.13.141]) by alln-iport-1.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 20 Dec 2019 10:56:18 +0000
Received: from XCH-RCD-005.cisco.com (xch-rcd-005.cisco.com [173.37.102.15]) by alln-core-8.cisco.com (8.15.2/8.15.2) with ESMTPS id xBKAuHOJ021860 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=FAIL) for <netmod-ver-dt@ietf.org>; Fri, 20 Dec 2019 10:56:17 GMT
Received: from xhs-rcd-003.cisco.com (173.37.227.248) by XCH-RCD-005.cisco.com (173.37.102.15) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Fri, 20 Dec 2019 04:56:17 -0600
Received: from xhs-aln-001.cisco.com (173.37.135.118) by xhs-rcd-003.cisco.com (173.37.227.248) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Fri, 20 Dec 2019 04:56:16 -0600
Received: from NAM11-CO1-obe.outbound.protection.outlook.com (173.37.151.57) by xhs-aln-001.cisco.com (173.37.135.118) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Fri, 20 Dec 2019 04:56:15 -0600
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Bo2Dg4LG0KIRhXPcEvMgYpACJfhqXvTSyXrqWp5Dmdpxr4hFbWbxsbnVEByKJ5/TTKrG6c70Jhbqycgo5EV+nkm4gUpQnrIDsu9eR/qKu1xbU3FzHUecNBxLEmKgUSazRTd37aD8eV41ZZuOzoCNAhLqWAq/ZaCkPa4iVZWeAerFQAcGQ3B4k0d2ch80apUcAn8SBQ6MRAyPYiQvZlA2S13wDhqmqNPwC6GyRsOuKyHV867eXLKdMAKsDzbp3rMqYu2lDXtfAOTPVImGq2CAlWuLLkf6c1cAU/v7EXNCPcqMmDZWz8CcqeMsbX1V9Q/rHoWUl97xut3nwsDrfkg2Hg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GHAplT/EF1Nxs49I19Wm5KJ3nkRp6l/889Rfug9TTxs=; b=fc8q1v8b+1WWu0XOF1jkLv6dzc3Un1PLOiyqrO/tXee0V5HJk2427waY5WfDUSYtZkbs9+l3sRS141qrTP2mX/DLdGHdNaGpf4ZpbHBkSoan6drHeB4nYLQtdcOmgQ1ZP+LwvN1AqhDtqExhT9LIp32qSQgf0Bfr5b2qzKod1tMZfvxHJiWlX81LllKIw2agkdIB/ESWBQ/yG/JFLJqeei/p27+btw861sqhF2YQcpmBu0HCdMUVPZTapUULpVcs1py+LixpN5D5u5997E5n9q2taHXWIbH5QQFykQCxYdmDms4zNSc1PBhdFYehUwz4gthJj+vF63nBUtXuod6KAQ==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cisco.com; dmarc=pass action=none header.from=cisco.com; dkim=pass header.d=cisco.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.onmicrosoft.com; s=selector2-cisco-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GHAplT/EF1Nxs49I19Wm5KJ3nkRp6l/889Rfug9TTxs=; b=xRf8U/ux2TWRrpdWZel7uQL5ESyOR/dBGsdIdgW9Y9gTgiL5CQvGpIS3PHoqmRK6gFSlC9vUAvUEz4sMReMNOAQpVLdigLzLJp2G2LtMoATfDwe16kVh8A45vrstIRmAdVfbIeaVeenHaYEX95TZNo6wi83QKWiNIc8nIvoFWtk=
Received: from MN2PR11MB4366.namprd11.prod.outlook.com (52.135.38.209) by MN2PR11MB3741.namprd11.prod.outlook.com (20.178.254.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2559.16; Fri, 20 Dec 2019 10:56:14 +0000
Received: from MN2PR11MB4366.namprd11.prod.outlook.com ([fe80::8106:b538:2920:a44f]) by MN2PR11MB4366.namprd11.prod.outlook.com ([fe80::8106:b538:2920:a44f%5]) with mapi id 15.20.2559.016; Fri, 20 Dec 2019 10:56:14 +0000
From: "Rob Wilton (rwilton)" <rwilton@cisco.com>
To: "netmod-ver-dt@ietf.org" <netmod-ver-dt@ietf.org>
Thread-Topic: [meeting minutes] RE: YANG package updates
Thread-Index: AdW3Iz/Ytf/SKNW2RTSzRdJ2KaA2fQ==
Date: Fri, 20 Dec 2019 10:56:14 +0000
Message-ID: <MN2PR11MB4366271C7B488D904E61539AB52D0@MN2PR11MB4366.namprd11.prod.outlook.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
authentication-results: spf=none (sender IP is ) smtp.mailfrom=rwilton@cisco.com;
x-originating-ip: [173.38.220.52]
x-ms-publictraffictype: Email
x-ms-office365-filtering-correlation-id: 14a986ce-0e43-493f-3f4c-08d7853b3baf
x-ms-traffictypediagnostic: MN2PR11MB3741:
x-microsoft-antispam-prvs: <MN2PR11MB37412BF51AF39B2A2CEA59E9B52D0@MN2PR11MB3741.namprd11.prod.outlook.com>
x-ms-oob-tlc-oobclassifiers: OLM:9508;
x-forefront-prvs: 025796F161
x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(39860400002)(346002)(376002)(396003)(136003)(51444003)(199004)(189003)(8936002)(66946007)(66476007)(15650500001)(478600001)(52536014)(7696005)(316002)(86362001)(81156014)(6916009)(81166006)(66446008)(71200400001)(53546011)(33656002)(2906002)(9686003)(186003)(66556008)(26005)(76116006)(64756008)(6506007)(8676002)(55016002)(5660300002)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:MN2PR11MB3741; H:MN2PR11MB4366.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1;
received-spf: None (protection.outlook.com: cisco.com does not designate permitted sender hosts)
x-ms-exchange-senderadcheck: 1
x-microsoft-antispam: BCL:0;
x-microsoft-antispam-message-info: nZHAUBRHzD9EE007wdBpxU9YYM854o3NDZpExU7hqBqO1pLAdY0tw1R9ytKxmeH4pP8L07D0IkCKKieLYRqUngjjhzHkMWebqtuZ/tT7kUeQWbnYvzGuZJsR+D6Nh6oxNuaEWAkYD88VmlEtOiwK4Ja8j4o4MWjl3zZ6wGcH3KQ0uT22eEj1Qf2uOvzPQf0SlM4S8BBtcTqjCjeWSdog1gPkhSsJbgm2xPBiryAC4goYqzhHPNbt+JGaNH6+wKEyHPQQ3zK2qBMNsEWHWJfuqTvqFd1aq3TkV7qxv0Gz1HMHqoGXKL6sz4vb8L2L8BodV9VLgXATGCS38FmtdAofiu1d0yiAOorKST/KjvjSKukZ+K0ECyx01Ebqu1PpYxBFapZCyVr3fnDQ7VSMoYvj5rnvtoN1sPD/u54VNhgu2r/7O6G0uZZw66FxjkwmN0PTnj+D6aUAqDFjibmXe7Tr/htFZDKMbWRrDfPJ+my1BXqzCAYtEmZqUl4NUT6q/aiV
x-ms-exchange-transport-forked: True
Content-Type: multipart/alternative; boundary="_000_MN2PR11MB4366271C7B488D904E61539AB52D0MN2PR11MB4366namp_"
MIME-Version: 1.0
X-MS-Exchange-CrossTenant-Network-Message-Id: 14a986ce-0e43-493f-3f4c-08d7853b3baf
X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Dec 2019 10:56:14.5960 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 5ae1af62-9505-4097-a69a-c1553ef7840e
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: 24KQtlsegJdJSoUJjtnjGPc1CBeXxWrq+ZvsCMXBYo9gvXG9Otm8QM9ID4ho/23KjdM3CvTSdt2GRBzaNbLijg==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR11MB3741
X-OriginatorOrg: cisco.com
X-Outbound-SMTP-Client: 173.37.102.15, xch-rcd-005.cisco.com
X-Outbound-Node: alln-core-8.cisco.com
Archived-At: <https://mailarchive.ietf.org/arch/msg/netmod-ver-dt/moXFZ6vVzQ2ToqDx410lDg60E8w>
Subject: [Netmod-ver-dt] [meeting minutes] RE: YANG package updates
X-BeenThere: netmod-ver-dt@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: NetMod WG YANG Model Versioning Design Team <netmod-ver-dt.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/netmod-ver-dt>, <mailto:netmod-ver-dt-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/netmod-ver-dt/>
List-Post: <mailto:netmod-ver-dt@ietf.org>
List-Help: <mailto:netmod-ver-dt-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/netmod-ver-dt>, <mailto:netmod-ver-dt-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 20 Dec 2019 10:56:26 -0000

Minutes from yesterday's short meeting (only Jason, Reshad and I) :


  *   We agreed that we preferred the packages structure below, and that this is a much better way of explaining the relationship between the instance data package files and the on the device packages.
  *   We seemed to reach agreement that the checksum/location is on the right track, but the document should clarify the SHA-256 is *only* based on the instance file contents, not what is in YANG library.  An implication of this is that if the file is not available somewhere then the device cannot provide a checksum.
  *   There wasn't much time spent discussion the version selection, but a couple of points were discussed:
     *   I don't think that we have figured out whether it is right for a schema to be limited to a single package per datastore, or whether it should be a simple union of packages (which might be better for custom schema implementations because then the device doesn't need to "create" packages to represent the union).  I think that I'm now thinking that union might be better.
     *   There was some discussion on whether the name of the schema should match the "name@version" of the packages.  I think that the leaning was towards this being a SHOULD rather than a MUST.
  *   We agreed that having some concrete examples would probably greatly help determine whether we are on the right track with the models, and will probably be very helpful in the version selection draft.

There will be no meeting for the next two weeks.  Hence the next meeting will be 9th Jan.

Thanks,
Rob


From: Netmod-ver-dt <netmod-ver-dt-bounces@ietf.org> On Behalf Of Rob Wilton (rwilton)
Sent: 17 December 2019 15:44
To: netmod-ver-dt@ietf.org
Subject: [Netmod-ver-dt] YANG package updates

[Mostly] based on the discussions last Thursday, I have had another ago at updating the packages.  Files pushed to github (as per attached).  Tree output at the end of this email.


1)     I've currently ditched the idea of using "<pkg-name>@<version>" as the identifier for a package and just gone back to separate name and version fields.  This makes the references slightly more verbose/ugly but has the benefit of consistency between the instance data file and the on the device data.

2)     I've renamed the file ietf-yang-package.yang to ietf-yang-package-instance.yang

3)     The structure between the YANG instance data package definition (ignoring the standard fields for all instance data documents) and the package list entry are the same, except that the package list entry also contains the location and checksum.  It doesn't make sense to put these into the instance data document because either they can't be known (checksum) or they are self-referential (location).

module: ietf-yang-package-instance
  structure package:
    +-- name                  pkg-name
    +-- version               pkg-version
     ... this is exactly the same as everything in the package list entry below ...

module: ietf-yl-packages
  augment /yanglib:yang-library:
    +--ro package* [name version]
       +--ro name                  pkg-name
       +--ro version               pkg-versionmodule: ietf-yl-packages
       |  ... matches above, plus the following two fields ...
       +--ro location*     inet:uri
       +--ro checksum?     pkg-types:sha-256-hash


4)     I've removed the "supported-optional-feature" leaf-list from the YANG-library augmentation (to /yanglib:yang-library/yanglib:schema).  I think that it is more consistent to define a separate package for this use case, which can define the features used by the package, and also allows the schema to be available off the device.

I've had another bash at the schema-version-selection YANG module:

5)     The "default-schema" is now also the schema that persistent configuration is restored from.  I.e. I'm thinking that generally the default schema is what the secondary schema are either selected subsets of or are converted into.

6)     Custom-schema are now just a named union of selectable schema.  I.e. it no longer defines a package instance to sit alongside the custom schema, clients have to manage this themselves (which seems reasonable).

7)     I've separated the naming of schema vs the naming of packages defining those schema.  If we follow this path we need to decide whether the names can contain "@" and whether they should match "<name>@<version>".

8)     Schema's now no longer explicitly identify a package to represent the pan-datastore schema.  It still logically exists, but isn't explicitly reported (which keeps the definition closely to RFC8525).

9)     Each schema defines whether it is selectable as a default schema, secondary schema, or as part of a custom schema.  The schema compatibility details are also split out depending on how it is being used.  I.e. to give implementations more control of what types of

Thoughts/comments welcome.

Tree output for the updates.

Version selection:

module: ietf-schema-selection
  +--rw schema-selection
     +--rw default-schema?     -> /schema-selection/schema/name {default-schema}?
     +--rw secondary-schema*   -> /schema-selection/schema/name {secondary-schema}?
     +--rw custom-schema* [name] {custom-schema}?
     |  +--rw name               string
     |  +--rw description?       string
     |  +--rw included-schema*   -> /schema-selection/schema/name
     +--ro schema* [name]
        +--ro name                           string
        +--ro datastores* [datastore]
        |  +--ro datastore    ds:datastore-ref
        |  +--ro package
        |     +--ro name?       -> /yanglib:yang-library/yl-pkg:package/name
        |     +--ro version?    -> /yanglib:yang-library/yl-pkg:package[yl-pkg:name = current()/../name]/version
        |     +--ro checksum?   -> /yanglib:yang-library/yl-pkg:package[yl-pkg:name = current()/../name][yl-pkg:version = current()/../version] /yl-pkg:checksum
        +--ro default-schema-selectable! {default-schema}?
        |  +--ro compatible-secondary-schema*   -> /schema-selection/schema/name
        +--ro secondary-schema-selectable! {secondary-schema}?
        |  +--ro compatible-default-schema*     -> /schema-selection/schema/name
        |  +--ro compatible-secondary-schema*   -> /schema-selection/schema/name
        +--ro custom-schema-selectable! {custom-schema}?
           +--ro combinable-schema*   -> /schema-selection/schema/name


YANG instance data definition:

module: ietf-yang-package-instance

  structure package:
    +-- name                  pkg-name
    +-- version               pkg-version
    +-- timestamp?            yang:date-and-time
    +-- organization?         string
    +-- contact?              string
    +-- description?          string
    +-- reference?            string
    +-- complete?             boolean
    +-- local?                boolean
    +-- previous-version?     pkg-version
    +-- nbc-changes?          boolean
    +-- tag*                  tags:tag
    +-- mandatory-feature*    scoped-feature
    +-- included-package* [name version]
    |  +-- name                pkg-name
    |  +-- version             pkg-version
    |  +-- replaces-version*   pkg-version
    |  +-- nbc-modified?       boolean
    |  +-- location*           inet:uri
    |  +-- checksum?           pkg-types:sha-256-hash
    +-- module* [name]
    |  +-- name                 yang:yang-identifier
    |  +-- revision?            rev:revision-date-or-label
    |  +-- replaces-revision*   rev:revision-date-or-label
    |  +-- namespace?           inet:uri
    |  +-- location*            inet:uri
    |  +-- checksum?            pkg-types:sha-256-hash
   |  +-- submodule* [name]
    |     +-- name        yang:yang-identifier
    |     +-- revision    yang:revision-identifier
    |     +-- location*   inet:uri
    |     +-- checksum?   pkg-types:sha-256-hash
    +-- import-only-module* [name revision]
       +-- name                 yang:yang-identifier
       +-- revision             rev:revision-date-or-label
       +-- replaces-revision*   rev:revision-date-or-label
       +-- namespace?           inet:uri
       +-- location*            inet:uri
       +-- checksum?            pkg-types:sha-256-hash
       +-- submodule* [name]
          +-- name        yang:yang-identifier
          +-- revision    yang:revision-identifier
          +-- location*   inet:uri
          +-- checksum?   pkg-types:sha-256-hash

YANG library augmentations:

module: ietf-yl-packages
  augment /yanglib:yang-library:
    +--ro package* [name version]
       +--ro name                  pkg-name
       +--ro version               pkg-version
       +--ro timestamp?            yang:date-and-time
       +--ro organization?         string
       +--ro contact?              string
       +--ro description?          string
       +--ro reference?            string
       +--ro complete?             boolean
       +--ro local?                boolean
       +--ro previous-version?     pkg-version
       +--ro nbc-changes?          boolean
       +--ro tag*                  tags:tag
       +--ro mandatory-feature*    scoped-feature
       +--ro included-package* [name version]
       |  +--ro name                pkg-name
       |  +--ro version             pkg-version
       |  +--ro replaces-version*   pkg-version
       |  +--ro nbc-modified?       boolean
       |  +--ro location*           inet:uri
       |  +--ro checksum?           pkg-types:sha-256-hash
       +--ro module* [name]
       |  +--ro name                 yang:yang-identifier
       |  +--ro revision?            rev:revision-date-or-label
       |  +--ro replaces-revision*   rev:revision-date-or-label
       |  +--ro namespace?           inet:uri
       |  +--ro location*            inet:uri
       |  +--ro checksum?            pkg-types:sha-256-hash
       |  +--ro submodule* [name]
       |     +--ro name        yang:yang-identifier
       |     +--ro revision    yang:revision-identifier
       |     +--ro location*   inet:uri
       |     +--ro checksum?   pkg-types:sha-256-hash
       +--ro import-only-module* [name revision]
       |  +--ro name                 yang:yang-identifier
       |  +--ro revision             rev:revision-date-or-label
       |  +--ro replaces-revision*   rev:revision-date-or-label
       |  +--ro namespace?           inet:uri
       |  +--ro location*            inet:uri
       |  +--ro checksum?            pkg-types:sha-256-hash
       |  +--ro submodule* [name]
       |     +--ro name        yang:yang-identifier
       |     +--ro revision    yang:revision-identifier
       |     +--ro location*   inet:uri
       |     +--ro checksum?   pkg-types:sha-256-hash
       +--ro location*             inet:uri
       +--ro checksum?             pkg-types:sha-256-hash
  augment /yanglib:yang-library/yanglib:schema:
    +--ro package
       +--ro name?       -> /yanglib:yang-library/package/name
       +--ro version?    -> /yanglib:yang-library/package[name = current()/../name]/version
       +--ro checksum?   -> /yanglib:yang-library/package[name = current()/../name][version = current()/../version]/checksum

Thanks,
Rob