<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="2"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="info"
     docName="draft-ietf-nmop-yang-message-broker-integration-11"
     ipr="trust200902">
  <front>
    <title abbrev="YANG-Push to Message Broker Integration">An
		Architecture for YANG-Push to Message Broker Integration</title>

    <author fullname="Thomas Graf" initials="T" surname="Graf">
      <organization>Swisscom</organization>

      <address>
        <postal>
          <street>Binzring 17</street>

          <city>Zurich</city>

          <code>8045</code>

          <country>Switzerland</country>
        </postal>

        <email>thomas.graf@swisscom.com</email>
      </address>
    </author>

    <author fullname="Ahmed Elhassany" initials="A" surname="Elhassany">
      <organization>Swisscom</organization>

      <address>
        <postal>
          <street>Binzring 17</street>

          <city>Zuerich 8045</city>

          <region/>

          <code/>

          <country>Switzerland</country>
        </postal>

        <phone/>

        <email>ahmed.elhassany@swisscom.com</email>

        <uri/>
      </address>
    </author>

    <date day="01" month="March" year="2026"/>

    <area>Operations and Management</area>

    <workgroup>NMOP</workgroup>

    <abstract>
      <t>This document describes the motivation and architecture of a
			native YANG-Push notifications and YANG Schema integration into a
			Message Broker and YANG Schema Registry.</t>
    </abstract>

    <note removeInRFC="true">
      <name>Discussion Venues</name>

      <t>Discussion of this document takes place on the Operations and
      Management Area Working Group Working Group mailing list
      (nmop@ietf.org), which is archived at <eref
      target="https://mailarchive.ietf.org/arch/browse/nmop/"/>.</t>

      <t>Source for this draft and an issue tracker can be found at <eref
      target="https://github.com/network-analytics/draft-ietf-nmop-yang-message-broker-integration/"/>.</t>
    </note>
  </front>

  <middle>
    <section anchor="Introduction" title="Introduction">
      <t>Nowadays network operators are using <xref
      target="RFC7950">YANG</xref> to model their configurations and
			obtain YANG modelled data from their networks. It is well
			understood that plain text are initially intended for humans and
			need effort to make it machine readable due to the lack of
			semantics. YANG modeled data is addressing most of these needs.
			</t>

      <t>Increasingly more network operators organizing their data in a 
			<xref target="Deh22">Data Mesh</xref> where a Message Broker such 
			as <xref target="Kaf11">Apache Kafka</xref> or <xref
			target="Pul16">Apache Pulsar</xref> facilitates the exchange of
			messages among data processing components like a stream processor
			to filter, enrich, correlate or aggregate, or a time series
			database to store data.</t>

      <t>Even though YANG is intended to ease the handling of data, this
			promise has not yet been fulfilled for <xref target="RFC9232">
			Network Telemetry</xref>. From subscribing on a YANG datastore,
			publishing a YANG modeled notifications message from the network
			and viewing the data in a time series database, manual labor, such
			as obtaining the YANG schema from the network and creating a
			transformation or ingestion specification into a time series
			database, is needed to make a Message Broker and its data
			processing components with YANG notifications interoparable. Since
			YANG modules can change over time, for example when a router is
			being upgraded to a newer software release, this process needs to
			be adjusted contionously, leading often to errors in the data
      chain if dependencies are not properly tracked and schema changes
      adjusted simultaneously.</t>

      <section anchor="Origins_of_YANG_Push"
			         title="Origins of YANG-Push">
        <t>With <xref target="RFC3535"/> the IAB set the requirements
				for Network Management in 2003. From these requirements <xref
        target="RFC6241">NETCONF</xref>, <xref target="RFC5277">NETCONF
        Notifications</xref> and <xref target="RFC8040">RESTCONF</xref>
				have been defined to configure through &lt;edit-config&gt; and
				retrieve operational data through &lt;get&gt; and NETCONF
				notifications through &lt;notification&gt; from a YANG datastore
				on a network node.</t>

        <t>With YANG-Push, as defined in <xref target="RFC8639"/>, <xref
        target="RFC8640"/> and <xref target="RFC8641"/>, periodical and
        on-change subscriptions to the YANG datastore can be dynamically
				or statically configured. When notifications are dynamically
				configured, messages are published over the initially
				established NETCONF session, while when it is statically
				configured messages are published through <xref
				target="I-D.ietf-netconf-https-notif">HTTPS-based</xref> or
        <xref target="I-D.ietf-netconf-udp-notif">UDP-based</xref>
				transport. <xref section="3.7" sectionFormat="of"
				target="RFC8641"/> describes push-update messages where the
				YANG subscribed data is being published, where <xref
				section="2.7" sectionFormat="of" target="RFC8639"/> describes
				the subscription state change notifications were changes in the
				Subscription are being described.</t>
      </section>

      <section anchor="Origins_of_Apache_Kafka"
               title="Origins of Apache Kafka">
        <t><xref target="Kaf11">Apache Kafka</xref> is a Message Broker
				that supports producing and consuming messages from so called
				topics. Each topic has one or more partitions where messages are
				replicated or load balanced to scale out. With the introduction
				of <xref target="Con18">Confluent Schema Registry</xref> a topic
				can contain one or more subjects. A subject refers to a Schema
				defining the structure of the message. The Schema then is used
				to validate messages sent through topics and are identified by a
				Schema ID. The Schema ID is issued when the Schema is registered
				to the Confluent Schema Registry. Once the Schema ID is
				obtained, it can be prefixed to the message with a Confluent
				Schema Registry compatible serializer. Messages can then be
				validated against Schema at the producer or at the consumer from
				a topic to ensure Schema integrity of the message. The type of
				Schema evolution scheme can be defined per subject, whether non
				backward compatibility changes are allowed or not.</t>
      </section>

      <section anchor="Document_Scope" title="Document Scope">
        <t>This document focuses on <xref
				target="RFC8641">YANG-Push</xref> as the messaging protocol
				between network nodes and <xref target="RFC9232">Network
				Telemetry</xref> data collection. It describes the main
				components and the aimed architecture for deploying such
				solution in a production network. Then, it illustrates the
        integration of the <xref target="RFC7950"> YANG 1.1</xref> as a
				schema modeling language into the Apache Kafka Message Broker
				and <xref target="Con18"> Confluent Schema Registry</xref>.</t>
      </section>
    </section>

    <section anchor="Conventions_and_Definitions"
             title="Conventions and Definitions">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
			"SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
			RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
			interpreted as described in BCP 14 <xref target="RFC2119"/> <xref
			target="RFC8174"/> when, and only when, they appear in all
			capitals, as shown here.</t>

      <section anchor="Terminology" title="Terminology">
        <t>This document defines the following terms:</t>

        <t>Message Broker: is an intermediary software component that
        translates messages from the formal messaging protocol of the
				sender to the formal messaging protocol of the receiver routed
				in topics <xref target="Kaf11"/>. Message brokers are elements
				in Data Mesh where software applications communicate by
				exchanging formally-defined messages.</t>

        <t>Stream Catalog: provides a single point of access that allows
				users to centrally search semantics for information across a
				Message Broker.</t>

        <t>Additionally it makes use of the terms defined in <xref
        target="RFC8639"/>, <xref target="RFC7950"/>, <xref 
				target="Kaf11">Apache Kafka</xref>, <xref
				target="ConDoc18">Confluent Schema Registry
				Documentation</xref> and <xref target="Deh22">Data Mesh</xref>.
				</t>

        <t>The following terms are used as defined in <xref
        target="RFC8639"/>:</t>

        <t><list style="symbols">
            <t>Publisher</t>

            <t>Receiver</t>

            <t>Subscription</t>

            <t>Subscription ID</t>

            <t>Event stream filter</t>

            <t>Notification message</t>
          </list></t>

        <t>The following terms are used as defined in <xref
        target="Kaf11">Apache Kafka Message Broker</xref>:</t>

        <t><list style="symbols">
            <t>Producer</t>

            <t>Consumer</t>

            <t>Topic</t>

            <t>Partition</t>
          </list></t>

        <t>The following terms are used as defined in <xref
        target="ConDoc18">Confluent Schema Registry
				Documentation</xref>:</t>

        <t><list style="symbols">
            <t>Schema</t>

            <t>Schema ID</t>

            <t>Schema Registry</t>

            <t>Subject</t>
          </list></t>

        <t>The following terms are used as defined in <xref
				target="Deh22"> Data Mesh</xref>:</t>

        <t><list style="symbols">
            <t>Data Product: A logical unit that contains all components
						to publish, process and store domain data for analytical or
            data-intensive use cases.</t>

            <t>Service Level Objective: Is a target value or range of
						values for a service level that is measured by an service
						level indicator.</t>

            <t>Service Level Indicator: Is a measure of a service level
						provided by a service provider to a customer.</t>
          </list></t>

        <t>This document defines the following terms:</t>

        <t><list style="symbols">
            <t>YANG Schema Registry: Stores YANG schemas and has an
						API for registering and retrieving YANG schemas for YANG
						Message Broker Producers and Consumers. See <xref
				    target="YANG_Schema_Registry"/>.</t>

            <t>YANG Message Broker Producer: Serializes YANG telemetry
						messages from previously retrieved YANG notifications From
						YANG-Push Receiver and registers YANG schemas at YANG 
						Schema Registry for the serialized telemetry messages. See
						<xref target="YANG_Message_Broker_Producer"/>.</t>

            <t>YANG Message Broker Consumer: De-Serializes YANG
						telemetry messages from Message Broker and retrieve
						YANG schemas for the serialized telemetry messages from YANG
						Schema Registry. See <xref
						target="YANG_Message_Broker_Consumer"/>.</t>
						
            <t>YANG Data Consumer: Transforms and ingests previously
						obtained YANG notfications from Message Broker into YANG
						Data Storage by leveraging YANG schemas from YANG Schema
						Registry. See <xref target="YANG_Data_Consumer"/>.</t>

            <t>YANG Data Storage: Stores and indexes YANG data retrieved
						through YANG notifications. See <xref
						target="YANG_Data_Storage"/>.</t>						
          </list></t>
      </section>
    </section>

    <section anchor="Motivation" title="Motivation">
      <t>There are four main objectives for native YANG-Push
			notifications and YANG Schema integration into a Message Broker.
			</t>

      <section anchor="Automatic_Onboarding"
			         title="Automatic Onboarding">
        <t>Automate the Data Mesh onboarding of newly subscribed YANG
        metrics.</t>
      </section>

      <section anchor="Preserve_Schema" title="Preserve Schema">
        <t>The preservation of the YANG schema, that includes the YANG
				data types as defined in <xref target="RFC6991"/> and the nested
				structure of the YANG module, the data taxonomy, throughout the
				data processing chain ensures that metrics can be processed and
				visualized as they were originally intended. Not only for users
				but also for automated closed loop operation actions.</t>
      </section>

      <section anchor="Preserve_Semantic_Information"
               title="Preserve Semantic Information">
        <t><xref target="RFC7950"/> defines in Section 7.21.3 and 7.21.4
				the description and reference statement. This information is
				intended for the user, describing in a human-readable fashion
				the meaning of a definition. In Data Mesh, this information can
				be imported from the YANG Schema Registry into a Stream Catalog
				where subjects within Message Broker are identifiable and
				searchable. An example of a Stream Catalog is <xref
				target="Atl15">Apache Atlas</xref>. It can also be applied for
				time series data visualization in a similar fashion.</t>
      </section>

      <section anchor="Standardize_Data_Processing_Integration"
               title="Standardize Data Processing Integration">
        <t>Since the YANG Schema is preserved for operational metrics in
				the Message Broker, a standardization for integration between
				network data collection and stream processors or time series
				databases is implied.</t>
      </section>
    </section>

    <section anchor="Elements_of_the_Architecture"
             title="Elements of the Architecture">
      <t>The architecture consists of 10 elements. <xref
      target="workflow_diagram"/> gives an overview on the workflow.</t>

      <figure anchor="workflow_diagram" title="End to End Workflow">
        <artwork align="center"><![CDATA[
      +------------------------------------------------------------+
      |                     YANG Data Storage                      |
      +------------------------------------------------------------+
                                     ^
                                     | (12) Ingest Data
                                     | According to Schema
      +------------------------------------------------------------+
      |                    YANG Data Consumer                      |
      +------------------------------------------------------------+
      |               YANG Message Broker Consumer                 |
      +------------------------------------------------------------+
            |  ^                                   ^ 
   (10) Get |  |                                   | (9) Validate
     Schema |  |                                   | Serialized Message
            |  |                                   | Schema on Consumer
            |  |                              +--------------------+
            |  |                              |      Message       |
            |  |                              |      Broker        |
            |  |                              +--------------------+
            |  |                                   ^
            |  |                                   | (8) Serialize
            |  |                                   | YANG-Push Message
            |  |                                   | annotated Schema ID
            |  |                                   | on Producer
            |  |                                   |
            |  |                                   |
            |  | (11) Issue                   +--------------------+
            |  |      Schema                  |    YANG Message    |
            v  |                  (6) Post    |   Broker Producer  |
      +--------------------+          Schema  +--------------------+
      |       YANG         | <--------------- |  Data Collection   |
      |  Schema Registry   | ---------------> | YANG-Push Receiver |
      +--------------------+  (7) Issue       +--------------------+
            |                     Schema ID        |  ^ (3) Receive
            |                                      |  | YANG-Push
            v                         (4) Discover |  | Subscription
      +--------------------+                Schema |  | Start Message
      |      Stream        |          Dependencies |  |   ^
      |      Catalog       |            and Obtain |  |   | (5) Publish
      +--------------------+               Schemas |  |   | YANG-Push
                                                   |  |   | Message
                                                   |  |   | with
                             (1) Discover          |  |   | Subscriber
                                 Notification      v  |   | ID
      +--------------------+     Capabilities +--------------------+
      |  Manage YANG-Push  | ---------------> |   Network Node     |
      |    Subscription    | ---------------> | YANG-Push Publisher|
      +--------------------+ (2) Subscribe    +--------------------+
]]></artwork>
      </figure>

      <t>The <xref target="workflow_diagram">workflow diagram</xref>
			describes the steps from establishing the YANG-Push subscription
			to Data Storage ingestion.</t>

      <section anchor="YANG_Push_Subscription" title="YANG-Push
			Subscription">
        <t>With step number (1) in the workflow diagram, the YANG-Push
        notification transport capabilities are being discovered
				according to <xref
				target="I-D.ietf-netconf-yp-transport-capabilities"/>, 
        notification capabilities according to <xref
        target="I-D.ietf-netconf-notif-envelope"/> and notification
        subscription capabilities according to <xref section="3"
        sectionFormat="of" target="RFC9196"/>.</t>
    
        <t>With step (2) a YANG-Push subscription according to
				Section 2.4 and 2.5 of <xref target="RFC8639"/> is dynamically
				or statically configured.</t>
    
        <t>With step (3) subscription start notifications are sent
        according to <xref section="2.7" sectionFormat="of"
				target="RFC8639"/> from the YANG-Push Publisher to the Receiver
				to inform which event stream filter has been applied to which
				Subscription ID.</t>

        <t>When the YANG-Push Subscription is managed dynamically, the
				YANG data is being received on the same NETCONF session where
				the Subscription is being maintained. With configured
				Subscription the YANG data is sent to the YANG-Push Receiver
				through a separate transport session.</t>

        <t><xref target="I-D.ietf-netconf-yang-notifications-versioning"/>
        adds the capability to subscribe to a specific YANG module
				revision or backward compatible YANG module in step (2) and
        adds the module name, revision, revision-label and
				yang-library-content-id information into the subscription state
				change notifications in step (3).</t>
    
        <t><xref
        target="netconf_edit_config_establish_subscription_example_xml_fig"/>
        provides an example how to create a YANG-Push configured
				Subscription with NETCONF in XML <xref
				target="W3C.REC-xml-20081126"/> with UDP-based <xref
				target="I-D.ietf-netconf-udp-notif"/> transport</t>

        <figure anchor="netconf_edit_config_establish_subscription_example_xml_fig"
                title="NETCONF Example to establish configured Subscription">
          <artwork><![CDATA[
========== NOTE: '\' line wrapping per RFC 8792) ===========

<rpc message-id="101"
  xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <edit-config>
    <target>
      <running/>
    </target>
    <config>
      <subscriptions xmlns="urn:ietf:params:xml:ns:yang:ietf\
      -subscribed-notifications">
        <subscription>
          <id>6666</id>
          <datastore xmlns="urn:ietf:params:xml:ns:yang:ietf\
          -yang-push"
            xmlns:ds="urn:ietf:params:xml:ns:yang:ietf\
            -datastores">ds:operational</datastore>
          <datastore-xpath-filter xmlns="urn:ietf:params:xml:ns\
          :yang:ietf-yang-push"
            xmlns:if="urn:ietf:params:xml:ns:yang:ietf-inter\
            faces">/if:interfaces</datastore-xpath-filter>
          <revision xmlns="urn:ietf:params:xml:ns:yang:ietf-yang\
          -push-revision">2018-02-20</revision>
          <transport xmlns:unt="urn:ietf:params:xml:ns:yang:ietf\
          -udp-notif-transport">unt:udp-notif</transport>
          <encoding>encode-json</encoding>
          <receivers>
            <receiver>
              <name>subscription-specific-receiver-def</name>
              <receiver-instance-ref xmlns="urn:ietf:params:xml\
              :ns:yang:ietf-subscribed-notif-receivers">\
              global-udp-notif-receiver-def</receiver-instance-ref>
            </receiver>
          </receivers>
          <periodic xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
            <period>6000</period>
          </periodic>
        </subscription>
        <receiver-instances xmlns="urn:ietf:params:xml:ns:yang:ietf\
        -subscribed-notif-receivers">
          <receiver-instance>
            <name>global-udp-notif-receiver-def</name>
            <udp-notif-receiver xmlns="urn:ietf:params:xml:ns:yang\
            :ietf-udp-notif-transport">
              <address>203.0.113.1</address>
              <port>12345</port>
              <enable-segmentation>false</enable-segmentation>
              <max-segment-size/>
            </udp-notif-receiver>
          </receiver-instance>
        </receiver-instances>
      </subscriptions>
    </config>
  </edit-config>
</rpc>
          ]]></artwork>
        </figure>

        <t><xref target="subscription_started_notif_example_json_fig"/>
        provides an example of a JSON encoded, <xref target="RFC7951"/>,
        subscription-started state change notification message over
        HTTPS-based <xref target="I-D.ietf-netconf-https-notif"/> or
				UDP-based <xref target="I-D.ietf-netconf-udp-notif"/> transport
				with <xref target="I-D.ietf-netconf-notif-envelope"/> and <xref
        target="I-D.ietf-netconf-yang-notifications-versioning"/> as
        extensions for the same Subscription.</t>

        <figure anchor="subscription_started_notif_example_json_fig"
                title="JSON YANG-Push Example for a subscription-started notification message">
          <artwork><![CDATA[
{
  "ietf-yp-notification:envelope": {
    "event-time": "2023-03-25T08:30:11.22Z",
    "hostname": "example-router",
    "sequence-number": 1,
    "notification-contents": {
      "ietf-subscribed-notification:subscription-started": {
        "id": 6666,
        "ietf-yang-push:datastore": "ietf-datastores:operational",
        "ietf-yang-push:datastore-xpath-filter": "/if:interfaces",
        "ietf-yang-push-revision:revision": "2014-05-08",
        "ietf-yang-push-revision:module-name": "ietf-interfaces",
        "ietf-yang-push-revision:revision-label": "",
        "ietf-yang-push-revision:yang-library-content-id": "1",
        "ietf-distributed-notif:message-publisher-ids": [1,2],
        "transport": "ietf-udp-notif-transport:udp-notif",
        "encoding": "encode-json",
        "ietf-yang-push:periodic": {
          "ietf-yang-push:period": 100
    }
      }
    }
  }
}
          ]]></artwork>
        </figure>
      </section>

      <section anchor="YANG_Push_Publisher" title="YANG-Push Publisher">
        <t>With step number (4) in the workflow diagram, a YANG-Push
        push-update or push-change-update message, depending on wherever
        periodical or on-change Subscription has been established, is
				sent from the YANG-Push Publisher to the receiver according to
				<xref section="3.7" sectionFormat="of" target="RFC8639"/>.</t>

        <t><xref target="I-D.ietf-netconf-notif-envelope"/> defines
				the YANG-Push notification header in YANG with event-time,
				hostname and sequence-number to enable a YANG data consumer to
				use the hostname to recognize which network node the message was
        published from and with sequence-number message reordering or
				loss.</t>
    
        <t><xref target="I-D.ietf-netconf-distributed-notif"/> adds a 
        message-publisher-id for network nodes with distributed
				architecture where multiple YANG-Push publishing processes are
				publishing messages. The message-publisher-id enables a YANG
				data consumer to recognize from which YANG-Push Publisher
				process the message was published from.</t>

        <t><xref section="3.5.1" sectionFormat="of"
        target="I-D.ietf-netconf-notif-envelope"/> adds observation
        timestamp and point-in-time in the YANG-Push push-update or
        push-change-update message. The observation timestamp contains
				the timestamp and point-in-time when the metrics where observed.
				</t>

        <t><xref target="push_update_notif_example_json_fig"/> provides
				an example of a JSON encoded, <xref target="RFC7951"/>,
				push-update notification message over HTTPS-based <xref
        target="I-D.ietf-netconf-https-notif"/> or UDP-based <xref
        target="I-D.ietf-netconf-udp-notif"/> transport and <xref
        target="I-D.ietf-netconf-notif-envelope"/> with 
        hostname, sequence-number, observation timestamp and
				point-in-time as extensions.</t>

        <figure anchor="push_update_notif_example_json_fig"
        title="JSON YANG-Push Example for a push-update notification message">
          <artwork><![CDATA[
========== NOTE: '\' line wrapping per RFC 8792) ===========

{
  "ietf-yp-notification:envelope": {
    "event-time": "2023-03-25T08:30:11.22Z",
    "hostname": "example-router",
    "sequence-number": 1,
    "notification-contents": {
      "ietf-yang-push:push-update": {
        "id": 6666,
        "ietf-yp-observation:timestamp": \
        "2023-03-25T08:30:11.22Z",
        "ietf-yp-observation:point-in-time": \
        "current-accounting",
        "datastore-contents": {
          "ietf-interfaces:interfaces": [
            {
              "interface": {
                "name": "eth0",
                "type": "iana-if-type:ethernetCsmacd",
                "oper-status": "up",
                "mtu": 1500
              }
            }
          }
        ]
      }
    }
  }
}     
           ]]></artwork>
        </figure>

        <t><xref target="push_change_update_notif_example_json_fig"/>
				provides an example of a JSON encoded, <xref target="RFC7951"/>,
        push-change-update notification message over HTTPS-based <xref
        target="I-D.ietf-netconf-https-notif"/> or UDP-based <xref
        target="I-D.ietf-netconf-udp-notif"/> transport and <xref
        target="I-D.ietf-netconf-notif-envelope"/> with hostname,
        sequence-number, observation timestamp and point-in-time as
        extensions.</t>

        <figure anchor="push_change_update_notif_example_json_fig"
        title="JSON YANG-Push Example for a push-change-update notification message">
          <artwork><![CDATA[
========== NOTE: '\' line wrapping per RFC 8792) ===========

{
  "ietf-yp-notification:envelope": {
    "event-time": "2023-03-25T08:30:11.22Z",
    "hostname": "example-router",
    "sequence-number": 1,
    "notification-contents": {
      "ietf-yang-push:push-change-update": {
        "id": 2222,
        "ietf-yp-observation:timestamp": \
        "2023-03-25T08:30:11.22Z",
        "ietf-yp-observation:point-in-time": \
        "state-changed",
        "datastore-contents": {
          "yang-patch": {
            "patch-id": "patch_54",
            "comment": "Changing encoding to JSON and increasing \
            the period to 10 minutes",
            "edit": [
              {
                "edit-id": "id_change_1",
                "operation": "merge",
                "target": "/ietf-subscribed-notifications\:subs\
                criptions/subscription[id=2222]",
                "value": {
                  "ietf-subscribed-notifications:encoding": \
                  "ietf-subscribed-notifications:encode-json",
                  "ietf-yang-push:periodic": {
                    "period": 60000
                  }          
                }
              }
            }
          ]
        }
      }
    }
  }
}    
           ]]></artwork>
        </figure>
      </section>

      <section anchor="YANG_Push_Receiver" title="YANG-Push Receiver">
        <t>For all the YANG modules and revisions of each hostname and
        Subscription ID in the subscription state change notification
				received in step number (3) in the workflow diagram, all the
				YANG module dependencies need to be determined through the <xref
        target="RFC8525">YANG Library</xref> and the import statements
				in the YANG modules. The dependencies include: imports,
				augments, deviations and features being used for each
				YANG module. Through NETCONF &lt;get-schema&gt; RPC calls, 
				<xref target="RFC6022"/>, all YANG modules need to be retrieved
				as described in step (4) in the workflow diagram. </t>

        <t><xref target="RFC8525">YANG Library</xref> already supports
				the discovery of submodules, deviations and features but misses
				augments. <xref
				target="I-D.ietf-netconf-yang-library-augmentedby"/> extends the
				YANG Library so that also the list of YANG modules which have
				direct augmentations are listed.</t>

        <t>A change in xpath or sub-tree filter or module name in the
        subscription state change notifications indicates that the
				subscribed path has changed. A change in revision indicates that
				the version of the YANG module of the subscribed path has
				changed, where revision-label indicates wherever the revision
				was backward compatible or not. YANG Libary content-id changes
				indicates that there were potential semantic changes in the
				augmented or imported YANG modules of the subscribed xpath or
				sub-tree. If no change to previous subscription state is
				observed, step 4 can be omitted.</t>

        <t>Figure 9 in Section 4.1 and YANG module in Section 5 of
				<xref target="RFC8641"/> defines the payload of YANG-push
				notifications where "datastore-contents" or the "value" of a
				"push-change-update") is "anydata". <xref
				target="I-D.netana-nmop-yang-anydata-validation"/> extends
				<xref section="7.10" sectionFormat="of" target="RFC7950"/>
				by describing how validate Schema integrity of the anydata
				content.</t>
      </section>

      <section anchor="YANG_Schema_Registry" 
			         title="YANG Schema Registry">
        <t>The schema registry SHOULD support YANG as the format for
				defining schema and has the ability to store metadata along with
				the schema. For each schema registered into the schema registry,
				a schema ID is returned. That schema ID can be used when
				interacting with the Message Broker to indicate the schema to
				use with the message.</t>

        <t>Confluent Schema Registry is pluggable. Currently Supports
				AVRO, JSON Schema and Protobuf. The YANG support is being
				developed at <xref target="Yak24"/> as part of this
				architecture. Enable to register, obtain and compare <xref
				target="YSR24"/> YANG Schemas. One YANG Schema with all its
				augmentations is being registered per YANG-Push subscription ID
				along with metadata describing which YANG features were enabled
				for the registered YANG schema. For each YANG Schema a locally
				significant Schema ID is being issued as described in step (7)
				in the workflow diagram.</t>

        <figure anchor="YSR_post_ietf-interfaces"
                title="Register ietf-interfaces.yang into YANG Schema Registry">
          <artwork><![CDATA[
curl -X POST -H "Content Type: application/vnd.schemaregistry.v1+json"
-d @ietf-interfaces@2018-02-20.json 
http://localhost:8081/subjects/ietf-interfaces/

        ]]></artwork>
        <artwork><![CDATA[
{
 "schemaType": "YANG",
 "references": [
  {
   "name": "ietf-interfaces",
   "subject": "ietf-interfaces",
   "version": "2018-02-20",
  }
 ],
  "metadata": {
    "tags": {
      "features": ["arbitrary-names", "if-mib"]
    }
  },
 "schema": "... yang schema text"
}
        ]]></artwork>
        </figure>

        <figure anchor="YSR_list_all_subjects"
                title="List all subjects YANG Schema Registry">
          <artwork><![CDATA[
curl http://localhost:8081/subjects/ subjects/ | jq
        ]]></artwork>
        </figure>

        <figure anchor="YSR_list_versions_of_a_subject"
                title="List versions of a given subject in YANG Schema Registry">
          <artwork><![CDATA[
curl http://localhost:8081/subjects/ietf-interfaces/versions
        ]]></artwork>
        </figure>

        <figure anchor="YSR_retrieve_schema_of_subject_version"
                title="Retrieve schema of a specific subject and version in YANG Schema Registry">
          <artwork><![CDATA[
curl http://localhost:8081/subjects/ietf-interfaces/versions/1

        ]]></artwork>
          <artwork><![CDATA[
{
 "schemaType": "YANG",
 "subject": "ietf-interfaces",
 "version": 2018-02-20,
 "id": 1,
 "references": [
  {
   "name": "ietf-yang-types",
   "subject": "ietf-yang-types",
   "version": "2013-07-15",
  }
 ],
  "metadata": {
    "tags": {
      "features": ["arbitrary-names", "if-mib"]
    }
  },

 "schema": "... yang schema text"
}
        ]]></artwork>				
        </figure>
      </section>

      <section anchor="Stream_Catalog" title="Stream Catalog">
        <t>The YANG schemas in the YANG schema registry are made
				accessible to the Stream Catalog where users have an overview
				and search on available semantics in the Message Broker.</t>
      </section>

      <section anchor="YANG_Message_Broker_Producer"
               title="YANG Message Broker Producer">
        <t>The previously issued Schema ID is prefixed to the metadata
				augmented YANG push push-update message previously described in 
				<xref target="YANG_Push_Receiver"/> before serialized to a
				Message Broker topic in step (8) of the workflow diagram.</t>

        <t><xref section="2" sectionFormat="of"
        target="I-D.ietf-nmop-message-broker-telemetry-message"/> 
        defines the envelope schema of the message facilitating the 
				YANG-Push and different types of provenance metadata.</t>
      </section>

      <section anchor="YANG_Message_Broker_Consumer"
               title="YANG Message Broker Consumer">
        <t>From the Message Broker topic the message is being consumed
				and the prefixed Schema ID is being used in step (10) of the
				workflow diagram to retrieve the YANG Schema to validate the
				Schema integrity of the message.</t>

        <t>In order to validate Schema integrity, the event stream
				filter of the Subscription ID in the subscription started 
				notification <xref section="4.3.1" sectionFormat="of"
        target="RFC8641"/> or telemetry message <xref section="3"
				sectionFormat="of"
				target="I-D.ietf-nmop-message-broker-telemetry-message"/> is
				needed to apply <xref
				target="I-D.netana-nmop-yang-anydata-validation"/> on
        the YANG schema tree.</t>
      </section>

      <section anchor="YANG_Data_Consumer" title="YANG Data Consumer">
        <t>The data storage ingestion specifications are being derived
				with the in <xref target="YANG_Message_Broker_Consumer"/>
				already retrieved Schema ID and YANG-Push push-update messages
				can be now ingested and indexed into the data storage table
				according to their schema in step (12).</t>

        <t>By tracking the YANG-Push notification sequence-number for a
				given hostname as defined in <xref section="3.4"
				sectionFormat="of" target="I-D.ietf-netconf-notif-envelope"/>
				loss can be recognized accross the YANG data processing chain.
				By taking the event-time in the YANG-Push notification header
				and the time the YANG-Push notification messages was consumed
				into account, the serialization delay between YANG-Push
				publisher and YANG Data Consumer can be measured.</t>
    
        <t>The loss rate and delay for a given hostname can be used as a
        Service Level Indicator for the YANG data product in the <xref
        target="Deh22">Data Mesh</xref>.</t>
      </section>

      <section anchor="YANG_Data_Storage" title="YANG Data Storage">
        <t>The YANG data is ingested in step (12)according to the
        previously defined ingestion specification and indexed with the
				observation timestamp as defined in <xref
        section="3.5.1" sectionFormat="of"
        target="I-D.ietf-netconf-notif-envelope"/>. A network operator
        is now able to query the previously subscribed YANG data.</t>
      </section>
    </section>

    <section anchor="Implementation" title="Implementation Status">
      <t>Note to the RFC-Editor: Please remove this section and
			its corresponding references before publishing.</t>

      <t>This section records the status of known implementations of the
      protocol defined by this specification at the time of posting of
			this Internet-Draft, and is based on a proposal described in <xref
      target="RFC7942"/>. The description of implementations in this
			section is intended to assist the IETF in its decision processes
			in progressing drafts to RFCs. Please note that the listing of any
			individual implementation here does not imply endorsement by the
			IETF. Furthermore, no effort has been spent to verify the
			information presented here that was supplied by IETF contributors.
			This is not intended as, and must not be construed to be, a
			catalog of available implementations or their features. Readers
			are advised to note that other implementations may exist.</t>

      <t>According to <xref target="RFC7942"/>, "this will allow
			reviewers and working groups to assign due consideration to
			documents that have the benefit of running code, which may serve
			as evidence of valuable experimentation and feedback that have
			made the implemented protocols more mature. It is up to the
			individual working groups to use this information as they see 
			fit".</t>

      <section anchor="YANG_Schema_Registry_Extension"
               title="YANG Schema Registry Extension">
        <t>Ahmed Elhassany developed a YANG Schema Extension in
				Confluent Schema Registry.</t>

        <t>The source code can be obtained here: <xref target="YSR24"/>,
				the progress report here: <xref target="YSRPR24"/>, and was
				validated at the IETF 117 and 123 hackathon.</t>
      </section>

      <section anchor="YANG-Push_Receiver_Parsing_Library"
               title="YANG-Push Receiver Parsing Library">
        <t>Zhuoyao Lin developed as part of her internship a library to
				parse YANG-Push subscription notifications, identify YANG module
        dependencises with <xref target="RFC8525">YANG Library</xref> and
        obtain with NETCONF &lt;get-schema&gt; rpc calls <xref
        target="RFC6022"/> all YANG modules from YANG-Push publisher.
				</t>

        <t>The source code can be obtained here: <xref target="LYP23"/>
				and was validated at the IETF 117 hackathon.</t>
      </section>

      <section anchor="YANG-Library_Augmented-by-Addition"
               title="YANG Library Augmented-by Addition">
        <t>Zhuoyao Lin implemented <xref
        target="I-D.ietf-netconf-yang-library-augmentedby"/> in order to
        discover augmented-by YANG modules in <xref
				target="RFC8525">YANG Library</xref>.</t>

        <t>The source code can be obtained here: <xref target="YLA24"/>
				and was validated at the IETF 119 hackathon.</t>
      </section>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>TBD</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>The authors would like to thank Yannick Buchs, Benoit Claise, 
      Mohamed Boucadair, Dhruv Dhody, Qin Wu, Andy Bierman, Feng Chong,
      Holger Keller, Kristian Larsson, Ignacio Dominguez
      Martinez-Casanueva, Paul Aitken and Reshad Rahman for their review
			and valuable comments. Alex Huang Feng, Jean Quilbeuf and Huoyao
			Lin for review and contributing code and providing examples and
			inputs to the open points.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include='reference.RFC.2119'?>

      <?rfc include='reference.RFC.6022'?>

      <?rfc include='reference.RFC.7950'?>

      <?rfc include='reference.RFC.8174'?>

      <?rfc include='reference.RFC.8639'?>

      <?rfc include='reference.RFC.8641'?>

      <?rfc include='reference.RFC.8792'?>

      <?rfc include='reference.RFC.9196'?>

      <?rfc include='reference.RFC.9254'?>

      <?rfc include='reference.I-D.ietf-nmop-message-broker-telemetry-message'?> 
      
      <?rfc include='reference.I-D.ietf-netconf-notif-envelope'?> 

      <?rfc include='reference.I-D.ietf-netconf-yang-notifications-versioning'?>

      <?rfc include='reference.I-D.ietf-netconf-yp-transport-capabilities'?>

      <?rfc include='reference.I-D.ietf-netconf-yang-library-augmentedby'?>
    </references>

    <references title="Informative References">
      <?rfc include='reference.RFC.3535'?>

      <?rfc include='reference.RFC.5277'?>

      <?rfc include='reference.RFC.6241'?>

      <?rfc include='reference.RFC.6991'?>

      <?rfc include='reference.RFC.7942'?>

      <?rfc include='reference.RFC.7951'?>

      <?rfc include='reference.RFC.8040'?>

      <?rfc include='reference.RFC.8525'?>

      <?rfc include='reference.RFC.8526'?>

      <?rfc include='reference.RFC.8528'?>

      <?rfc include='reference.RFC.8640'?>

      <?rfc include='reference.RFC.9144'?>

      <?rfc include='reference.RFC.9232'?>

      <?rfc include='reference.I-D.ietf-netconf-https-notif'?>

      <?rfc include='reference.I-D.ietf-netconf-udp-notif'?>

      <?rfc include='reference.I-D.ietf-netconf-distributed-notif'?>

      <?rfc include='reference.I-D.netana-nmop-yang-anydata-validation'?>

      <reference anchor="W3C.REC-xml-20081126"
                 derivedAnchor="W3C.REC-xml-20081126" quoteTitle="true"
                 target="https://www.w3.org/TR/2008/REC-xml-20081126">
        <front>
          <title>Extensible Markup Language (XML) 1.0 (Fifth Edition)</title>

          <author fullname="Tim Bray" initials="T." surname="Bray">
            <organization showOnFrontPage="true"/>
          </author>

          <author fullname="Jean Paoli" initials="J." surname="Paoli">
            <organization showOnFrontPage="true"/>
          </author>

          <author fullname="Michael Sperberg-McQueen" initials="M."
                  surname="Sperberg-McQueen">
            <organization showOnFrontPage="true"/>
          </author>

          <author fullname="Eve Maler" initials="E." surname="Maler">
            <organization showOnFrontPage="true"/>
          </author>

          <author fullname="Francois Yergeau" initials="F." surname="Yergeau">
            <organization showOnFrontPage="true"/>
          </author>

          <date month="November" year="2008"/>
        </front>

        <refcontent>World Wide Web Consortium Recommendation
        REC-xml-20081126</refcontent>
      </reference>

      <reference anchor="Deh22"
                 target="https://www.oreilly.com/library/view/data-mesh/9781492092384/">
        <front>
          <title>Data Mesh</title>

          <author fullname="Zhamak Dehghani" initials="Z." surname="Dehghani"/>

          <date month="March" year="2022"/>
        </front>

        <seriesInfo name="ISBN" value="9781492092391"/>

        <refcontent>O'Reilly Media</refcontent>
      </reference>

      <reference anchor="Pul16" target="https://pulsar.apache.org/">
        <front>
          <title>Apache Pulsar</title>

          <author fullname="Sijie Guo" initials="S." surname="Guo"/>
 
          <author fullname="Matteo  Merli" initials="M." surname="Merli"/>

          <date month="January" year="2016"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="Atl15" target="https://atlas.apache.org/">
        <front>
          <title>Apache Atlas</title>

          <author fullname="Hortonworks"/>

          <date month="May" year="2015"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="YSR24"
                 target="https://github.com/network-analytics/yang-kafka-integration">
        <front>
          <title>YANG Schema Registry Extension</title>

          <author fullname="Ahmed Elhassany" initials="A." surname="Elhassany"/>
          <author fullname="Alex Huang-Feng" initials="A." surname="Huang-Feng"/>

          <date month="February" year="2024"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="YSRPR24"
                 target="https://github.com/network-analytics/ietf-network-analytics-document-status/blob/main/123/Hackathon/ietf-123-hackathon-validate-yang-push-publisher.pdf">
        <front>
          <title>YANG Schema Registry Extension Progress Report</title>

          <author fullname="Ahmed Elhassany" initials="A." surname="Elhassany"/>

          <date month="July" year="2025"/>
        </front>
      </reference>

      <reference anchor="LYP23"
                 target="https://github.com/network-analytics/libyangpush/">
        <front>
          <title>libyangpush</title>

          <author fullname="Zhuoyao Lin" initials="Z." surname="Lin"/>

          <date month="September" year="2023"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="YLA24"
                 target="https://github.com/Zephyre777/draft-lincla-netconf-yang-library-augmentation/">
        <front>
          <title>libyangpush</title>

          <author fullname="Zhuoyao Lin" initials="Z." surname="Lin"/>

          <date month="March" year="2024"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="Yak24"
                 target="https://github.com/network-analytics/yang-kafka-integration">
        <front>
          <title>Yangkit</title>

          <author fullname="Frank Feng" initials="F." surname="Feng"/>

          <date month="February" year="2024"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="Netgauze_Github"
                 target="https://github.com/NetGauze/NetGauze/">
        <front>
          <title>Netgauze open source Network Telemetry Data
          Collection</title>
 
          <author/>
 
          <date/>
        </front>
      </reference>

      <reference anchor="Kaf11" target="https://kafka.apache.org/">
        <front>
          <title>Apache Kafka</title>

          <author fullname="Neha Narkhede" initials="N." surname="Narkhede"/>

          <date month="January" year="2011"/>
        </front>

        <refcontent>Apache Software Foundation</refcontent>
      </reference>

      <reference anchor="Con18"
                 target="https://github.com/confluentinc/schema-registry/">
        <front>
          <title>Confluent Schema Registry</title>

          <author fullname="Robert Yokota" initials="R." surname="Yokota"/>

          <date month="December" year="2018"/>
        </front>

        <refcontent>Confluent Community and Apache Software
        Foundation</refcontent>
      </reference>

      <reference anchor="ConDoc18"
                 target="https://docs.confluent.io/platform/current/schema-registry/">
        <front>
          <title>Confluent Schema Registry Documentation</title>

          <author fullname="Robert Yokota " initials="R." surname="Yokota"/>

          <date month="December" year="2018"/>
        </front>

        <refcontent>Confluent Community and Apache Software
        Foundation</refcontent>
      </reference>
    </references>

    <section anchor="Project_Milestones" title="Project Milestones">
      <t>IETF 115:</t>

      <ul>
        <li>Official Project Kickoff.</li>

        <li><xref target="I-D.ietf-netconf-yang-notifications-versioning"/>
        extends schema reference in subscription state change
        notification.</li>
      </ul>

      <t>IETF 116:</t>

      <ul>
        <li>YANG module with augmentations can be registered in Confluent
        Schema Registry with YANG extension <xref target="Yak24"/>.</li>

        <li>draft-tgraf-netconf-notif-sequencing extends
        NETCONF notification header with sysName, messagePublisherId and
        sequencedraft-tgraf-netconf-notif-sequencing Number.</li>

        <li>draft-tgraf-netconf-yang-push-observation-time
        extends YANG-Push push-update or push-change-update message with
        observation-time or state-changed-observation-time.</li>

        <li>draft-ahuang-netconf-notif-yang defines the NETCONF
        notification header specified in <xref target="RFC5277"/> in
        YANG.</li>
      </ul>

      <t>IETF 118:</t>

      <ul>
        <li>All relevant YANG modules for a subscribed xpath can be
				determined through the <xref
				target="RFC8525">YANG Library</xref> and retrieved throug
				NETCONF &lt;get-schema&gt; rpc calls according to <xref
        target="RFC6022"/>. Gap in YANG library addressed in <xref
        target="I-D.ietf-netconf-yang-library-augmentedby"/>.</li>
      </ul>

      <t>IETF 119:</t>

      <ul>
        <li><xref target="I-D.netana-nmop-yang-anydata-validation"/>
				addresses that anydata modeled nodes can be validated with
				YANG Library RFC 8525. 6WIND VSR and Huawei VRP YANG-Push
				publisher and open-source <xref
        target="I-D.ietf-netconf-yang-library-augmentedby"/>
				implementation validated at hackathon.</li>
      </ul>

      <t>IETF 120:</t>

      <ul>
        <li>6WIND VSR, Huawei VRP and Cisco IOS XR <xref
				target="YANG_Push_Publisher">YANG-Push Publisher</xref>
				implementations validated at hackathon.</li>
    
        <li>draft-tgraf-netconf-yang-push-observation-time
        merges both timestamps for periodical and on-change YANG-Push
        subscriptions into one observation timestamp and adding a
				point-in-time decalaration to describe when the observation was
				observed.</li>
      </ul>

      <t>IETF 121:</t>

      <ul>
        <li>6WIND VSR, Huawei VRP and Cisco IOS XR <xref
				target="YANG_Push_Publisher">YANG-Push Publisher</xref>
				implementations supporting, <xref
				target="I-D.ietf-netconf-udp-notif"/>, <xref
				target="I-D.ietf-netconf-distributed-notif"/>,
				draft-tgraf-netconf-yang-push-observation-time and <xref
        target="I-D.ietf-netconf-yang-notifications-versioning"/>
				validated at hackathon.</li>
    
        <li><xref target="I-D.netana-nmop-yang-anydata-validation"/>
				with YANG schema registry and message broker YANG data producer
				and consumer implementation validated at hackathon.</li>
    
        <li>Validated at hackathon based on <xref
        target="I-D.ietf-netconf-yang-notifications-versioning"/> that
				with <xref target="I-D.ietf-netconf-yang-library-augmentedby"/>
				all datastore-subtree-filter or datastore-xpath-filter
				referenced YANG modules and their dependencies can be fully
				identified.</li>
      </ul>

      <t>IETF 122,123 and 124:</t>

      <ul>
        <li>6WIND VSR, Huawei VRP and Cisco IOS XR <xref
				target="YANG_Push_Publisher">YANG-Push Publisher</xref>
				implementations supporting, <xref
				target="I-D.ietf-netconf-udp-notif"/>, <xref
				target="I-D.ietf-netconf-distributed-notif"/>, <xref
				target="I-D.ietf-netconf-yp-transport-capabilities"/>, <xref
        target="I-D.ietf-netconf-notif-envelope"/>, <xref
        target="I-D.ietf-netconf-yang-notifications-versioning"/> and
        <xref target="I-D.ietf-netconf-yang-library-augmentedby"/>
        validated at hackathon.</li>
    
        <li>Validate from Manage YANG-Push Subscription to YANG Data
				Consumer end to end all components of this architecture.</li>
      </ul>

      <t>IETF 125:</t>

      <ul>
        <li>6WIND VSR, Huawei VRP and Cisco IOS XR <xref
				target="YANG_Push_Publisher">YANG-Push Publisher</xref>
				implementations supporting, <xref
				target="I-D.ietf-netconf-udp-notif"/>, <xref
				target="I-D.ietf-netconf-distributed-notif"/>, <xref
				target="I-D.ietf-netconf-yp-transport-capabilities"/>, <xref
        target="I-D.ietf-netconf-notif-envelope"/>, <xref
        target="I-D.ietf-netconf-yang-notifications-versioning"/> and
        <xref target="I-D.ietf-netconf-yang-library-augmentedby"/>.
				</li>

        <li>Arrcus Arcos <xref
				target="YANG_Push_Publisher">YANG-Push Publisher</xref>
				implementation supporting, <xref
				target="I-D.ietf-netconf-udp-notif"/>, <xref
				target="I-D.ietf-netconf-yp-transport-capabilities"/> and <xref
        target="I-D.ietf-netconf-notif-envelope"/>.</li>

        <li>NetGauze Network Telemetry data collection <xref
				target="Netgauze_Github"/> supporting <xref
				target="YANG_Push_Receiver">YANG-Push Receiver</xref>, <xref
				target="YANG_Message_Broker_Producer">YANG Message Broker
				Producer</xref> and <xref
				target="YANG Message_Broker_Consumer">YANG Message Broker
				Consumer</xref>.</li>

        <li>Ciena Blue Planet UAA supporting <xref
				target="YANG Message_Broker_Consumer">YANG Message Broker
				Consumer</xref>.</li>

        <li>Confluent YANG Schema Registry plugin <xref target="Yak24"/>
				supporting <xref target="YANG_Schema_Registry">YANG Schema
				Registry</xref>.</li>
    
        <li>Validate from Manage YANG-Push Subscription to YANG Data
				Consumer end to end all components of this architecture.</li>
      </ul>
    </section>
  </back>
</rfc>