rfc9418xml2.original.xml | rfc9418.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <!DOCTYPE rfc [ | |||
<!ENTITY nbsp " "> | ||||
<!ENTITY zwsp "​"> | ||||
<!ENTITY nbhy "‑"> | ||||
<!ENTITY wj "⁠"> | ||||
]> | ]> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
<?rfc toc="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category=" | |||
<?rfc tocompact="yes"?> | std" consensus="true" ipr="trust200902" docName="draft-ietf-opsawg-service-assur | |||
<?rfc tocdepth="4"?> | ance-yang-11" number="9418" obsoletes="" updates="" xml:lang="en" tocInclude="tr | |||
<?rfc tocindent="yes"?> | ue" tocDepth="4" | |||
<?rfc symrefs="yes"?> | symRefs="true" sortRefs="true" version="3"> | |||
<?rfc sortrefs="yes"?> | ||||
<?rfc comments="yes"?> | <!-- xml2rfc v2v3 conversion 3.16.0 --> | |||
<?rfc inline="yes"?> | ||||
<?rfc compact="yes"?> | ||||
<?rfc subcompact="no"?> | ||||
<rfc category="std" ipr="trust200902" docName="draft-ietf-opsawg-service-assuran | ||||
ce-yang-11"> | ||||
<front> | <front> | |||
<title abbrev="YANG Modules for Service Assurance">YANG Modules for Service | <title abbrev="A YANG Data Model for Service Assurance">A YANG Data Model fo | |||
Assurance</title> | r Service Assurance</title> | |||
<seriesInfo name="RFC" value="9418"/> | ||||
<author fullname="Benoit Claise" initials="B" surname="Claise"> | <author fullname="Benoit Claise" initials="B" surname="Claise"> | |||
<organization>Huawei</organization> | <organization>Huawei</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>benoit.claise@huawei.com</email> | <email>benoit.claise@huawei.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Jean Quilbeuf" initials="J" surname="Quilbeuf "> | <author fullname="Jean Quilbeuf" initials="J" surname="Quilbeuf "> | |||
<organization>Huawei</organization> | <organization>Huawei</organization> | |||
<address> | <address> | |||
<email>jean.quilbeuf@huawei.com</email> | <email>jean.quilbeuf@huawei.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Paolo Lucente" initials="P." surname="Lucente"> | <author fullname="Paolo Lucente" initials="P." surname="Lucente"> | |||
<organization>NTT</organization> | <organization>NTT</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Siriusdreef 70-72</street> | <street>Siriusdreef 70-72</street> | |||
<city>Hoofddorp</city> | <city>Hoofddorp</city> | |||
<region>WT</region> | ||||
<code>2132</code> | <code>2132</code> | |||
<country>Netherlands</country> | <country>Netherlands</country> | |||
</postal> | </postal> | |||
<email>paolo@ntt.net</email> | <email>paolo@ntt.net</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Paolo Fasano" initials="P" surname="Fasano"> | <author fullname="Paolo Fasano" initials="P" surname="Fasano"> | |||
<organization>TIM S.p.A</organization> | <organization>TIM S.p.A</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>via G. Reiss Romoli, 274</street> | <street>via G. Reiss Romoli, 274</street> | |||
<city>10148 Torino</city> | <city>Torino</city> | |||
<code>10148</code> | ||||
<country>Italy</country> | <country>Italy</country> | |||
</postal> | </postal> | |||
<email>paolo2.fasano@telecomitalia.it</email> | <email>paolo2.fasano@telecomitalia.it</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Thangam Arumugam" initials="T" surname="Arumugam"> | <author fullname="Thangam Arumugam" initials="T" surname="Arumugam"> | |||
<organization>Cisco Systems, Inc.</organization> | <organization>Consultant</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city>Milpitas (California)</city> | <city>Milpitas</city> | |||
<country>United States</country> | <region>California</region> | |||
<country>United States of America</country> | ||||
</postal> | </postal> | |||
<email>tarumuga@cisco.com</email> | <email>thangavelu@yahoo.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date/> | <date year="2023" month="June" /> | |||
<area>OPS</area> | <area>ops</area> | |||
<workgroup>OPSAWG</workgroup> | <workgroup>opsawg</workgroup> | |||
<keyword>health</keyword> | ||||
<keyword>SAIN</keyword> | ||||
<keyword>subservice</keyword> | ||||
<keyword>symptom</keyword> | ||||
<keyword>telemetry</keyword> | ||||
<abstract> | <abstract> | |||
<t> | <t> | |||
This document specifies YANG modules for representing assurance graphs. | This document specifies YANG modules for representing assurance graphs. | |||
These graphs represent the assurance of a given service by decomposing i t into atomic assurance elements called subservices. | These graphs represent the assurance of a given service by decomposing i t into atomic assurance elements called subservices. | |||
A companion document, Service Assurance for Intent-based Networking Arch itecture, presents an architecture for implementing the assurance of such servic es. | The companion document, "Service Assurance for Intent-Based Networking A rchitecture" (RFC 9417), presents an architecture for implementing the assurance of such services. | |||
</t> | </t> | |||
<t> | <t> | |||
The YANG data models in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342. | The YANG data models in this document conform to the Network Management Datastore Architecture (NMDA) defined in RFC 8342. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="intro" title="Introduction"> | <section anchor="intro" numbered="true" toc="default"> | |||
<name>Introduction</name> | ||||
<t> | <t> | |||
<xref target="I-D.ietf-opsawg-service-assurance-architecture"/> describe s an architecture and a set of involved components for service assurance, called Service Assurance for Intent-Based Networking (SAIN). | <xref target="RFC9417" format="default"/> describes an architecture and a set of involved components for service assurance, called Service Assurance for Intent-based Networking (SAIN). | |||
This document complements the architecture by specifying a data model fo r the interfaces between components. | This document complements the architecture by specifying a data model fo r the interfaces between components. | |||
More specifically, the document provides YANG modules for the purpose of service assurance in a format that is: | More specifically, the document provides YANG modules for the purpose of service assurance in a format that is: | |||
<list style="symbols"> | ||||
<t>machine-readable</t> | ||||
<t>vendor independent</t> | ||||
<t>augmentable such that SAIN agents from Figure 1 of <xref target="I- | ||||
D.ietf-opsawg-service-assurance-architecture"/> can support and expose new subse | ||||
rvices to SAIN orchestrators and collectors.</t> | ||||
</list> | ||||
</t> | </t> | |||
<section title="Terminology" anchor="terminology"> | <ul spacing="normal"> | |||
<t> | <li>machine readable,</li> | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <li>vendor independent, and</li> | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | <li>augmentable such that SAIN agents from Figure 1 of <xref target="RFC | |||
"MAY", and "OPTIONAL" in this document are to be interpreted as | 9417" format="default"/> can support and expose new subservices to SAIN orchestr | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174" | ators and collectors.</li> | |||
/> | </ul> | |||
when, and only when, they appear in all capitals, as shown here. | <section anchor="terminology" numbered="true" toc="default"> | |||
</t> | <name>Terminology</name> | |||
<t> | <t> | |||
The terms used in this document are defined in <xref target="I-D.ie | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
tf-opsawg-service-assurance-architecture"/>. | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
</t> | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
<t> | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
The meanings of the symbols in the tree diagrams are defined in <xre | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
f target="RFC8340"/>. | be interpreted as | |||
</t> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
</section> | when, and only when, they appear in all capitals, as shown here. | |||
</t> | ||||
<t> | ||||
The terms used in this document are defined in <xref target="RFC941 | ||||
7" format="default"/>. | ||||
</t> | ||||
<t> | ||||
The meanings of the symbols in the tree diagrams are defined in <xre | ||||
f target="RFC8340" format="default"/>. | ||||
</t> | ||||
</section> | ||||
</section> | </section> | |||
<section anchor="capability_model" title="YANG Modules Overview"> | <section anchor="capability_model" numbered="true" toc="default"> | |||
<name>YANG Modules Overview</name> | ||||
<t> | <t> | |||
The main YANG module, "ietf-service-assurance" (<xref target="main-modu le"/>), defines objects for assuring network services based on their decompositi on into so-called subservices. | The main YANG module, "ietf-service-assurance" (<xref target="main-modu le" format="default"/>), defines objects for assuring network services based on their decomposition into so-called subservices. | |||
The subservices are hierarchically organized by dependencies. | The subservices are hierarchically organized by dependencies. | |||
The subservices, along with the dependencies, constitute an assurance gr aph. | The subservices, along with the dependencies, constitute an assurance gr aph. | |||
This module should be supported by an agent, able to interact with the d evices in order to produce a health status and symptoms for each subservice in a n assurance graph. | This module should be supported by an agent that is able to interact wit h the devices in order to produce the health statuses and symptoms for each subs ervice in an assurance graph. | |||
This module is intended for the following use cases: | This module is intended for the following use cases: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<li> | ||||
<t> | <t> | |||
Assurance graph configuration: | Assurance graph configuration: | |||
<list style="symbols"> | ||||
<t> | ||||
Subservices: configure a set of subservices to assure, by specif | ||||
ying their types and parameters. | ||||
</t> | ||||
<t> | ||||
Dependencies: configure the dependencies between the subservices | ||||
, along with their type. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
Assurance telemetry: export the assurance graph with health status a | ||||
nd symptoms for each node. | ||||
</t> | </t> | |||
</list> | <ul spacing="normal"> | |||
The module is also intended to be exported by the SAIN collector which a | <li> | |||
ggregates the output of several SAIN agents to provide the global assurance grap | Subservices: Configure a set of subservices to assure by specify | |||
h. | ing their types and parameters. | |||
</li> | ||||
<li> | ||||
Dependencies: Configure the dependencies between the subservices | ||||
, along with their types. | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
Assurance telemetry: Export the assurance graph with health statuses | ||||
and symptoms for each node. | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
The module is also intended to be exported by the SAIN collector that ag | ||||
gregates the output of several SAIN agents to provide the global assurance graph | ||||
. | ||||
In that case, only the telemetry export use case is considered. | In that case, only the telemetry export use case is considered. | |||
</t> | </t> | |||
<t> | <t> | |||
The modules presented in this document conform to the Network Managemen t Datastore Architecture defined in <xref target="RFC8342"/>. | The modules presented in this document conform to the Network Managemen t Datastore Architecture (NMDA) defined in <xref target="RFC8342" format="defaul t"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
The second YANG module, "ietf-service-assurance-device" (<xref target="d evice-module"/>), augments the "ietf-service-assurance" module by adding support for the device subservice. | The second YANG module, "ietf-service-assurance-device" (<xref target="d evice-module" format="default"/>), augments the "ietf-service-assurance" module by adding support for the device subservice. | |||
Additional subservice types might be added following a similar approach. | Additional subservice types might be added following a similar approach. | |||
</t> | </t> | |||
<t> | <t> | |||
The third YANG module, "ietf-service-assurance-interface" (<xref target= "interface-module"/>), augments the "ietf-service-assurance" module as well, by adding support for the interface subservice. | The third YANG module, "ietf-service-assurance-interface" (<xref target= "interface-module" format="default"/>), augments the "ietf-service-assurance" mo dule as well by adding support for the interface subservice. | |||
</t> | </t> | |||
<t> | <t> | |||
We provide additional examples in the appendix. | We provide additional examples in the appendix. | |||
The module "example-service-assurance-device-acme" (<xref target="acme-d evice-module"/>) augments the "ietf-service-assurance-device" module to customiz e it for devices of the fictional ACME Corporation. | The module "example-service-assurance-device-acme" (<xref target="acme-d evice-module" format="default"/>) augments the "ietf-service-assurance-device" m odule to customize it for devices of the fictional Acme Corporation. | |||
Additional vendor-specific parameters might be added following a similar approach. | Additional vendor-specific parameters might be added following a similar approach. | |||
We also provide the modules "example-service-assurance-ip-connectivity" and "example-service-assurance-is-is" (<xref target="ip-connectivity-is-is"/>) t o model the example in Figure 2 from Section 3.1 of <xref target="I-D.ietf-opsaw g-service-assurance-architecture"/>. | We also provide the modules "example-service-assurance-ip-connectivity" and "example-service-assurance-is-is" (<xref target="ip-connectivity-is-is" form at="default"/>) to model the example in Figure 2 from <xref target="RFC9417" sec tion="3.1" sectionFormat="of" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="main-module" numbered="true" toc="default"> | ||||
<section title="Base IETF Service Assurance YANG Module" anchor="main-module | <name>Base IETF Service Assurance YANG Module</name> | |||
"> | <section anchor="ietf-service-assurance-concepts" numbered="true" toc="def | |||
<section title="Concepts" anchor="ietf-service-assurance-concepts"> | ault"> | |||
<name>Concepts</name> | ||||
<t> | <t> | |||
The "ietf-service-assurance" YANG module assumes a set of subservices, | The "ietf-service-assurance" YANG module assumes a set of subservices | |||
to be assured independently. | to be assured independently. | |||
A subservice is a feature or a subpart of the network system that a gi | A subservice is a feature or a subpart of the network system that a gi | |||
ven service instance depends on. Examples of subservice types include: | ven service instance depends on. Examples of subservice types include the follow | |||
<list style="symbols"> | ing: | |||
<t> | </t> | |||
device: whether a device is healthy, and if not, what are the symp | <ul spacing="normal"> | |||
toms. | <li> | |||
Such a subservice might monitor the device resources such as CPU, | device: Whether a device is healthy, and if not, what are the symp | |||
RAM or Ternary Content-Addressable Memory (TCAM). | toms? | |||
Such a subservice might monitor the device resources, such as CPU, | ||||
RAM, or Ternary Content-Addressable Memory (TCAM). | ||||
Potential symptoms are "CPU overloaded", "Out of RAM", or "Out of TCAM". | Potential symptoms are "CPU overloaded", "Out of RAM", or "Out of TCAM". | |||
</t> | </li> | |||
<t> | <li> | |||
ip-connectivity: given two IP addresses bound to two devices, what | ip-connectivity: Given two IP addresses bound to two devices, what | |||
is the quality of the IP connectivity between them. | is the quality of the IP connectivity between them? | |||
Potential symptoms are "No route available" or "Equal Cost Multipl | Potential symptoms are "No route available" or "Equal-Cost Multipa | |||
e Paths (ECMP) Imbalance". | ths (ECMPs) imbalance". | |||
</t> | </li> | |||
</list> | </ul> | |||
<t> | ||||
An instance of the device subservice is representing a subpart of the network system, namely a specific device. | An instance of the device subservice is representing a subpart of the network system, namely a specific device. | |||
An instance of the ip-connectivity subservice representing a feature o | An instance of the ip-connectivity subservice is representing a featur | |||
f the network, namely the connectivity between two specific IP addresses on two | e of the network, namely the connectivity between two specific IP addresses on t | |||
devices. | wo devices. | |||
In both cases, these subservices might depend on other subservices, fo | In both cases, these subservices might depend on other subservices, fo | |||
r instance, the connectivity might depend on a subservice representing the routi | r instance, the connectivity might depend on a subservice representing the routi | |||
ng system and on a subservice representing ECMP. | ng system and on a subservice representing ECMPs. | |||
</t> | </t> | |||
<t> | <t> | |||
The two example subservices presented above need different sets of par ameters to fully characterize one of their instance. | The two example subservices presented above need different sets of par ameters to fully characterize one of their instances. | |||
An instance of the device subservice is fully characterized by a singl e parameter allowing to identify the device to monitor. | An instance of the device subservice is fully characterized by a singl e parameter allowing to identify the device to monitor. | |||
For ip-connectivity subservice, at least the device and IP address for both ends of the link are needed to fully characterize an instance. | For the ip-connectivity subservice, at least the device and IP address for both ends of the link are needed to fully characterize an instance. | |||
</t> | </t> | |||
<t> | <t> | |||
The base model presented in this section specifies a single type of su bservice, which represents service instances. | The base model presented in this section specifies a single type of su bservice, which represents service instances. | |||
Such nodes play a particular role in the assurance graph because they represent the starting point, or root, for the assurance graph of the correspond ing service instance. | Such nodes play a particular role in the assurance graph because they represent the starting point, or root, for the assurance graph of the correspond ing service instance. | |||
The parameters required to fully identify a service instance are the n ame of the service and the name of the service instance. | The parameters required to fully identify a service instance are the n ame of the service and the name of the service instance. | |||
To support other types of subservice such as 'device' or 'ip-connectiv ity', the "ietf-service-assurance" module is intended to be augmented. | To support other types of subservices, such as device or ip-connectivi ty, the "ietf-service-assurance" module is intended to be augmented. | |||
</t> | </t> | |||
<t> | <t> | |||
The dependencies are modelled as a list: each subservice contains a li st of references to its dependencies. | The dependencies are modeled as a list, i.e., each subservice contains a list of references to its dependencies. | |||
That list can be empty if the subservice instance does not have any de pendencies. | That list can be empty if the subservice instance does not have any de pendencies. | |||
</t> | </t> | |||
<t> | <t> | |||
By specifying service instances and their dependencies in terms of sub services, one defines a global assurance graph. | By specifying service instances and their dependencies in terms of sub services, one defines a global assurance graph. | |||
That assurance graph is the result of merging all the individual assur ance graphs for the assured service instances. | That assurance graph is the result of merging all the individual assur ance graphs for the assured service instances. | |||
Each subservice instance is expected to appear only one in the global | Each subservice instance is expected to appear only once in the global | |||
assurance graph even if several service instances depend on it. | assurance graph even if several service instances depend on it. | |||
For example, an instance of the device subservice is a dependency of e | For example, an instance of the device subservice is a dependency of e | |||
very service instance that rely on the corresponding device. | very service instance that relies on the corresponding device. | |||
The assurance graph of a specific service instance is the subgraph obt | The assurance graph of a specific service instance is the subgraph obt | |||
ained by traversing the global assurance graph through the dependencies starting | ained by traversing the global assurance graph through the dependencies, startin | |||
from the specific service instance. | g from the specific service instance. | |||
</t> | </t> | |||
<t> | <t> | |||
An assurance agent configured with such a graph is expected to produce | An assurance agent configured with such a graph is expected to produce | |||
, for each configured subservice: | , for each configured subservice, | |||
a health-status indicating how healthy the subservice is | a health status that indicates how healthy the subservice is. | |||
and when the subservice is not healthy, a list of symptoms explaining | If the the subservice is not healthy, the agent is expected to | |||
why the subservice is not healthy. | produce a list of symptoms explaining why the subservice is not healthy. | |||
</t> | </t> | |||
<!-- <t> | ||||
A symptom raised by an agent will need to be interpreted outside of th | ||||
e scope of the agent, as the result of several agents needs to be collected in o | ||||
rder to have a complete graph. | ||||
We use a pair of identifiers to fully identify a symptom: the agent id | ||||
entifier and the symptom identifier. | ||||
Each agent MUST have a unique id within the system. | ||||
Each symptom MUST have a unique id within the agent. | ||||
A list mapping agent-id and symptom-id to their description is include | ||||
d in the model and must provide the description for every symptom raised in the | ||||
assurance graph. | ||||
</t> --> | ||||
</section> | </section> | |||
<section title="Tree View" anchor="ietf-service-assurance-tree-view"> | <section anchor="ietf-service-assurance-tree-view" numbered="true" toc="de | |||
fault"> | ||||
<name>Tree View</name> | ||||
<t> | <t> | |||
The following tree diagram <xref target="RFC8340"/> | The following tree diagram <xref target="RFC8340" format="default"/> | |||
provides an overview of the "ietf-service-assurance" module. | provides an overview of the "ietf-service-assurance" module. | |||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: ietf-service-assurance | module: ietf-service-assurance | |||
+--ro assurance-graph-last-change yang:date-and-time | +--ro assurance-graph-last-change yang:date-and-time | |||
+--rw subservices | +--rw subservices | |||
| +--rw subservice* [type id] | | +--rw subservice* [type id] | |||
| +--rw type identityref | | +--rw type identityref | |||
| +--rw id string | | +--rw id string | |||
| +--ro last-change? yang:date-and-time | | +--ro last-change? yang:date-and-time | |||
| +--ro label? string | | +--ro label? string | |||
| +--rw under-maintenance! | | +--rw under-maintenance! | |||
| | +--rw contact string | | | +--rw contact string | |||
skipping to change at line 265 ¶ | skipping to change at line 272 ¶ | |||
| +--ro id string | | +--ro id string | |||
| +--ro description string | | +--ro description string | |||
+--ro assured-services | +--ro assured-services | |||
+--ro assured-service* [service] | +--ro assured-service* [service] | |||
+--ro service leafref | +--ro service leafref | |||
+--ro instances* [name] | +--ro instances* [name] | |||
+--ro name leafref | +--ro name leafref | |||
+--ro subservices* [type id] | +--ro subservices* [type id] | |||
+--ro type -> /subservices/subservice/type | +--ro type -> /subservices/subservice/type | |||
+--ro id leafref | +--ro id leafref | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</t> | ||||
<t> | <t> | |||
The date of last change "assurance-graph-last-change" is read only. | The date of the last change in "assurance-graph-last-change" is read o | |||
It must be updated each time the graph structure is changed by additio | nly. | |||
n or deletion of subservices, dependencies or modification of their configurable | It must be updated each time the graph structure is changed by additio | |||
attributes, including their maintenance status. | n or deletion of subservices and dependencies or modifications of their configur | |||
able attributes, including their maintenance statuses. | ||||
Such modifications correspond to a structural change in the graph. | Such modifications correspond to a structural change in the graph. | |||
The date of last change is useful for a client to quickly check if the | The date of the last change is useful for a client to quickly check if | |||
re is a need to update the graph structure. | there is a need to update the graph structure. | |||
A change in the health-score or symptoms associated to a service or su | A change in the health score or symptoms associated to a service or su | |||
bservice does not change the structure of the graph and thus has no effect on th | bservice does not change the structure of the graph, and thus has no effect on t | |||
e date of last change. | he date of the last change. | |||
</t> | </t> | |||
<t> | <t> | |||
The "subservice" list contains all the subservice instances currently | The "subservices" list contains all the subservice instances currently | |||
known by the server (i.e. SAIN agent or SAIN collector). | known by the server (i.e., SAIN agent or SAIN collector). | |||
A subservice declaration MUST provide: | A subservice declaration <bcp14>MUST</bcp14> provide the following: | |||
<list style="symbols"> | </t> | |||
<t> | <ul spacing="normal"> | |||
A subservice type ("type"): reference to an identity that inherits | ||||
from "subservice-base", which is the base identity for any subservice type. | <li> | |||
</t> | a subservice type ("type"): a reference to an identity that inheri | |||
<t> | ts from "subservice-base", which is the base identity for any subservice type | |||
An id ("id"): string uniquely identifying the subservice among tho | </li> | |||
se with the same type, | <li> | |||
</t> | an id ("id"): a string uniquely identifying the subservice among t | |||
</list> | hose with the same type | |||
</li> | ||||
</ul> | ||||
<t> | ||||
The type and id uniquely identify a given subservice. | The type and id uniquely identify a given subservice. | |||
</t> | </t> | |||
<t> | <t> | |||
The "last-change" indicates when the dependencies or maintenance sta tus of this particular subservice were last modified. | The "last-change" indicates when the dependencies or maintenance sta tus of this particular subservice were last modified. | |||
</t> | </t> | |||
<t> | <t> | |||
The "label" is a human-readable description of the subservice. | The "label" is a human-readable description of the subservice. | |||
</t> | </t> | |||
<t> | <t> | |||
The presence of "under-maintenance" container inhibits the emission of | The presence of the "under-maintenance" container inhibits the emissio | |||
symptoms for that subservice and subservices that depend on them. | n of symptoms for the subservice and subservices that depend on them. | |||
In that case, a "contact" MUST be provided to indicate who or which so | In that case, a "contact" <bcp14>MUST</bcp14> be provided to indicate | |||
ftware is responsible for the maintenance. | who or which software is responsible for the maintenance. | |||
See Section 3.6 of <xref target="I-D.ietf-opsawg-service-assurance-arc | See <xref target="RFC9417" section="3.6" sectionFormat="of" format="de | |||
hitecture"/> for a more detailed discussion. | fault"/> for a more detailed discussion. | |||
</t> | </t> | |||
<t> | <t> | |||
The "parameter" choice is intended to be augmented in order to describ e parameters that are specific to the current subservice type. | The "parameter" choice is intended to be augmented in order to describ e parameters that are specific to the current subservice type. | |||
This base module defines only the subservice type representing service instances. | This base module defines only the subservice type representing service instances. | |||
Service instances MUST be modeled as a particular type of subservice w | Service instances <bcp14>MUST</bcp14> be modeled as a particular type | |||
ith two parameters, "service" and "instance-name". | of subservice with two parameters: "service" and "instance-name". | |||
The "service" parameter is the name of the service defined in the netw | The "service" parameter is the name of the service defined in the netw | |||
ork orchestrator, for instance "point-to-point-l2vpn". | ork orchestrator, for instance, "point-to-point-l2vpn". | |||
The "instance-name" parameter is the name assigned to the particular i | The "instance-name" parameter is the name assigned to the particular i | |||
nstance to be assured, for instance the name of the customer using that instance | nstance to be assured, for instance, the name of the customer using that instanc | |||
. | e. | |||
</t> | </t> | |||
<t> | <t> | |||
The "health-score" contains a value normally between 0 and 100 indicat | The "health-score" contains a value normally between 0 and 100, indica | |||
ing how healthy the subservice is. | ting how healthy the subservice is. | |||
As mentioned in the health-score definition, the special value -1 can | As mentioned in the health score definition, the special value -1 can | |||
be used to specify that no value could be computed for that health-score, for in | be used to specify that no value could be computed for that health score, for in | |||
stance if some metric needed for that computation could not be collected. | stance, if some metric needed for that computation could not be collected. | |||
</t> | </t> | |||
<t> | <t> | |||
The "symptoms-history-start" is the cutoff date for reporting symptoms . | The "symptoms-history-start" is the cutoff date for reporting symptoms . | |||
Symptoms that were terminated before that date are not reported anymor e in the model. | Symptoms that were terminated before that date are not reported anymor e in the model. | |||
</t> | </t> | |||
<t> | <t> | |||
The status of each subservice contains a list of symptoms. | The status of each subservice contains a list of symptoms. | |||
Each symptom is specified by | Each symptom is specified by: | |||
<list style="symbols"> | </t> | |||
<t> an identifier "symptom-id" which identifies the symptom locally | <ul spacing="normal"> | |||
to an agent, </t> | <li> an identifier "symptom-id", which identifies the symptom locally | |||
<t> an agent identifier "agent-id" which identifies the agent raisi | to an agent, </li> | |||
ng the symptom,</t> | <li> an agent identifier "agent-id", which identifies the agent raisin | |||
<t> a "health-score-weight" specifying the impact to the health sc | g the symptom,</li> | |||
ore incurred by this symptom,</t> | <li> a "health-score-weight" specifying the impact to the health scor | |||
<t> a "start-date-time" indicating when the symptom became active a | e incurred by this symptom,</li> | |||
nd </t> | <li> a "start-date-time" indicating when the symptom became active, an | |||
<t> a "stop-date-time" indicating when the symptom stopped being ac | d</li> | |||
tive, that field is not present if the symptom is still active.</t> | <li> a "stop-date-time" indicating when the symptom stopped being acti | |||
</list> | ve (this field is not present if the symptom is still active).</li> | |||
</ul> | ||||
<t> | ||||
In order for the pair "agent-id" and "symptom-id" to uniquely identify a symptom, the following is necessary: | In order for the pair "agent-id" and "symptom-id" to uniquely identify a symptom, the following is necessary: | |||
<list style="symbols"> | </t> | |||
<t> The "agent-id" MUST be unique among all agents of the system </ | <ul spacing="normal"> | |||
t> | <li> "agent-id" <bcp14>MUST</bcp14> be unique among all agents of the | |||
<t> The "symptom-id" MUST be unique among all symptoms raised by th | system. </li> | |||
e agent </t> | <li> "symptom-id" <bcp14>MUST</bcp14> be unique among all symptoms rai | |||
</list> | sed by the agent. </li> | |||
</ul> | ||||
<t> | ||||
Note that "agent-id" and "symptom-id" are leafrefs pointing to the obj ects defined later in the document. | Note that "agent-id" and "symptom-id" are leafrefs pointing to the obj ects defined later in the document. | |||
While the combination of "symptom-id" and "agent-id" is sufficient as a unique key list, the "start-date-time" second key helps to sort and retrieve r elevant symptoms. | While the combination of "symptom-id" and "agent-id" is sufficient as a unique key list, the "start-date-time" second key helps to sort and retrieve r elevant symptoms. | |||
</t> | </t> | |||
<t> | <t> | |||
The "dependency" list contains the dependencies for the current subser vice. | The "dependency" list contains the dependencies for the current subser vice. | |||
Each of them is specified by a leafref to both "type" and "id" of the target dependencies. | Each of them is specified by a leafref to both "type" and "id" of the target dependencies. | |||
A dependency has a type indicated in the "dependency-type" field. Two types are specified in the model: | A dependency has a type indicated in the "dependency-type" field. Two types are specified in the model: | |||
<list style="symbols"> | </t> | |||
<t>Impacting: such a dependency indicates an impact on the health of | <ul spacing="normal"> | |||
the dependent,</t> | <li>Impacting: Such a dependency indicates an impact on the health of | |||
<t>Informational: such a dependency might explain why the dependent | the dependent.</li> | |||
has issues but does not impact its health.</t> | <li>Informational: Such a dependency might explain why the dependent h | |||
</list> | as issues but does not impact its health.</li> | |||
To illustrate the difference between "impacting" and "informational", | </ul> | |||
consider the interface subservice, representing a network interface. | <t> | |||
To illustrate the difference between "impacting" and "informational", | ||||
consider the interface subservice representing a network interface. | ||||
If the device to which the network interface belongs goes down, the ne twork interface will transition to a "down" state as well. | If the device to which the network interface belongs goes down, the ne twork interface will transition to a "down" state as well. | |||
Therefore, the dependency of the interface subservice towards the devi ce subservice is "impacting". | Therefore, the dependency of the interface subservice towards the devi ce subservice is "impacting". | |||
On the other hand, a dependency towards the ecmp-load subservice, whic | On the other hand, a dependency towards the ecmp-load subservice, whic | |||
h checks that the load between ECMP remains stable throughout time, is only "inf | h checks that the load between ECMPs remains stable throughout time, is only "in | |||
ormational". | formational". | |||
Indeed, services might be perfectly healthy even if the load distribut | Indeed, services might be perfectly healthy even if the load distribut | |||
ion between ECMP changed. | ion between ECMPs changed. | |||
However, such an instability might be a relevant symptom for diagnosin g the root cause of a problem. | However, such an instability might be a relevant symptom for diagnosin g the root cause of a problem. | |||
</t> | </t> | |||
<t> | <t> | |||
Within the container "agents", the list "agent" contains the list of s ymptoms per agent. | Within the container "agents", the list "agent" contains the list of s ymptoms per agent. | |||
The key of the list is the "id", which MUST be unique among agents of a given assurance system. | The key of the list is the "id", which <bcp14>MUST</bcp14> be unique a mong agents of a given assurance system. | |||
For each agent, the list "symptoms-description" maps an "id" to its "d escription". | For each agent, the list "symptoms-description" maps an "id" to its "d escription". | |||
The "id" MUST be unique among the symptoms raised by the agent. | The "id" <bcp14>MUST</bcp14> be unique among the symptoms raised by th e agent. | |||
</t> | </t> | |||
<t> | <t> | |||
Within the container "assured-services", the list "assured-service" co ntains the subservices indexed by assured service instances. | Within the container "assured-services", the list "assured-service" co ntains the subservices indexed by assured service instances. | |||
For each service type, identified by the "service" leaf, all instances | For each service type identified by the "service" leaf, all instances | |||
of that service are listed in the "instances" list. | of that service are listed in the "instances" list. | |||
For each instance, identified by the "name" leaf, the "subservices" l | For each instance identified by the "name" leaf, the "subservices" li | |||
ist contains all descendant subservices that are part of the assurance graph for | st contains all descendant subservices that are part of the assurance graph for | |||
that specific instance. | that specific instance. | |||
These imbricated lists provide a query optimization to get the list of | These imbricated lists provide a query optimization to get the list of | |||
subservices in that assurance graph in a single query, instead of recursively q | subservices in that assurance graph in a single query instead of recursively qu | |||
uerying the dependencies of each subservice, starting from the node representing | erying the dependencies of each subservice, starting from the node representing | |||
the service instance. | the service instance. | |||
</t> | </t> | |||
<t> | <t> | |||
The relation between the health score ("health-score") and the health- score-weight of the currently active symptoms is not explicitly defined in this document. | The relation between the health score ("health-score") and the "health -score-weight" of the currently active symptoms is not explicitly defined in thi s document. | |||
The only requirement is that a health score that is strictly smaller t han 100 (the maximal value) must be explained by at least one symptom. | The only requirement is that a health score that is strictly smaller t han 100 (the maximal value) must be explained by at least one symptom. | |||
A way to enforce that requirement is to first detect symptoms and then | A way to enforce that requirement is to first detect symptoms and then | |||
compute the health score based on the health-score-weight of the detected sympt | compute the health score based on the "health-score-weight" of the detected sym | |||
oms. | ptoms. | |||
As an example, such a computation could be to sum the health-score-wei | As an example, such a computation could be to sum the "health-score-we | |||
ght of the active symptoms, subtract that value from 100 and change the value to | ight" of the active symptoms, subtract that value from 100, and change the value | |||
0 if negative. | to 0 if the result is negative. | |||
The relation between health-score and health-score-weight is left to t | The relation between health score and "health-score-weight" is left to | |||
he implementor (of an agent <xref target="I-D.ietf-opsawg-service-assurance-arch | the implementor (of an agent <xref target="RFC9417" format="default"/>). | |||
itecture"/>). | ||||
</t> | </t> | |||
<t> | <t> | |||
Keeping the history of the graph structure is out of scope for this YA NG module. | Keeping the history of the graph structure is out of scope for this YA NG module. | |||
Only the current version of the assurance graph can be fetched. | Only the current version of the assurance graph can be fetched. | |||
In order to keep the history of the graph structure, some time-series database (TSDB) or similar storage must be used. | In order to keep the history of the graph structure, some time-series database (TSDB) or similar storage must be used. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="ietf-service-assurance-yang-model" numbered="true" toc="d | ||||
<section title="YANG Module" anchor="ietf-service-assurance-yang-model"> | efault"> | |||
<t><CODE BEGINS> file "ietf-service-assurance@2022-08-10.yang"</t> | <name>YANG Module</name> | |||
<figure> | <t> This model contains references to <xref target="RFC6991"/>. </t> | |||
<artwork><![CDATA[ | <sourcecode name="ietf-service-assurance@2023-06-02.yang" type="yang" ma | |||
rkers="true"><![CDATA[ | ||||
module ietf-service-assurance { | module ietf-service-assurance { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance"; | namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance"; | |||
prefix sain; | prefix sain; | |||
import ietf-yang-types { | import ietf-yang-types { | |||
prefix yang; | prefix yang; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC 6991: Common YANG Data Types"; | |||
} | } | |||
organization | organization | |||
"IETF OPSAWG Working Group"; | "IETF OPSAWG Working Group"; | |||
contact | contact | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
WG List: <mailto:opsawg@ietf.org> | WG List: <mailto:opsawg@ietf.org> | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeu@huawei.com>"; | Author: Jean Quilbeuf <mailto:jean.quilbeu@huawei.com>"; | |||
description | description | |||
"This module defines objects for assuring services based on their | "This module defines objects for assuring services based on their | |||
decomposition into so-called subservices, according to the SAIN | decomposition into so-called subservices, according to the | |||
(Service Assurance for Intent-based Networking) architecture. | Service Assurance for Intent-based Networking (SAIN) | |||
architecture. | ||||
The subservices hierarchically organised by dependencies constitute | The subservices hierarchically organized by dependencies | |||
an assurance graph. This module should be supported by an assurance | constitute an assurance graph. This module should be supported | |||
agent, able to interact with the devices in order to produce a | by an assurance agent that is able to interact with the devices | |||
health status and symptoms for each subservice in the assurance | in order to produce the health status and symptoms for each | |||
graph. | subservice in the assurance graph. | |||
This module is intended for the following use cases: | This module is intended for the following use cases: | |||
* Assurance graph configuration: | * Assurance graph configuration: | |||
- subservices: configure a set of subservices to assure, by | - Subservices: Configure a set of subservices to assure by | |||
specifying their types and parameters. | specifying their types and parameters. | |||
- dependencies: configure the dependencies between the | - Dependencies: Configure the dependencies between the | |||
subservices, along with their type. | subservices, along with their type. | |||
* Assurance telemetry: export the health status of the subservices, | * Assurance telemetry: Export the health statuses of the | |||
along with the observed symptoms. | subservices, along with the observed symptoms. | |||
Copyright (c) 2022 IETF Trust and the persons identified as | Copyright (c) 2023 IETF Trust and the persons identified as | |||
authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
to the license terms contained in, the Revised BSD License | to the license terms contained in, the Revised BSD License | |||
set forth in Section 4.c of the IETF Trust's Legal Provisions | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
Relating to IETF Documents | Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info). | (https://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC XXXX; see the | ||||
This version of this YANG module is part of RFC 9418; see the | ||||
RFC itself for full legal notices. "; | RFC itself for full legal notices. "; | |||
revision 2022-08-10 { | revision 2023-06-02 { | |||
description | description | |||
"Initial version."; | "Initial version."; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
identity subservice-base { | identity subservice-base { | |||
description | description | |||
"Base identity for subservice types."; | "Base identity for subservice types."; | |||
} | } | |||
identity service-instance-type { | identity service-instance-type { | |||
base subservice-base; | base subservice-base; | |||
description | description | |||
"Specific type of subservice that represents a service | "Specific type of subservice that represents a service | |||
instance. Instance of this type will depend on other subservices | instance. Instance of this type will depend on other | |||
to build the top of the assurance graph."; | subservices to build the top of the assurance graph."; | |||
} | } | |||
identity dependency-type { | identity dependency-type { | |||
description | description | |||
"Base identity for representing dependency types."; | "Base identity for representing dependency types."; | |||
} | } | |||
identity informational { | identity informational { | |||
base dependency-type; | base dependency-type; | |||
description | description | |||
"Indicates that symptoms of the dependency might be of interest | "Indicates that symptoms of the dependency might be of interest | |||
for the dependent, but the status of the dependency should not | for the dependent, but the status of the dependency should not | |||
have any impact on the dependent."; | have any impact on the dependent."; | |||
} | } | |||
identity impacting { | identity impacting { | |||
base dependency-type; | base dependency-type; | |||
description | description | |||
"Indicates that the status of the dependency directly impacts the | "Indicates that the status of the dependency directly impacts | |||
status of the dependent."; | the status of the dependent."; | |||
} | } | |||
grouping subservice-reference { | grouping subservice-reference { | |||
description | description | |||
"Reference to a specific subservice, identified by its type and | "Reference to a specific subservice identified by its type and | |||
identifier. This grouping is only for internal use in this | identifier. This grouping is only for internal use in this | |||
module."; | module."; | |||
leaf type { | leaf type { | |||
type leafref { | type leafref { | |||
path "/subservices/subservice/type"; | path "/subservices/subservice/type"; | |||
} | } | |||
description | description | |||
"The type of the subservice to refer to (e.g., device)."; | "The type of the subservice to refer to (e.g., device)."; | |||
} | } | |||
leaf id { | leaf id { | |||
type leafref { | type leafref { | |||
path "/subservices/subservice[type=current()/../type]/id"; | path "/subservices/subservice[type=current()/../type]/id"; | |||
} | } | |||
description | description | |||
"The identifier of the subservice to refer to."; | "The identifier of the subservice to refer to."; | |||
} | } | |||
} | } | |||
grouping subservice-dependency { | grouping subservice-dependency { | |||
description | description | |||
"Represents a dependency to another subservice. This grouping | "Represents a dependency to another subservice. This grouping | |||
is only for internal use in this module"; | is only for internal use in this module"; | |||
uses subservice-reference; | uses subservice-reference; | |||
leaf dependency-type { | leaf dependency-type { | |||
type identityref { | type identityref { | |||
base dependency-type; | base dependency-type; | |||
} | } | |||
description | description | |||
"Represents the type of dependency (e.g., informational, | "Represents the type of dependency (e.g., informational or | |||
impacting)."; | impacting)."; | |||
} | } | |||
} | } | |||
leaf assurance-graph-last-change { | leaf assurance-graph-last-change { | |||
type yang:date-and-time; | type yang:date-and-time; | |||
config false; | config false; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Time and date at which the assurance graph last changed after any | "Time and date at which the assurance graph last changed after | |||
structural changes (dependencies and/or maintenance windows | any structural changes (dependencies and/or maintenance | |||
parameters) are applied to the subservice(s). The time and date | windows parameters) are applied to the subservice(s). The | |||
must be the same or more recent than the most recent value of any | time and date must be the same or more recent than the most | |||
changed subservices last-change time and date."; | recent value of any changed subservices last-change time and | |||
date."; | ||||
} | } | |||
container subservices { | container subservices { | |||
description | description | |||
"Root container for the subservices."; | "Root container for the subservices."; | |||
list subservice { | list subservice { | |||
key "type id"; | key "type id"; | |||
description | description | |||
"List of configured subservices."; | "List of configured subservices."; | |||
leaf type { | leaf type { | |||
type identityref { | type identityref { | |||
base subservice-base; | base subservice-base; | |||
} | } | |||
description | description | |||
"Type of the subservice, identifying the type of the part | "Type of the subservice identifying the type of the part | |||
or functionality that is being assured by this list entry. | or functionality that is being assured by this list | |||
For instance 'interface', 'device', 'ip-connectivity'."; | entry, for instance, interface, device, or | |||
ip-connectivity."; | ||||
} | } | |||
leaf id { | leaf id { | |||
type string; | type string; | |||
description | description | |||
"Identifier of the subservice instance. Must be unique among | "Identifier of the subservice instance. Must be unique | |||
subservices of the same type."; | among subservices of the same type."; | |||
} | } | |||
leaf last-change { | leaf last-change { | |||
type yang:date-and-time; | type yang:date-and-time; | |||
config false; | config false; | |||
description | description | |||
"Date and time at which the structure for this | "Date and time at which the structure for this | |||
subservice instance last changed, i.e., dependencies and/or | subservice instance last changed, i.e., dependencies | |||
maintenance windows parameters."; | and/or maintenance windows parameters."; | |||
} | } | |||
leaf label { | leaf label { | |||
type string; | type string; | |||
config false; | config false; | |||
description | description | |||
"Label of the subservice, i.e., text describing what the | "Label of the subservice, i.e., text describing what the | |||
subservice is to be displayed on a human interface. | subservice is to be displayed on a human interface. | |||
It is not intended for random end users but for | It is not intended for random end users but for | |||
network/system/software engineers that are able to interpret | network/system/software engineers that are able to | |||
it. Therefore, no mechanism for language tagging is needed."; | interpret it. Therefore, no mechanism for language | |||
tagging is needed."; | ||||
} | } | |||
container under-maintenance { | container under-maintenance { | |||
presence "true"; | presence "true"; | |||
description | description | |||
"The presence of this container indicates that the current | "The presence of this container indicates that the current | |||
subservice is under maintenance"; | subservice is under maintenance."; | |||
leaf contact { | leaf contact { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A string used to model an administratively assigned name of | "A string used to model an administratively assigned name | |||
the resource that is performing maintenance. | of the resource that is performing maintenance. | |||
It is suggested that this freeform field, which could be a | It is suggested that this freeform field, which could be | |||
URI, contains one or more of the following: IP address, | a URI, contains one or more of the following: IP | |||
management station name, network manager's name, location, | address, management station name, network manager's | |||
or phone number. It might even contain the expected | name, location, and/or phone number. It might even | |||
maintenance time. | contain the expected maintenance time. | |||
In some cases the agent itself will be the owner of an | In some cases, the agent itself will be the owner of an | |||
entry. In these cases, this string shall be set to a string | entry. In these cases, this string shall be set to a | |||
starting with 'monitor'."; | string starting with 'monitor'."; | |||
} | } | |||
} | } | |||
choice parameter { | choice parameter { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Specify the required parameters per subservice type. Each | "Specify the required parameters per subservice type. Each | |||
module augmenting this module with a new subservice type, | module augmenting this module with a new subservice type | |||
that is a new identity based on subservice-base should | that is a new identity based on subservice-base should | |||
augment this choice as well, by adding a container | augment this choice as well by adding a container | |||
available only if the current subservice type is | available only if the current subservice type is | |||
the newly added identity."; | the newly added identity."; | |||
container service-instance-parameter { | container service-instance-parameter { | |||
when "derived-from-or-self(../type, | when "derived-from-or-self(../type, | |||
'sain:service-instance-type')"; | 'sain:service-instance-type')"; | |||
description | description | |||
"Specify the parameters of a service instance."; | "Specify the parameters of a service instance."; | |||
leaf service { | leaf service { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Name of the service."; | "Name of the service."; | |||
} | } | |||
leaf instance-name { | leaf instance-name { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Name of the instance for that service."; | "Name of the instance for that service."; | |||
} | } | |||
} | } | |||
// Other modules can augment their own cases into here | // Other modules can augment their own cases into here. | |||
} | } | |||
leaf health-score { | leaf health-score { | |||
type int8 { | type int8 { | |||
range "-1 .. 100"; | range "-1 .. 100"; | |||
} | } | |||
config false; | config false; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Score value of the subservice health. A value of 100 means | "Score value of the subservice health. A value of 100 | |||
that subservice is healthy. A value of 0 means that the | means that the subservice is healthy. A value of 0 means | |||
subservice is broken. A value between 0 and 100 means that | that the subservice is broken. A value between 0 and 100 | |||
the subservice is degraded. The special value -1 means that | means that the subservice is degraded. The special value | |||
the health-score could not be computed."; | -1 means that the health score could not be computed."; | |||
} | } | |||
leaf symptoms-history-start { | leaf symptoms-history-start { | |||
type yang:date-and-time; | type yang:date-and-time; | |||
config false; | config false; | |||
description | description | |||
"Date and time at which the symptom’s history starts for this | "Date and time at which the symptom's history starts for | |||
subservice instance, either because the subservice instance | this subservice instance, either because the subservice | |||
started at that date and time or because the symptoms before | instance started at that date and time or because the | |||
that were removed due to a garbage collection process."; | symptoms before that were removed due to a garbage | |||
collection process."; | ||||
} | } | |||
container symptoms { | container symptoms { | |||
config false; | config false; | |||
description | description | |||
"Symptoms for the subservice."; | "Symptoms for the subservice."; | |||
list symptom { | list symptom { | |||
key "start-date-time agent-id symptom-id"; | key "start-date-time agent-id symptom-id"; | |||
unique "agent-id symptom-id"; | unique "agent-id symptom-id"; | |||
description | description | |||
"List of symptoms the subservice. While the start-date-time | "List of symptoms of the subservice. While the | |||
key is not necessary per se, this would get the entries | start-date-time key is not necessary per se, this would | |||
sorted by start-date-time for easy consumption."; | get the entries sorted by start-date-time for easy | |||
consumption."; | ||||
leaf symptom-id { | leaf symptom-id { | |||
type leafref { | type leafref { | |||
path "/agents/agent[id=current()/../agent-id]" | path "/agents/agent[id=current()/../agent-id]" | |||
+ "/symptoms/id"; | + "/symptoms/id"; | |||
} | } | |||
description | description | |||
"Identifier of the symptom, to be interpreted according | "Identifier of the symptom to be interpreted according | |||
to the agent identified by the agent-id."; | to the agent identified by the agent-id."; | |||
} | } | |||
leaf agent-id { | leaf agent-id { | |||
type leafref { | type leafref { | |||
path "/agents/agent/id"; | path "/agents/agent/id"; | |||
} | } | |||
description | description | |||
"Identifier of the agent raising the current symptom."; | "Identifier of the agent raising the current symptom."; | |||
} | } | |||
leaf health-score-weight { | leaf health-score-weight { | |||
type uint8 { | type uint8 { | |||
range "0 .. 100"; | range "0 .. 100"; | |||
} | } | |||
description | description | |||
"The weight to the health score incurred by this symptom. | "The weight to the health score incurred by this | |||
The higher the value, the more of an impact this symptom | symptom. The higher the value, the more of an impact | |||
has. If a subservice health score is not 100, there must | this symptom has. If a subservice health score is not | |||
be at least one symptom with a health score weight | 100, there must be at least one symptom with a | |||
larger than 0."; | health-score-weight larger than 0."; | |||
} | } | |||
leaf start-date-time { | leaf start-date-time { | |||
type yang:date-and-time; | type yang:date-and-time; | |||
description | description | |||
"Date and time at which the symptom was detected."; | "Date and time at which the symptom was detected."; | |||
} | } | |||
leaf stop-date-time { | leaf stop-date-time { | |||
type yang:date-and-time; | type yang:date-and-time; | |||
description | description | |||
"Date and time at which the symptom stopped being | "Date and time at which the symptom stopped being | |||
detected. must be after the start-date-time. If the | detected. Must be after the start-date-time. If the | |||
symptom is ongoing, this field should not be populated."; | symptom is ongoing, this field should not be | |||
populated."; | ||||
} | } | |||
} | } | |||
} | } | |||
container dependencies { | container dependencies { | |||
description | description | |||
"Indicates the set of dependencies of the current subservice, | "Indicates the set of dependencies of the current | |||
along with their types."; | subservice, along with their types."; | |||
list dependency { | list dependency { | |||
key "type id"; | key "type id"; | |||
description | description | |||
"List of dependencies of the subservice."; | "List of dependencies of the subservice."; | |||
uses subservice-dependency; | uses subservice-dependency; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
container agents { | container agents { | |||
config false; | config false; | |||
description | description | |||
"Container for the list of agents’s symptoms"; | "Container for the list of agents's symptoms."; | |||
list agent { | list agent { | |||
key "id"; | key "id"; | |||
description | description | |||
"Contains symptoms of each agent involved in computing the | "Contains symptoms of each agent involved in computing the | |||
health status of the current graph. This list acts as a | health status of the current graph. This list acts as a | |||
glossary for understanding the symptom ids returned by each | glossary for understanding the symptom ids returned by each | |||
agent."; | agent."; | |||
leaf id { | leaf id { | |||
type string; | type string; | |||
description | description | |||
"Id of the agent for which we are defining the symptoms. This | "Id of the agent for which we are defining the symptoms. | |||
identifier must be unique among all agents."; | This identifier must be unique among all agents."; | |||
} | } | |||
list symptoms { | list symptoms { | |||
key "id"; | key "id"; | |||
description | description | |||
"List of symptoms raised by the current agent, identified | "List of symptoms raised by the current agent that is | |||
by their symptom-id."; | identified by the symptom-id."; | |||
leaf id { | leaf id { | |||
type string; | type string; | |||
description | description | |||
"Id of the symptom for the current agent. The agent must | "Id of the symptom for the current agent. The agent must | |||
guarantee the unicity of this identifier."; | guarantee the unicity of this identifier."; | |||
} | } | |||
leaf description { | leaf description { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Description of the symptom, i.e., text describing what the | "Description of the symptom, i.e., text describing what | |||
symptom is, to be computer-consumable and be displayed on a | the symptom is, is to be computer consumable and | |||
human interface. | displayed on a human interface. | |||
It is not intended for random end users but for | It is not intended for random end users but for | |||
network/system/software engineers that are able to | network/system/software engineers that are able to | |||
interpret it. Therefore, no mechanism for language tagging | interpret it. Therefore, no mechanism for language | |||
is needed."; | tagging is needed."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
container assured-services { | container assured-services { | |||
config false; | config false; | |||
description | description | |||
"Container for the index of assured services"; | "Container for the index of assured services."; | |||
list assured-service { | list assured-service { | |||
key "service"; | key "service"; | |||
description | description | |||
"Service instances that are currently part of the assurance | "Service instances that are currently part of the assurance | |||
graph. The list must contain an entry for every service | graph. The list must contain an entry for every service | |||
that is currently present in the assurance graph. This list | that is currently present in the assurance graph. This list | |||
presents an alternate access to the graph stored in | presents an alternate access to the graph stored in | |||
/subservices that optimizes querying the assurance graph of a | subservices that optimizes querying the assurance graph of | |||
specific service instance."; | a specific service instance."; | |||
leaf service { | leaf service { | |||
type leafref { | type leafref { | |||
path "/subservices/subservice/service-instance-parameter/" | path "/subservices/subservice/service-instance-parameter/" | |||
+ "service"; | + "service"; | |||
} | } | |||
description | description | |||
"Name of the service."; | "Name of the service."; | |||
} | } | |||
list instances { | list instances { | |||
key "name"; | key "name"; | |||
description | description | |||
"Instances of the service. The list must contain | "Instances of the service. The list must contain | |||
an entry for every instance of the parent service."; | an entry for every instance of the parent service."; | |||
leaf name { | leaf name { | |||
type leafref { | type leafref { | |||
path | path "/subservices/subservice/service-instance-parameter" | |||
"/subservices/subservice/service-instance-parameter/" | + "/instance-name"; | |||
+ "instance-name"; | ||||
} | } | |||
description | description | |||
"Name of the service instance. The leafref must point to a | "Name of the service instance. The leafref must point to | |||
service-instance-parameter whose service leaf matches the | a service-instance-parameter whose service leaf matches | |||
parent service."; | the parent service."; | |||
} | } | |||
list subservices { | list subservices { | |||
key "type id"; | key "type id"; | |||
description | description | |||
"Subservices that appear in the assurance graph of the | "Subservices that appear in the assurance graph of the | |||
current service instance. | current service instance. | |||
The list must contain the subservice corresponding to the | The list must contain the subservice corresponding to | |||
service instance, that is the subservice that matches the | the service instance, i.e., the subservice that | |||
service and instance-name keys. | matches the service and instance-name keys. | |||
For every subservice in the list, all subservices listed as | For every subservice in the list, all subservices listed | |||
dependencies must also appear in the list."; | as dependencies must also appear in the list."; | |||
uses subservice-reference; | uses subservice-reference; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
<t><CODE ENDS></t> | ||||
</section> | </section> | |||
<!-- <section title="Getting the Assurance Graph" anchor="getting-graph"> | ||||
<t> | <section anchor="circular-dependencies" numbered="true" toc="default"> | |||
In practice, getting the assurance graph of a service requires applyin | <name>Rejecting Circular Dependencies</name> | |||
g a graph traversal algorithm such as depth-first search (DFS) starting from the | ||||
node representing the service. | ||||
Such an algorithm can be applied on the global graph fetched at once. | ||||
Otherwise, the algorithm can query nodes and their dependencies as nee | ||||
ded. | ||||
The second version might be more interesting if only one service is of | ||||
interest among several other services in the global graph. | ||||
</t> | ||||
<t> | ||||
A more frequent use case might be to maintain a local version of the a | ||||
ssurance graph. | ||||
Model driven telemetry (MDT) enables subscribing to a path of interest | ||||
such as '/subservices/subservice/dependencies' and thus getting regular updates | ||||
about the graph structure. | ||||
If event driven telemetry (EDT) is supported, updates would be sent on | ||||
ly when the structure of the graph changes. | ||||
Again, one can subscribe to changes in the whole graph (e.g. to save i | ||||
t in a time series database (TSDB)), or only on the dependencies of selected nod | ||||
e (e.g. to monitor evolution of the graph of a single service). | ||||
In the latter case, the subscription must be updated dynamically as no | ||||
des are added and removed from the service assurance graph. | ||||
</t> | ||||
<t> | ||||
Finally, some use cases do not require to get the whole assurance grap | ||||
h. | ||||
For instance, the health status of a given service instance is obtaine | ||||
d by monitoring the '/subservices/subservice/health-score' and '/subservices/sub | ||||
service/symptoms' paths for that service instance. | ||||
In this use case, the assurance graph might be optionally obtained by | ||||
using one of the previous methods only if the health score of the service is bel | ||||
ow a given threshold. | ||||
</t> | ||||
</section> --> | ||||
<section title="Rejecting Circular Dependencies" anchor="circular-dependen | ||||
cies"> | ||||
<t> | <t> | |||
<!-- Circular dependencies check is needed at the server side --> | The statuses of services and subservices depend on the statuses of the | |||
The statuses of services and subservices depend on the statuses of the | ir dependencies, and thus circular dependencies between them prevent the computa | |||
ir dependencies, and thus circular dependencies between them prevents the comput | tion of statuses. | |||
ation of statuses. | Section <xref target="RFC9417" sectionFormat="bare" section="3.1.1"/> | |||
The SAIN architecture document <xref target="I-D.ietf-opsawg-service-a | of the SAIN architecture document <xref target="RFC9417" format="default"/> disc | |||
ssurance-architecture"/> discusses in Section 3.1.1 how such dependencies appear | usses how such dependencies appear and how they could be removed. | |||
and how they could be removed. | ||||
The responsibility of avoiding such dependencies falls to the SAIN orc hestrator. | The responsibility of avoiding such dependencies falls to the SAIN orc hestrator. | |||
However, we specify in this section the expected behavior when a serve r supporting the ietf-service-assurance module receives a data instance containi ng circular dependencies. | However, we specify in this section the expected behavior when a serve r supporting the "ietf-service-assurance" module receives a data instance contai ning circular dependencies. | |||
</t> | </t> | |||
<t> | <t> | |||
<!--We cannot rely on YANG to validate --> | ||||
Enforcing the absence of circular dependencies as a YANG constraint fa lls back to implementing a graph traversal algorithm with XPath and checking tha t the current node is not reachable from its dependencies. | Enforcing the absence of circular dependencies as a YANG constraint fa lls back to implementing a graph traversal algorithm with XPath and checking tha t the current node is not reachable from its dependencies. | |||
Even with such a constraint, there is no guarantee that merging two gr aphs without dependency loops will result in a graph without dependency loops. | Even with such a constraint, there is no guarantee that merging two gr aphs without dependency loops will result in a graph without dependency loops. | |||
Indeed, the Section 3.1.1 of <xref target="I-D.ietf-opsawg-service-as surance-architecture"/> presents an example where merging two graphs without dep endency loops results in a graph with a dependency loop. | Indeed, <xref target="RFC9417" section="3.1.1" sectionFormat="of" form at="default"/> presents an example where merging two graphs without dependency l oops results in a graph with a dependency loop. | |||
</t> | </t> | |||
<t> | <t> | |||
<!-- The server must reject circular dependencies --> | Therefore, a server implementing the "ietf-service-assurance" module < | |||
Therefore, a server implementing the ietf-service-assurance module MUS | bcp14>MUST</bcp14> check that there is no dependency loop whenever the graph is | |||
T check that there is no dependency loop whenever the graph is modified. | modified. | |||
A modification creating a dependency loop MUST be rejected. | A modification creating a dependency loop <bcp14>MUST</bcp14> be rejec | |||
ted. | ||||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Guidelines for Defining New Subservice Types" anchor="augmen | <section anchor="augment-guide" numbered="true" toc="default"> | |||
t-guide"> | <name>Guidelines for Defining New Subservice Types</name> | |||
<t> | <t> | |||
The base YANG module defined in <xref target="ietf-service-assurance-yan g-model" /> only defines a single type of subservices that represent service ins tances. | The base YANG module defined in <xref target="ietf-service-assurance-yan g-model" format="default"/> only defines a single type of subservice that repres ent service instances. | |||
As explained above, this model is meant to be augmented so that a variet y of subservices can be used in the assurance graph. | As explained above, this model is meant to be augmented so that a variet y of subservices can be used in the assurance graph. | |||
In this section, we propose some guidelines for specifying such extensio ns at IETF. | In this section, we propose some guidelines for specifying such extensio ns at IETF. | |||
</t> | </t> | |||
<t> | <t> | |||
The mechanism to add a new subservice type is to define a new module for that subservice. | The mechanism to add a new subservice type is to define a new module for that subservice. | |||
The module name should start with "ietf-service-assurance-". | The module name should start with "ietf-service-assurance-". | |||
The namespace of the module should start with "urn:ietf:params:xml:ns:ya ng:ietf-service-assurance-". | The namespace of the module should start with "urn:ietf:params:xml:ns:ya ng:ietf-service-assurance-". | |||
The prefix of the module should start with "sain-". | The prefix of the module should start with "sain-". | |||
For instance, the subservice type representing the assurance of a device should have: | For instance, the subservice type representing the assurance of a device should have: | |||
<list style="symbols"> | ||||
<t>the name "ietf-service-assurance-device",</t> | ||||
<t>the namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance-d | ||||
evice",</t> | ||||
<t>and the prefix "sain-device".</t> | ||||
</list> | ||||
</t> | </t> | |||
<ul spacing="normal"> | ||||
<li>the name "ietf-service-assurance-device",</li> | ||||
<li>the namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | ||||
", and</li> | ||||
<li>the prefix "sain-device".</li> | ||||
</ul> | ||||
<t> | <t> | |||
The new module should define: | The new module should define: | |||
<list style="symbols"> | ||||
<t> | ||||
A new identity to represent the new type. | ||||
</t> | ||||
<t> | ||||
The parameters fully specifying an instance of the new subservice ty | ||||
pe. | ||||
</t> | ||||
</list> | ||||
</t> | </t> | |||
<ul spacing="normal"> | ||||
<li> | ||||
a new identity to represent the new type and | ||||
</li> | ||||
<li> | ||||
the parameters fully specifying an instance of the new subservice ty | ||||
pe. | ||||
</li> | ||||
</ul> | ||||
<t> | <t> | |||
The new identity should be based on the "subservice-base" identity. | The new identity should be based on the "subservice-base" identity. | |||
The name of the identity should end with "-type", for instance "device-t ype". | The name of the identity should end with "-type", for instance, "device- type". | |||
</t> | </t> | |||
<t> | <t> | |||
The parameters should be defined in a container named "parameters" augme nting of the choice "/subservices/subservice/parameter" from the main module. | The parameters should be defined in a container named "parameters" that augments the choice "/subservices/subservice/parameter" from the main module. | |||
The augmentation should be restricted to cases where the type of the sub service matches the identity representing the new service type. | The augmentation should be restricted to cases where the type of the sub service matches the identity representing the new service type. | |||
</t> | </t> | |||
<t> | <t> | |||
We define two subservice types in the next sections: the "device" subser vice type is defined in <xref target="device-module"/> and the "interface" subse rvice type is defined is <xref target="interface-module"/>. | We define two subservice types in the next sections: the "device" subser vice type is defined in <xref target="device-module" format="default"/> and the "interface" subservice type is defined is <xref target="interface-module" format ="default"/>. | |||
These subservices can be taken as examples of the rules defined in this section. | These subservices can be taken as examples of the rules defined in this section. | |||
</t> | </t> | |||
<t> | <t> | |||
Vendors can specify their own subservices types by defining the correspo nding modules in their own namespace. | Vendors can specify their own subservices types by defining the correspo nding modules in their own namespace. | |||
An example of such a vendor-specific module is specified in Appendix <xr ef target="acme-device-module"/>. | An example of such a vendor-specific module is specified in <xref target ="acme-device-module" format="default"/>. | |||
Vendors can also augment existing IETF-specified subservices to add thei r own vendor-specific information. | Vendors can also augment existing IETF-specified subservices to add thei r own vendor-specific information. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Subservice Augmentation: ietf-service-assurance-device YANG | <section anchor="device-module" numbered="true" toc="default"> | |||
module" anchor="device-module"> | <name>Subservice Augmentation: "ietf-service-assurance-device" YANG Module | |||
<section title="Tree View" anchor="ietf-service-assurance-device-tree-view | </name> | |||
"> | <section anchor="ietf-service-assurance-device-tree-view" numbered="true" | |||
toc="default"> | ||||
<name>Tree View</name> | ||||
<t> | <t> | |||
The following tree diagram <xref target="RFC8340"/> | The following tree diagram <xref target="RFC8340" format="default"/> | |||
provides an overview of the "ietf-service-assurance-device" module. | provides an overview of the "ietf-service-assurance-device" module. | |||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: ietf-service-assurance-device | module: ietf-service-assurance-device | |||
augment /sain:subservices/sain:subservice/sain:parameter: | augment /sain:subservices/sain:subservice/sain:parameter: | |||
+--rw parameters | +--rw parameters | |||
+--rw device string | +--rw device string | |||
]]></sourcecode> | ||||
]]></artwork> | <t>A complete tree view of the base module with all augmenting modules p | |||
</figure> | resented in this document is available in <xref target="global_tree_view" format | |||
</t> | ="default"/>. </t> | |||
<t>A complete tree view of the base module with all augmenting modules p | ||||
resented in this draft is available in <xref target="global_tree_view"/>. </t> | ||||
</section> | </section> | |||
<section anchor="ietf-service-assurance-device-concepts" numbered="true" t | ||||
<section title="Concepts" anchor="ietf-service-assurance-device-concepts"> | oc="default"> | |||
<t> | <name>Concepts</name> | |||
As the number of subservices will grow over time, the YANG module i | <t> | |||
s designed to be extensible. | As the number of subservices will grow over time, the YANG module is d | |||
A new subservice type requires the precise specifications of its ty | esigned to be extensible. | |||
pe and expected parameters. | A new subservice type requires the precise specifications of its type | |||
Let us illustrate the example of the new device subservice type. | and expected parameters. | |||
As the name implies, it monitors and reports the device health, alo | Let us illustrate the example of the new device subservice type. | |||
ng with some symptoms in case of degradation. | As the name implies, it monitors and reports the device health, along | |||
</t> | with some symptoms in case of degradation. | |||
<t> | </t> | |||
For our device subservice definition, the new identity "device-type | <t> | |||
" is specified, as an inheritance from the base identity for subservices. | For our device subservice definition, the new identity "device-type" i | |||
This indicates to the assurance agent that we are now assuring the | s specified as an inheritance from the base identity for subservices. | |||
health of a device. | This indicates to the assurance agent that we are now assuring the hea | |||
</t> | lth of a device. | |||
<t> | </t> | |||
The typical parameter for the configuration of the device subservic | <t> | |||
e is the name of the device that we want to assure. | The typical parameter for the configuration of the device subservice i | |||
By augmenting the parameter choice from ietf-service-assurance YANG | s the name of the device that we want to assure. | |||
module for the case of the "device-type" subservice type, this new parameter is | By augmenting the parameter choice from the "ietf-service-assurance" Y | |||
specified. | ANG module for the case of the "device-type" subservice type, this new parameter | |||
</t> | is specified. | |||
</t> | ||||
</section> | </section> | |||
<section anchor="ietf-service-assurance-device-yang-model" numbered="true" | ||||
<section title="YANG Module" anchor="ietf-service-assurance-device-yang-mo | toc="default"> | |||
del"> | <name>YANG Module</name> | |||
<t><CODE BEGINS> file "ietf-service-assurance-device@2022-08-10.yang" | <sourcecode name="ietf-service-assurance-device@2023-06-02.yang" type="y | |||
</t> | ang" markers="true"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module ietf-service-assurance-device { | module ietf-service-assurance-device { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace | namespace | |||
"urn:ietf:params:xml:ns:yang:ietf-service-assurance-device"; | "urn:ietf:params:xml:ns:yang:ietf-service-assurance-device"; | |||
prefix sain-device; | prefix sain-device; | |||
import ietf-service-assurance { | import ietf-service-assurance { | |||
prefix sain; | prefix sain; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
organization | organization | |||
"IETF OPSAWG Working Group"; | "IETF OPSAWG Working Group"; | |||
contact | contact | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
WG List: <mailto:opsawg@ietf.org> | WG List: <mailto:opsawg@ietf.org> | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | |||
description | description | |||
"This module augments the ietf-service-assurance module with support | "This module augments the ietf-service-assurance module with | |||
of the device subservice. | support of the device subservice. | |||
Copyright (c) 2022 IETF Trust and the persons identified as | Copyright (c) 2023 IETF Trust and the persons identified as | |||
authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
to the license terms contained in, the Revised BSD License | to the license terms contained in, the Revised BSD License | |||
set forth in Section 4.c of the IETF Trust's Legal Provisions | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
Relating to IETF Documents | Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info). | (https://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC XXXX; see the | ||||
This version of this YANG module is part of RFC 9418; see the | ||||
RFC itself for full legal notices. "; | RFC itself for full legal notices. "; | |||
revision 2022-08-10 { | revision 2023-06-02 { | |||
description | description | |||
"Initial revision."; | "Initial revision."; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
identity device-type { | identity device-type { | |||
base sain:subservice-base; | base sain:subservice-base; | |||
description | description | |||
"Identity of device subservice."; | "Identity of device subservice."; | |||
} | } | |||
augment "/sain:subservices/sain:subservice/sain:parameter" { | augment "/sain:subservices/sain:subservice/sain:parameter" { | |||
when "derived-from-or-self(sain:type, 'device-type')"; | when "derived-from-or-self(sain:type, 'device-type')"; | |||
description | description | |||
"Augments the parameter choice from ietf-service-assurance | "Augments the parameter choice from the ietf-service-assurance | |||
module with a case specific to the device subservice."; | module with a case specific to the device subservice."; | |||
container parameters { | container parameters { | |||
description | description | |||
"Parameters for the device subservice type"; | "Parameters for the device subservice type."; | |||
leaf device { | leaf device { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Identifier of the device to monitor. The | "Identifier of the device to monitor. The | |||
identifier (e.g. device id, hostname, management IP) | identifier (e.g., device id, hostname, or management IP) | |||
depends on the context."; | depends on the context."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
<t><CODE ENDS></t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="interface-module" numbered="true" toc="default"> | ||||
<section title="Subservice Augmentation: ietf-service-assurance-interface YA | <name>Subservice Augmentation: "ietf-service-assurance-interface" YANG Mod | |||
NG module" anchor="interface-module"> | ule</name> | |||
<section title="Tree View" anchor="ietf-service-assurance-interface-tree-v | <section anchor="ietf-service-assurance-interface-tree-view" numbered="tru | |||
iew"> | e" toc="default"> | |||
<name>Tree View</name> | ||||
<t> | <t> | |||
The following tree diagram <xref target="RFC8340"/> | The following tree diagram <xref target="RFC8340" format="default"/> | |||
provides an overview of the ietf-service-assurance-interface data model. | provides an overview of the "ietf-service-assurance-interface" data mode | |||
l. | ||||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: ietf-service-assurance-interface | module: ietf-service-assurance-interface | |||
augment /sain:subservices/sain:subservice/sain:parameter: | augment /sain:subservices/sain:subservice/sain:parameter: | |||
+--rw parameters | +--rw parameters | |||
+--rw device string | +--rw device string | |||
+--rw interface string | +--rw interface string | |||
]]></sourcecode> | ||||
]]></artwork> | <t>A complete tree view of the base module with all augmenting modules p | |||
</figure> | resented in this document is available in <xref target="global_tree_view" format | |||
</t> | ="default"/>. </t> | |||
<t>A complete tree view of the base module with all augmenting modules p | ||||
resented in this draft is available in <xref target="global_tree_view"/>. </t> | ||||
</section> | </section> | |||
<section anchor="ietf-service-assurance-interface-concepts" numbered="true | ||||
<section title="Concepts" anchor="ietf-service-assurance-interface-concept | " toc="default"> | |||
s"> | <name>Concepts</name> | |||
<t> | <t> | |||
For the interface subservice definition, the new interface-type is | For the interface subservice definition, the new interface-type is spe | |||
specified, as an inheritance from the base identity for subservices. | cified as an inheritance from the base identity for subservices. | |||
This indicates to the assurance agent that we are now assuring the | This indicates to the assurance agent that we are now assuring the hea | |||
health of an interface. | lth of an interface. | |||
</t> | </t> | |||
<t> | <t> | |||
The parameters for the configuration of the interface subservice ar | The parameters for the configuration of the interface subservice are t | |||
e the name of the device and, on that specific device, a specific interface. | he name of the device and, on that specific device, a specific interface. | |||
These parameters are aligned with the ietf-interfaces model described | These parameters are aligned with the "ietf-interfaces" model describe | |||
in <xref target="RFC8343"/> where the name of the interface is the only key need | d in <xref target="RFC8343" format="default"/>, where the name of the interface | |||
ed to identify an interface on a given device. | is the only key needed to identify an interface on a given device. | |||
By augmenting the parameter choice from ietf-service-assurance YANG | By augmenting the parameter choice from the "ietf-service-assurance" Y | |||
module for the case of the interface-type subservice type, those two new parame | ANG module for the case of the interface-type subservice type, those two new par | |||
ters are specified. | ameters are specified. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="ietf-service-assurance-interface-yang-model" numbered="tr | ||||
<section title="YANG Module" anchor="ietf-service-assurance-interface-yang | ue" toc="default"> | |||
-model"> | <name>YANG Module</name> | |||
<t><CODE BEGINS> file "ietf-service-assurance-interface@2022-08-10.ya | <sourcecode name="ietf-service-assurance-interface@2023-06-02.yang" type | |||
ng"</t> | ="yang" markers="true"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module ietf-service-assurance-interface { | module ietf-service-assurance-interface { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace | namespace | |||
"urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface"; | "urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface"; | |||
prefix sain-interface; | prefix sain-interface; | |||
import ietf-service-assurance { | import ietf-service-assurance { | |||
prefix sain; | prefix sain; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
organization | organization | |||
"IETF OPSAWG Working Group"; | "IETF OPSAWG Working Group"; | |||
contact | contact | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
WG List: <mailto:opsawg@ietf.org> | WG List: <mailto:opsawg@ietf.org> | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | |||
description | description | |||
"This module extends the ietf-service-assurance module to add | "This module extends the ietf-service-assurance module to add | |||
support for the interface subservice. | support for the interface subservice. | |||
Checks whether an interface is healthy. | It checks whether an interface is healthy. | |||
Copyright (c) 2022 IETF Trust and the persons identified as | Copyright (c) 2023 IETF Trust and the persons identified as | |||
authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
to the license terms contained in, the Revised BSD License | to the license terms contained in, the Revised BSD License | |||
set forth in Section 4.c of the IETF Trust's Legal Provisions | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
Relating to IETF Documents | Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info). | (https://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC XXXX; see the | This version of this YANG module is part of RFC 9418; see the | |||
RFC itself for full legal notices. "; | RFC itself for full legal notices. "; | |||
revision 2022-08-10 { | revision 2023-06-02 { | |||
description | description | |||
"Initial revision."; | "Initial revision."; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
identity interface-type { | identity interface-type { | |||
base sain:subservice-base; | base sain:subservice-base; | |||
description | description | |||
"Checks whether an interface is healthy."; | "Checks whether an interface is healthy."; | |||
} | } | |||
augment "/sain:subservices/sain:subservice/sain:parameter" { | augment "/sain:subservices/sain:subservice/sain:parameter" { | |||
when "derived-from-or-self(sain:type, 'interface-type')"; | when "derived-from-or-self(sain:type, 'interface-type')"; | |||
skipping to change at line 1114 ¶ | skipping to change at line 1099 ¶ | |||
} | } | |||
leaf interface { | leaf interface { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Name of the interface."; | "Name of the interface."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
<t><CODE ENDS></t> | ||||
</section> | ||||
</section> | ||||
<!-- | ||||
<section title="Guidelines for Specific Subservice Extension" anchor="guidel | ||||
ines-specific-subservice"> | ||||
<t> | ||||
The base YANG module defined in <xref target="ietf-service-assurance- | ||||
yang-model" /> only defines a single type of subservices that represent service | ||||
instances. | ||||
As explained above, this model is meant to be augmented so that a var | ||||
iety of subservices can be used in the assurance graph. | ||||
In this section, we propose some guidelines in order to build theses | ||||
extensions. | ||||
</t> | ||||
<t> | ||||
First, the specific subservice must be given an adequate unique short na | ||||
me that will be used to form longer names (e.g. module name, prefix ...) appeari | ||||
ng in the YANG module. | ||||
The short name identifies the type of subpart of feature that the subser | ||||
vice will represent, for instance if the subservice will assure the health of a | ||||
network interface then "interface" is an adequate short name. | ||||
If the subservice will assure the IS-IS routing protocol, then "is-is" i | ||||
s an adequate short name. | ||||
The short name must be in kebab-case. | ||||
</t> | ||||
<t> | ||||
In this section, by subservice YANG module, we mean "YANG module that ex | ||||
tends ietf-service-assurance in order to define a specific subservice". | ||||
</t> | ||||
<section title="Module Name"> | ||||
<t> | ||||
For subservice YANG modules vetted by the IETF, the module name sho | ||||
uld be "ietf-service-assurance-" followed by the short name. | ||||
For instance, "ietf-service-assurance-interface" or "ietf-service-a | ||||
ssurance-is-is". | ||||
</t> | ||||
<t> | ||||
For subservice YANG module that are directly provided by vendors, we p | ||||
ropose that they use the company in the prefix. | ||||
For example, the prefix for the company "acme" would be "acme-assur | ||||
ance-" and the YANG modules would be "acme-assurance-interface", "acme-assurance | ||||
-is-is", etc. | ||||
</t> | ||||
</section> | ||||
<section title="Module Namespace"> | ||||
<t> | ||||
For subservice YANG modules vetted by the IETF, the module namespac | ||||
e should be "urn:ietf:params:xml:ns:yang:ietf-service-assurance-" followed by th | ||||
e short name. | ||||
For instance, "urn:ietf:params:xml:ns:yang:ietf-service-assurance-i | ||||
nterface" or "urn:ietf:params:xml:ns:yang:example-service-assurance-is-is". | ||||
</t> | ||||
<t> | ||||
For subservice YANG module that are directly provided by vendors, a | ||||
similar pattern can be used with the prefix being a namespace controlled by the | ||||
vendor. | ||||
</t> | ||||
</section> | ||||
<section title="Module Prefix"> | ||||
<t> | ||||
For subservice YANG modules vetted by the IETF, the module prefix s | ||||
hould be "sain-" followed by the short name. | ||||
For instance, "sain-interface" or "sain-is-is". | ||||
</t> | ||||
<t> | ||||
For subservice YANG module that are directly provided by vendors, t | ||||
he same pattern can be used provided it does not conflict with an imported prefi | ||||
x. | ||||
</t> | ||||
</section> | </section> | |||
<section title="Subservice Specific Identity" anchor="guidelines_subservic | ||||
e_identity"> | ||||
<t> | ||||
Each augment specific to a subservice must define an identity repres | ||||
enting the type of subpart or features of the network system that are assured by | ||||
the subservice. | ||||
As required in the "ietf-service-assurance" module (see <xref target | ||||
="ietf-service-assurance-yang-model"/>), that identity must be based on the "sub | ||||
service-base" identity. | ||||
</t> | ||||
<t> | ||||
For subservice YANG modules vetted by the IETF, the subservice speci | ||||
fic identity should be the short name of the subservice followed by "-type". | ||||
For instance, "interface-type" or "is-is-type". | ||||
</t> | ||||
<t> | ||||
For subservice YANG module that are directly provided by vendors, th | ||||
e same pattern can be used. | ||||
</t> | ||||
</section> | ||||
<section title="Parameters"> | ||||
<t> | ||||
For subservice YANG modules vetted by the IETF, the parameters specific | ||||
to the subservice should be placed in a container named "parameters". | ||||
That container must be used to augment the "parameter" choice from the m | ||||
odule "ietf-service-assurance" (see <xref target="ietf-service-assurance-yang-mo | ||||
del"/> and that augment must be guarded so that it is effective only for subserv | ||||
ice instance whose type is the subservice specific identity from <xref target="g | ||||
uidelines_subservice_identity" />. | ||||
</t> | ||||
<t> | ||||
For subservice YANG module that are directly provided by vendors, the sa | ||||
me pattern can be used. | ||||
</t> | ||||
</section> | ||||
</section> | </section> | |||
--> | <section anchor="security" numbered="true" toc="default"> | |||
<name>Security Considerations</name> | ||||
<section anchor="security" title="Security Considerations"> | ||||
<t> | <t> | |||
The YANG module specified in this document defines a schema for data | The YANG modules specified in this document define schema for data | |||
that is designed to be accessed via network management protocols such | that is designed to be accessed via network management protocols such | |||
as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/ | as NETCONF <xref target="RFC6241" format="default"/> or RESTCONF <xref | |||
>. | target="RFC8040" format="default"/>. | |||
The lowest NETCONF layer is the secure transport layer, and the mandato | The lowest NETCONF layer is the secure transport layer, and the mandato | |||
ry-to-implement secure transport is Secure Shell (SSH) <xref target="RFC6242"/>. | ry-to-implement secure transport is Secure Shell (SSH) <xref target="RFC6242" fo | |||
The lowest RESTCONF layer is HTTPS, and the mandatory-to-implement secure trans | rmat="default"/>. The lowest RESTCONF layer is HTTPS, and the mandatory-to-imple | |||
port is TLS <xref target="RFC8446"/>. | ment secure transport is TLS <xref target="RFC8446" format="default"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
The Network Configuration Access Control Model (NACM) <xref target="RFC 8341"/> | The Network Configuration Access Control Model (NACM) <xref target="RFC 8341" format="default"/> | |||
provides the means to restrict access for particular NETCONF or | provides the means to restrict access for particular NETCONF or | |||
RESTCONF users to a preconfigured subset of all available NETCONF or | RESTCONF users to a preconfigured subset of all available NETCONF or | |||
RESTCONF protocol operations and content. | RESTCONF protocol operations and content. | |||
</t> | </t> | |||
<t>There are a number of data nodes defined in this YANG module that are w | <t>There are a number of data nodes defined in these YANG modules that are | |||
ritable/ | writable/creatable/deletable (i.e., config true, which is the default). These d | |||
creatable/deletable (i.e., config true, which is the default). These da | ata nodes may be considered sensitive or vulnerable in some network environments | |||
ta nodes may be considered sensitive or vulnerable in some network environments. | . Write operations (e.g., edit-config) to these data nodes without proper protec | |||
Write operations (e.g., edit-config) to these data nodes without proper protect | tion can have a negative effect on network operations. These are the subtrees an | |||
ion can have a negative effect on network operations. These are the subtrees and | d data nodes and their sensitivity/vulnerability: | |||
data nodes and their sensitivity/vulnerability: | </t> | |||
<list style="symbols"> | <ul spacing="normal"> | |||
<t> | <li> | |||
/subservices/subservice : | /subservices/subservice : | |||
By modifying this subtree, one can modify the structure of the assu | By modifying this subtree, one can modify the structure of the assu | |||
rance graph which could alter the status of the services reported by the assuran | rance graph, which could alter the status of the services reported by the assura | |||
ce framework. | nce framework. | |||
On one hand, modifications can cause the assurance system to report | On one hand, modifications can cause the assurance system to report | |||
a service as broken when it is actually healthy (false positive), resulting in | a service as broken when it is actually healthy (false positive), resulting in | |||
engineers or automation software losing time, and potentially cause real issues | engineers or automation software losing time and potentially causing real issues | |||
by doing unnecessary modifications on the network. | by doing unnecessary modifications on the network. | |||
On the other hand, modifications could prevent the assurance system | On the other hand, modifications could prevent the assurance system | |||
to report actual issues (false negative), resulting in failures that could have | from reporting actual issues (false negative), resulting in failures that could | |||
been avoided. | have been avoided. | |||
Depending on the service, the impact of these avoidable failures co | Depending on the service, the impact of these avoidable failures co | |||
uld be SLA violations fees or disruption of emergency calls. | uld be Service-Level Agreement (SLA) violations fees or disruption of emergency | |||
</t> | calls. | |||
</list> | </li> | |||
</ul> | ||||
<t> | ||||
Some readable data nodes in these YANG modules may be considered sensiti | ||||
ve or vulnerable in some network environments. It is thus important to control r | ||||
ead access (e.g., via get, get-config, or notification) to these data nodes. The | ||||
se are the subtrees and data nodes and their sensitivity/vulnerability: | ||||
</t> | </t> | |||
<ul spacing="normal"> | ||||
<li>/subservices/subservice</li> | ||||
<li>/agents/agent</li> | ||||
<li>/assured-services/assured-service</li> | ||||
</ul> | ||||
<t> | <t> | |||
Some readable data nodes in this YANG module may be considered sensitive | Each of these subtrees contains information about services, subservices, | |||
or vulnerable in some network environments. It is thus important to control rea | or possible symptoms raised by the agents. | |||
d access (e.g., via get, get-config, or notification) to these data nodes. These | ||||
are the subtrees and data nodes and their sensitivity/vulnerability: | ||||
<list style="symbols"> | ||||
<t>/subservices/subservice</t> | ||||
<t>/agents/agent</t> | ||||
<t>/assured-services/assured-service</t> | ||||
</list> | ||||
Each of these subtrees contains information about services, subservices | ||||
or possible symptoms raised by the agents. | ||||
The information contained in this subtree might give information about t he underlying network as well as services deployed for the customers. | The information contained in this subtree might give information about t he underlying network as well as services deployed for the customers. | |||
For instance, a customer might be given access to monitor their services | For instance, a customer might be given access to monitor their services | |||
status (e.g. via model-driven telemetry). | status (e.g., via model-driven telemetry). | |||
In that example, the customer access should be restricted to nodes repre | In that example, the customer access should be restricted to nodes repre | |||
senting their services, so as not to divulge information about the underlying ne | senting their services so as not to divulge information about the underlying net | |||
twork structure or others customers services. | work structure or others customers services. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="iana" title="IANA Considerations"> | ||||
<section title="The IETF XML Registry"><t>This document registers 3 URIs i | ||||
n the IETF XML | ||||
registry <xref target="RFC3688"/>. Following the format in | ||||
<xref target="RFC3688"/>, the following registrations are | ||||
requested:</t><t><figure><artwork> | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance | ||||
Registrant Contact: The OPSAWG WG of the IETF. | ||||
XML: N/A, the requested URI is an XML namespace. | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | <section anchor="iana" numbered="true" toc="default"> | |||
Registrant Contact: The OPSAWG WG of the IETF. | <name>IANA Considerations</name> | |||
XML: N/A, the requested URI is an XML namespace. | <section numbered="true" toc="default"> | |||
<name>The IETF XML Registry</name> | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface | <t>IANA has registered the following three URIs in the "IETF XML | |||
Registrant Contact: The OPSAWG WG of the IETF. | Registry" <xref target="RFC3688" format="default"/>:</t> | |||
XML: N/A, the requested URI is an XML namespace. | <dl newline="false" spacing="compact"> | |||
</artwork></figure></t></section> | <dt>URI:</dt> | |||
<section title="The YANG Module Names Registry"> | <dd>urn:ietf:params:xml:ns:yang:ietf-service-assurance</dd> | |||
<t>This document registers three YANG modules in the | <dt>Registrant Contact:</dt> | |||
YANG Module Names registry <xref target="RFC7950"/>. | <dd>The OPSAWG WG of the IETF.</dd> | |||
Following the format in <xref target="RFC7950"/>, | <dt>XML:</dt> | |||
the following registrations are requested:</t> | <dd>N/A; the requested URI is an XML namespace.</dd> | |||
<t><figure><artwork> | </dl> | |||
name: ietf-service-assurance | <dl newline="false" spacing="compact"> | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance | <dt>URI:</dt> | |||
prefix: sain | <dd>urn:ietf:params:xml:ns:yang:ietf-service-assurance-device</dd> | |||
reference: RFC XXXX | <dt>Registrant Contact:</dt> | |||
<dd>The OPSAWG WG of the IETF.</dd> | ||||
name: ietf-service-assurance-device | <dt>XML:</dt> | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | <dd>N/A; the requested URI is an XML namespace.</dd> | |||
prefix: sain-device | </dl> | |||
reference: RFC XXXX | <dl newline="false" spacing="compact"> | |||
<dt>URI:</dt> | ||||
name: ietf-service-assurance-interface | <dd>urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface</dd> | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface | <dt>Registrant Contact:</dt> | |||
prefix: sain-interface | <dd>The OPSAWG WG of the IETF.</dd> | |||
reference: RFC XXXX | <dt>XML:</dt> | |||
</artwork></figure></t> | <dd>N/A; the requested URI is an XML namespace.</dd> | |||
<t> | </dl> | |||
All these modules are not maintained by IANA. | </section> | |||
</t> | <section numbered="true" toc="default"> | |||
<name>The YANG Module Names Registry</name> | ||||
<t>IANA has registered the following three YANG modules in the | ||||
"YANG Module Names" registry <xref target="RFC7950" format="default"/>: | ||||
</t> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>name:</dt> | ||||
<dd>ietf-service-assurance</dd> | ||||
<dt>namespace:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-service-assurance</dd> | ||||
<dt>prefix:</dt> | ||||
<dd>sain</dd> | ||||
<dt>reference:</dt> | ||||
<dd>RFC 9418</dd> | ||||
</dl> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>name:</dt> | ||||
<dd>ietf-service-assurance-device</dd> | ||||
<dt>namespace:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-service-assurance-device</dd> | ||||
<dt>prefix:</dt> | ||||
<dd>sain-device</dd> | ||||
<dt>reference:</dt> | ||||
<dd>RFC 9418</dd> | ||||
</dl> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>name:</dt> | ||||
<dd>ietf-service-assurance-interface</dd> | ||||
<dt>namespace:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface</dd> | ||||
<dt>prefix:</dt> | ||||
<dd>sain-interface</dd> | ||||
<dt>reference:</dt> | ||||
<dd>RFC 9418</dd> | ||||
</dl> | ||||
<t> | ||||
These modules are not maintained by IANA. | ||||
</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
</middle> | ||||
</middle> | ||||
<back> | <back> | |||
<references title="Normative References"> | <references> | |||
<?rfc include='reference.I-D.ietf-opsawg-service-assurance-architecture'?> | <name>References</name> | |||
<?rfc include='reference.RFC.2119'?> | <references> | |||
<?rfc include='reference.RFC.3688'?> | <name>Normative References</name> | |||
<?rfc include='reference.RFC.6241'?> | ||||
<?rfc include='reference.RFC.6242'?> | ||||
<?rfc include='reference.RFC.6991'?> | ||||
<?rfc include='reference.RFC.7950'?> | ||||
<?rfc include="reference.RFC.8040"?> | ||||
<?rfc include='reference.RFC.8174'?> | ||||
<?rfc include="reference.RFC.8446"?> | ||||
<?rfc include="reference.RFC.8341"?> | ||||
<?rfc include="reference.RFC.8342"?> | ||||
</references> | ||||
<references title="Informative References"> | ||||
<?rfc include="reference.RFC.8340"?> | ||||
<?rfc include="reference.RFC.8343"?> | ||||
<?rfc include="reference.RFC.8525"?> | ||||
</references> | ||||
<?rfc needLines="100"?> | ||||
<section title="Vendor-specific Subservice Augmentation: example-service-ass | <reference anchor='RFC9417' target='https://www.rfc-editor.org/info/rfc9417'> | |||
urance-device-acme YANG module" anchor="acme-device-module"> | <front> | |||
<section title="Tree View" anchor="example-service-assurance-device-acme-t | <title> | |||
ree-view"> | Service Assurance for Intent-Based Networking Architecture | |||
</title> | ||||
<author initials="B." surname="Claise" fullname="Benoit Claise"> | ||||
</author> | ||||
<author initials="J." surname="Quilbeuf" fullname="Jean Quilbeuf"> | ||||
</author> | ||||
<author initials="D." surname="Lopez" fullname="Diego R. Lopez"> | ||||
</author> | ||||
<author initials="D." surname="Voyer" fullname="Dan Voyer"> | ||||
</author> | ||||
<author initials="T." surname="Arumugam" fullname="Thangam Arumugam"> | ||||
</author> | ||||
<date month="June" year="2023"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9417"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9417"/> | ||||
</reference> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
119.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
688.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
241.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
242.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
991.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
950.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
040.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
174.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
446.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
341.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
342.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
340.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
343.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
525.xml"/> | ||||
</references> | ||||
</references> | ||||
<section anchor="acme-device-module" numbered="true" toc="default"> | ||||
<name>Vendor-Specific Subservice Augmentation: "example-service-assurance- | ||||
device-acme" YANG Module</name> | ||||
<section anchor="example-service-assurance-device-acme-tree-view" numbered | ||||
="true" toc="default"> | ||||
<name>Tree View</name> | ||||
<t> | <t> | |||
The following tree diagram <xref target="RFC8340"/> | The following tree diagram <xref target="RFC8340" format="default"/> | |||
provides an overview of the "example-service-assurance-device-acme" mo dule. | provides an overview of the "example-service-assurance-device-acme" mo dule. | |||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: example-service-assurance-device-acme | module: example-service-assurance-device-acme | |||
augment /sain:subservices/sain:subservice/sain:parameter: | augment /sain:subservices/sain:subservice/sain:parameter: | |||
+--rw parameters | +--rw parameters | |||
+--rw device string | +--rw device string | |||
+--rw acme-specific-parameter string | +--rw acme-specific-parameter string | |||
]]></sourcecode> | ||||
]]></artwork> | <t>A complete tree view of the base module with all augmenting modules p | |||
</figure> | resented in this document is available in <xref target="global_tree_view" format | |||
</t> | ="default"/>. </t> | |||
<t>A complete tree view of the base module with all augmenting modules p | ||||
resented in this draft is available in <xref target="global_tree_view"/>. </t> | ||||
</section> | </section> | |||
<section anchor="example-service-assurance-device-acme-concepts" numbered= | ||||
<section title="Concepts" anchor="example-service-assurance-device-acme-co | "true" toc="default"> | |||
ncepts"> | <name>Concepts</name> | |||
<t> | <t> | |||
Under some circumstances, vendor-specific subservice types might be re quired. | Under some circumstances, vendor-specific subservice types might be re quired. | |||
As an example of this vendor-specific implementation, this section sho | As an example of this vendor-specific implementation, this section sho | |||
ws how to augment the "ietf-service-assurance-device" module to add custom suppo | ws how to augment the "ietf-service-assurance-device" module to add custom suppo | |||
rt for the device subservice, specific to the ACME Corporation. | rt for the device subservice specific to the Acme Corporation. | |||
The specific version adds a new parameter, named "acme-specific-parame | The specific version adds a new parameter named "acme-specific-paramet | |||
ter". | er". | |||
It's an implementation choice to either derive a new specific identity | It's an implementation choice to either derive a new specific identity | |||
from the "subservice-base" identity defined in ietf-service-assurance or to aug | from the "subservice-base" identity defined in the "ietf-service-assurance" mod | |||
ment the parameters from ietf-service-assurance-device, here we choose to create | ule or to augment the parameters from the "ietf-service-assurance-device" module | |||
a new identity. | ; here, we choose to create a new identity. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="example-service-assurance-device-acme-yang-model" numbere | ||||
<section title="YANG Module" anchor="example-service-assurance-device-acme | d="true" toc="default"> | |||
-yang-model"> | <name>YANG Module</name> | |||
<figure> | <sourcecode type="yang"><![CDATA[ | |||
<artwork><![CDATA[ | ||||
module example-service-assurance-device-acme { | module example-service-assurance-device-acme { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:example:example-service-assurance-device-acme"; | namespace "urn:example:example-service-assurance-device-acme"; | |||
prefix example-device-acme; | prefix example-device-acme; | |||
import ietf-service-assurance { | import ietf-service-assurance { | |||
prefix sain; | prefix sain; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
import ietf-service-assurance-device { | import ietf-service-assurance-device { | |||
prefix sain-device; | prefix sain-device; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
organization | organization | |||
"IETF OPSAWG Working Group"; | "IETF OPSAWG Working Group"; | |||
contact | contact | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
WG List: <mailto:opsawg@ietf.org> | WG List: <mailto:opsawg@ietf.org> | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | |||
description | description | |||
"This example module extends the ietf-service-assurance-device | "This example module extends the ietf-service-assurance-device | |||
module to add specific support for devices of ACME Corporation. "; | module to add specific support for devices of the Acme | |||
Corporation. "; | ||||
revision 2022-08-10 { | revision 2023-06-02 { | |||
description | description | |||
"Initial revision"; | "Initial revision."; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
identity device-acme-type { | identity device-acme-type { | |||
base sain-device:device-type; | base sain-device:device-type; | |||
description | description | |||
"Network Device is healthy."; | "Network device is healthy."; | |||
} | } | |||
augment "/sain:subservices/sain:subservice/sain:parameter" { | augment "/sain:subservices/sain:subservice/sain:parameter" { | |||
when "derived-from-or-self(sain:type, 'device-acme-type')"; | when "derived-from-or-self(sain:type, 'device-acme-type')"; | |||
description | description | |||
"Augments the parameter choice from ietf-service-assurance | "Augments the parameter choice from the ietf-service-assurance | |||
module with a case specific to the device-acme subservice."; | module with a case specific to the device-acme subservice."; | |||
container parameters { | container parameters { | |||
description | description | |||
"Parameters for the device-acme subservice type"; | "Parameters for the device-acme subservice type."; | |||
leaf device { | leaf device { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"The device to monitor."; | "The device to monitor."; | |||
} | } | |||
leaf acme-specific-parameter { | leaf acme-specific-parameter { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"The ACME Corporation specific parameter."; | "The Acme-Corporation-specific parameter."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="ip-connectivity-is-is" numbered="true" toc="default"> | ||||
<section title="Further Augmentations: IP Connectivity and IS-IS subservices | <name>Further Augmentations: IP Connectivity and IS-IS Subservices</name> | |||
" anchor="ip-connectivity-is-is"> | ||||
<t> | <t> | |||
In this section, we provide two additional YANG modules to completely co | In this section, we provide two additional YANG modules to completely co | |||
ver the example in Figure 2 from Section 3.1 of <xref target="I-D.ietf-opsawg-s | ver the example in Figure 2 from <xref target="RFC9417" section="3.1" sectionFor | |||
ervice-assurance-architecture"/>. | mat="of" format="default"/>. | |||
The two missing subservice types are IP Connectivity and the Intermediat | The two missing subservice types are IP connectivity and the Intermediat | |||
e System to Intermediate System (IS-IS) routing protocol. | e System to Intermediate System (IS-IS) routing protocol. | |||
These modules are presented as examples, some future work is needed to | These modules are presented as examples; some future work is needed to | |||
propose a more complete version. | propose a more complete version. | |||
</t> | </t> | |||
<section title="IP Connectivity Module Tree View"> | <section numbered="true" toc="default"> | |||
<name>IP Connectivity Module Tree View</name> | ||||
<t> | <t> | |||
That subservice represents the unicast connectivity between two IP add resses located on two different devices. | That subservice represents the unicast connectivity between two IP add resses located on two different devices. | |||
Such a subservice could report symptoms such as "No route found". | Such a subservice could report symptoms such as "No route found". | |||
The following tree diagram <xref target="RFC8340"/> provides an overvi ew of the "example-service-assurance-ip-connectivity" module. | The following tree diagram <xref target="RFC8340" format="default"/> p rovides an overview of the "example-service-assurance-ip-connectivity" module. | |||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: example-service-assurance-ip-connectivity | module: example-service-assurance-ip-connectivity | |||
augment /sain:subservices/sain:subservice/sain:parameter: | augment /sain:subservices/sain:subservice/sain:parameter: | |||
+--rw parameters | +--rw parameters | |||
+--rw device1 string | +--rw device1 string | |||
+--rw address1 inet:ip-address | +--rw address1 inet:ip-address | |||
+--rw device2 string | +--rw device2 string | |||
+--rw address2 inet:ip-address | +--rw address2 inet:ip-address | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</t> | ||||
<t> | <t> | |||
To specify the connectivity that we are interested in, we specify two IP addresses and two devices. | To specify the connectivity that we are interested in, we specify two IP addresses and two devices. | |||
The subservice assures that the connectivity between IP address 1 on d evice 1 and IP address 2 on device 2 is healthy. | The subservice assures that the connectivity between IP address 1 on d evice 1 and IP address 2 on device 2 is healthy. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="IS-IS Module Tree View"> | <section numbered="true" toc="default"> | |||
<name>IS-IS Module Tree View</name> | ||||
<t> | <t> | |||
The following tree diagram <xref target="RFC8340"/> provides an overvi ew of the "example-service-assurance-is-is" module. | The following tree diagram <xref target="RFC8340" format="default"/> p rovides an overview of the "example-service-assurance-is-is" module. | |||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: example-service-assurance-is-is | module: example-service-assurance-is-is | |||
augment /sain:subservices/sain:subservice/sain:parameter: | augment /sain:subservices/sain:subservice/sain:parameter: | |||
+--rw parameters | +--rw parameters | |||
+--rw instance-name string | +--rw instance-name string | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</t> | ||||
<t> | <t> | |||
The parameter of this subservice is the name of the IS-IS instance to assure. | The parameter of this subservice is the name of the IS-IS instance to assure. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Global Tree View" anchor="global_tree_view"> | <section anchor="global_tree_view" numbered="true" toc="default"> | |||
<name>Global Tree View</name> | ||||
<t> | <t> | |||
The following tree diagram <xref target="RFC8340"/> | The following tree diagram <xref target="RFC8340" format="default"/> | |||
provides an overview of the "ietf-service-assurance", "ietf-service-as surance-device", | provides an overview of the "ietf-service-assurance", "ietf-service-as surance-device", | |||
"example-service-assurance-device-acme", "example-service-assurance-ip -connectivity" and "example-service-assurance-is-is" modules. | "example-service-assurance-device-acme", "example-service-assurance-ip -connectivity", and "example-service-assurance-is-is" modules. | |||
</t> | </t> | |||
<t> | <sourcecode type="yangtree"><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
module: ietf-service-assurance | module: ietf-service-assurance | |||
+--ro assurance-graph-last-change yang:date-and-time | +--ro assurance-graph-last-change yang:date-and-time | |||
+--rw subservices | +--rw subservices | |||
| +--rw subservice* [type id] | | +--rw subservice* [type id] | |||
| +--rw type identityref | | +--rw type identityref | |||
| +--rw id string | | +--rw id string | |||
| +--ro last-change? | | +--ro last-change? | |||
| | yang:date-and-time | | | yang:date-and-time | |||
| +--ro label? string | | +--ro label? string | |||
| +--rw under-maintenance! | | +--rw under-maintenance! | |||
skipping to change at line 1529 ¶ | skipping to change at line 1482 ¶ | |||
| +--ro id string | | +--ro id string | |||
| +--ro description string | | +--ro description string | |||
+--ro assured-services | +--ro assured-services | |||
+--ro assured-service* [service] | +--ro assured-service* [service] | |||
+--ro service leafref | +--ro service leafref | |||
+--ro instances* [name] | +--ro instances* [name] | |||
+--ro name leafref | +--ro name leafref | |||
+--ro subservices* [type id] | +--ro subservices* [type id] | |||
+--ro type -> /subservices/subservice/type | +--ro type -> /subservices/subservice/type | |||
+--ro id leafref | +--ro id leafref | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</t> | ||||
</section> | </section> | |||
<section title="IP Connectivity YANG Module"> | <section numbered="true" toc="default"> | |||
<figure> | <name>IP Connectivity YANG Module</name> | |||
<artwork><![CDATA[ | <sourcecode type="yang"><![CDATA[ | |||
module example-service-assurance-ip-connectivity { | module example-service-assurance-ip-connectivity { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:example:example-service-assurance-ip-connectivity"; | namespace "urn:example:example-service-assurance-ip-connectivity"; | |||
prefix example-ip-connectivity; | prefix example-ip-connectivity; | |||
import ietf-inet-types { | import ietf-inet-types { | |||
prefix inet; | prefix inet; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC 6991: Common YANG Data Types"; | |||
} | } | |||
import ietf-service-assurance { | import ietf-service-assurance { | |||
prefix sain; | prefix sain; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
organization | organization | |||
"IETF OPSAWG Working Group"; | "IETF OPSAWG Working Group"; | |||
contact | contact | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
WG List: <mailto:opsawg@ietf.org> | WG List: <mailto:opsawg@ietf.org> | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | |||
description | description | |||
"This example module augments the ietf-service-assurance module to | "This example module augments the ietf-service-assurance module | |||
add support for the subservice ip-connectivity. | to add support for the subservice ip-connectivity. | |||
Checks whether the ip connectivity between two ip addresses | It checks whether the IP connectivity between two IP addresses | |||
belonging to two network devices is healthy."; | belonging to two network devices is healthy."; | |||
revision 2022-08-10 { | revision 2023-06-02 { | |||
description | description | |||
"Initial version"; | "Initial version."; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
identity ip-connectivity-type { | identity ip-connectivity-type { | |||
base sain:subservice-base; | base sain:subservice-base; | |||
description | description | |||
"Checks connectivity between two IP addresses."; | "Checks connectivity between two IP addresses."; | |||
} | } | |||
augment "/sain:subservices/sain:subservice/sain:parameter" { | augment "/sain:subservices/sain:subservice/sain:parameter" { | |||
when "derived-from-or-self(sain:type, 'ip-connectivity-type')"; | when "derived-from-or-self(sain:type, 'ip-connectivity-type')"; | |||
description | description | |||
"Augments the parameter choice from ietf-service-assurance | "Augments the parameter choice from the ietf-service-assurance | |||
module with a case specific to the ip-connectivity | module with a case specific to the ip-connectivity | |||
subservice."; | subservice."; | |||
container parameters { | container parameters { | |||
description | description | |||
"Parameters for the ip-connectivity subservice type"; | "Parameters for the ip-connectivity subservice type."; | |||
leaf device1 { | leaf device1 { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Device at the first end of the connection."; | "Device at the first end of the connection."; | |||
} | } | |||
leaf address1 { | leaf address1 { | |||
type inet:ip-address; | type inet:ip-address; | |||
mandatory true; | mandatory true; | |||
description | description | |||
skipping to change at line 1616 ¶ | skipping to change at line 1566 ¶ | |||
} | } | |||
leaf address2 { | leaf address2 { | |||
type inet:ip-address; | type inet:ip-address; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Address at the second end of the connection."; | "Address at the second end of the connection."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | </section> | |||
<section title="IS-IS YANG Module"> | <section numbered="true" toc="default"> | |||
<figure> | <name>IS-IS YANG Module</name> | |||
<artwork><![CDATA[ | <sourcecode type="yang"><![CDATA[ | |||
module example-service-assurance-is-is { | module example-service-assurance-is-is { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:example:example-service-assurance-is-is"; | namespace "urn:example:example-service-assurance-is-is"; | |||
prefix example-is-is; | prefix example-is-is; | |||
import ietf-service-assurance { | import ietf-service-assurance { | |||
prefix sain; | prefix sain; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
organization | organization | |||
"IETF OPSAWG Working Group"; | "IETF OPSAWG Working Group"; | |||
contact | contact | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
WG List: <mailto:opsawg@ietf.org> | WG List: <mailto:opsawg@ietf.org> | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | |||
description | description | |||
"This example module augments the ietf-service-assurance module to | "This example module augments the ietf-service-assurance module | |||
add support for the subservice is-is. | to add support for the subservice is-is. | |||
Checks whether an IS-IS instance is healthy."; | It checks whether an IS-IS instance is healthy."; | |||
revision 2022-08-10 { | revision 2023-06-02 { | |||
description | description | |||
"Initial version"; | "Initial version."; | |||
reference | reference | |||
"RFC xxxx: YANG Modules for Service Assurance"; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
identity is-is-type { | identity is-is-type { | |||
base sain:subservice-base; | base sain:subservice-base; | |||
description | description | |||
"Health of IS-IS routing protocol."; | "Health of IS-IS routing protocol."; | |||
} | } | |||
augment "/sain:subservices/sain:subservice/sain:parameter" { | augment "/sain:subservices/sain:subservice/sain:parameter" { | |||
when "derived-from-or-self(sain:type, 'is-is-type')"; | when "derived-from-or-self(sain:type, 'is-is-type')"; | |||
description | description | |||
"Augments the parameter choice from ietf-service-assurance | "Augments the parameter choice from the ietf-service-assurance | |||
module with a case specific to the is-is subservice."; | module with a case specific to the is-is subservice."; | |||
container parameters { | container parameters { | |||
description | description | |||
"Parameters for the is-is subservice type."; | "Parameters for the is-is subservice type."; | |||
leaf instance-name { | leaf instance-name { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"The instance to monitor."; | "The instance to monitor."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section title="Example of YANG instance" anchor="example_instances"> | <section anchor="example_instances" numbered="true" toc="default"> | |||
<name>Example of a YANG Instance</name> | ||||
<t> | <t> | |||
This section contains an example of YANG instance that conform to the Y | This section contains an example of a YANG instance that conforms to th | |||
ANG modules. | e YANG modules. | |||
The validity of this data instance has been checked using <eref target= | The validity of this data instance has been checked using <eref target= | |||
"https://yangson.labs.nic.cz/" >yangson</eref>. | "https://yangson.labs.nic.cz/" brackets="angle">yangson</eref>. | |||
Yangson requires a YANG library <xref target="RFC8525"/> to define the | Yangson requires a YANG library <xref target="RFC8525" format="default" | |||
complete model against which the data instance must be validated. | /> to define the complete model against which the data instance must be validate | |||
We provide in <xref target="yang_library_for_validation" /> the JSON li | d. | |||
brary file, named "ietf-service-assurance-library.json", that we used for valid | In <xref target="yang_library_for_validation" format="default"/>, we pr | |||
ation. | ovide the JSON library file named "ietf-service-assurance-library.json", which | |||
we used for validation. | ||||
</t> | </t> | |||
<t> | <t> | |||
We provide below the contents of the file "example_configuration_instan | Below, we provide the contents of the file "example_configuration_insta | |||
ce.json" which contains the configuration data that models the Figure 2 from Sec | nce.json", which contains the configuration data that models Figure 2 from <xref | |||
tion 3.1 of <xref target="I-D.ietf-opsawg-service-assurance-architecture" />. | target="RFC9417" section="3.1" sectionFormat="of" format="default"/>. | |||
The instance can be validated with yangson by using the invocation "yan | The instance can be validated with yangson by using the invocation "yan | |||
gson -v example_configuration_instance.json ietf-service-assurance-library.json" | gson -v example_configuration_instance.json ietf-service-assurance-library.json" | |||
, assuming all the files (YANG and JSON) defined in this draft reside in the cur | , assuming all the files (YANG and JSON) defined in this document reside in the | |||
rent folder. | current folder. | |||
</t> | </t> | |||
<figure> | <sourcecode type="json"><![CDATA[ | |||
<artwork><![CDATA[ | ||||
{ | { | |||
"ietf-service-assurance:subservices": { | "ietf-service-assurance:subservices": { | |||
"subservice": [ | "subservice": [ | |||
{ | { | |||
"type": "service-instance-type", | "type": "service-instance-type", | |||
"id": "simple-tunnel/example", | "id": "simple-tunnel/example", | |||
"service-instance-parameter": { | "service-instance-parameter": { | |||
"service": "simple-tunnel", | "service": "simple-tunnel", | |||
"instance-name": "example" | "instance-name": "example" | |||
}, | }, | |||
"dependencies": { | "dependencies": { | |||
"dependency": [ | "dependency": [ | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": | |||
"ietf-service-assurance-interface:interface-type", | ||||
"id": "interface/peer1/tunnel0", | "id": "interface/peer1/tunnel0", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
}, | }, | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": | |||
"ietf-service-assurance-interface:interface-type", | ||||
"id": "interface/peer2/tunnel9", | "id": "interface/peer2/tunnel9", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
}, | }, | |||
{ | { | |||
"type": | "type": | |||
"example-service-assurance-ip-connectivity:ip-connectivity-type", | "example-service-assurance-ip-connectivity:ip-connectivity-type", | |||
"id": "connectivity/peer1/2001:db8::1/peer2/2001:db8::2", | "id": | |||
"connectivity/peer1/2001:db8::1/peer2/2001:db8::2", | ||||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
} | } | |||
] | ] | |||
} | } | |||
}, | }, | |||
{ | { | |||
"type": | "type": | |||
"example-service-assurance-ip-connectivity:ip-connectivity-type", | "example-service-assurance-ip-connectivity:ip-connectivity-type", | |||
"id": "connectivity/peer1/2001:db8::1/peer2/2001:db8::2", | "id": "connectivity/peer1/2001:db8::1/peer2/2001:db8::2", | |||
"example-service-assurance-ip-connectivity:parameters": { | "example-service-assurance-ip-connectivity:parameters": { | |||
"device1": "Peer1", | "device1": "Peer1", | |||
"address1": "2001:db8::1", | "address1": "2001:db8::1", | |||
"device2": "Peer2", | "device2": "Peer2", | |||
"address2": "2001:db8::2" | "address2": "2001:db8::2" | |||
}, | }, | |||
"dependencies": { | "dependencies": { | |||
"dependency": [ | "dependency": [ | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": | |||
"ietf-service-assurance-interface:interface-type", | ||||
"id": "interface/peer1/physical0", | "id": "interface/peer1/physical0", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
}, | }, | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": | |||
"ietf-service-assurance-interface:interface-type", | ||||
"id": "interface/peer2/physical5", | "id": "interface/peer2/physical5", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
}, | }, | |||
{ | { | |||
"type": "example-service-assurance-is-is:is-is-type", | "type": "example-service-assurance-is-is:is-is-type", | |||
"id": "is-is/instance1", | "id": "is-is/instance1", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
} | } | |||
] | ] | |||
} | } | |||
skipping to change at line 1773 ¶ | skipping to change at line 1724 ¶ | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": "ietf-service-assurance-interface:interface-type", | |||
"id": "interface/peer1/tunnel0", | "id": "interface/peer1/tunnel0", | |||
"ietf-service-assurance-interface:parameters": { | "ietf-service-assurance-interface:parameters": { | |||
"device": "Peer1", | "device": "Peer1", | |||
"interface": "tunnel0" | "interface": "tunnel0" | |||
}, | }, | |||
"dependencies": { | "dependencies": { | |||
"dependency": [ | "dependency": [ | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": | |||
"ietf-service-assurance-interface:interface-type", | ||||
"id": "interface/peer1/physical0", | "id": "interface/peer1/physical0", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
} | } | |||
] | ] | |||
} | } | |||
}, | }, | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": "ietf-service-assurance-interface:interface-type", | |||
"id": "interface/peer1/physical0", | "id": "interface/peer1/physical0", | |||
"ietf-service-assurance-interface:parameters": { | "ietf-service-assurance-interface:parameters": { | |||
skipping to change at line 1814 ¶ | skipping to change at line 1766 ¶ | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": "ietf-service-assurance-interface:interface-type", | |||
"id": "interface/peer2/tunnel9", | "id": "interface/peer2/tunnel9", | |||
"ietf-service-assurance-interface:parameters": { | "ietf-service-assurance-interface:parameters": { | |||
"device": "Peer2", | "device": "Peer2", | |||
"interface": "tunnel9" | "interface": "tunnel9" | |||
}, | }, | |||
"dependencies": { | "dependencies": { | |||
"dependency": [ | "dependency": [ | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": | |||
"ietf-service-assurance-interface:interface-type", | ||||
"id": "interface/peer2/physical5", | "id": "interface/peer2/physical5", | |||
"dependency-type": "impacting" | "dependency-type": "impacting" | |||
} | } | |||
] | ] | |||
} | } | |||
}, | }, | |||
{ | { | |||
"type": "ietf-service-assurance-interface:interface-type", | "type": "ietf-service-assurance-interface:interface-type", | |||
"id": "interface/peer2/physical5", | "id": "interface/peer2/physical5", | |||
"ietf-service-assurance-interface:parameters": { | "ietf-service-assurance-interface:parameters": { | |||
skipping to change at line 1848 ¶ | skipping to change at line 1801 ¶ | |||
{ | { | |||
"type": "ietf-service-assurance-device:device-type", | "type": "ietf-service-assurance-device:device-type", | |||
"id": "interface/peer2", | "id": "interface/peer2", | |||
"ietf-service-assurance-device:parameters": { | "ietf-service-assurance-device:parameters": { | |||
"device": "Peer2" | "device": "Peer2" | |||
} | } | |||
} | } | |||
] | ] | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | </section> | |||
<section title="YANG Library for Service Assurance" anchor="yang_library_for | <section anchor="yang_library_for_validation" numbered="true" toc="default"> | |||
_validation"> | <name>YANG Library for Service Assurance</name> | |||
<t> | <t> | |||
This section provides the JSON encoding of the YANG library <xref target ="RFC8525"/> listing all modules defined in this draft and their dependencies. | This section provides the JSON encoding of the YANG library <xref target ="RFC8525" format="default"/> that lists all modules defined in this document an d their dependencies. | |||
This library can be used to validate data instances using yangson, as ex plained in the previous section. | This library can be used to validate data instances using yangson, as ex plained in the previous section. | |||
</t> | </t> | |||
<figure> | <sourcecode type="json"><![CDATA[ | |||
<artwork><![CDATA[ | ||||
{ | { | |||
"ietf-yang-library:modules-state": { | "ietf-yang-library:modules-state": { | |||
"module-set-id": "ietf-service-assurance@2022-08-10", | "module-set-id": "ietf-service-assurance@2023-06-02", | |||
"module": [ | "module": [ | |||
{ | { | |||
"name": "ietf-service-assurance", | "name": "ietf-service-assurance", | |||
"namespace": | "namespace": | |||
"urn:ietf:params:xml:ns:yang:ietf-service-assurance", | "urn:ietf:params:xml:ns:yang:ietf-service-assurance", | |||
"revision": "2022-08-10", | "revision": "2023-06-02", | |||
"conformance-type": "implement" | "conformance-type": "implement" | |||
}, | }, | |||
{ | { | |||
"name": "ietf-service-assurance-device", | "name": "ietf-service-assurance-device", | |||
"namespace": | "namespace": | |||
"urn:ietf:params:xml:ns:yang:ietf-service-assurance-device", | "urn:ietf:params:xml:ns:yang:ietf-service-assurance-device", | |||
"revision": "2022-08-10", | "revision": "2023-06-02", | |||
"conformance-type": "implement" | "conformance-type": "implement" | |||
}, | }, | |||
{ | { | |||
"name": "ietf-service-assurance-interface", | "name": "ietf-service-assurance-interface", | |||
"namespace": | "namespace": | |||
"urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface", | "urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface", | |||
"revision": "2022-08-10", | "revision": "2023-06-02", | |||
"conformance-type": "implement" | "conformance-type": "implement" | |||
}, | }, | |||
{ | { | |||
"name": "example-service-assurance-device-acme", | "name": "example-service-assurance-device-acme", | |||
"namespace": | "namespace": | |||
"urn:example:example-service-assurance-device-acme", | "urn:example:example-service-assurance-device-acme", | |||
"revision": "2022-08-10", | "revision": "2023-06-02", | |||
"conformance-type": "implement" | "conformance-type": "implement" | |||
}, | }, | |||
{ | { | |||
"name": "example-service-assurance-is-is", | "name": "example-service-assurance-is-is", | |||
"namespace": "urn:example:example-service-assurance-is-is", | "namespace": "urn:example:example-service-assurance-is-is", | |||
"revision": "2022-08-10", | "revision": "2023-06-02", | |||
"conformance-type": "implement" | "conformance-type": "implement" | |||
}, | }, | |||
{ | { | |||
"name": "example-service-assurance-ip-connectivity", | "name": "example-service-assurance-ip-connectivity", | |||
"namespace": | "namespace": | |||
"urn:example:example-service-assurance-ip-connectivity", | "urn:example:example-service-assurance-ip-connectivity", | |||
"revision": "2022-08-10", | "revision": "2023-06-02", | |||
"conformance-type": "implement" | "conformance-type": "implement" | |||
}, | }, | |||
{ | { | |||
"name": "ietf-yang-types", | "name": "ietf-yang-types", | |||
"namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types", | "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types", | |||
"revision": "2021-04-14", | "revision": "2013-07-05", | |||
"conformance-type": "import" | "conformance-type": "import" | |||
}, | }, | |||
{ | { | |||
"name": "ietf-inet-types", | "name": "ietf-inet-types", | |||
"namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types", | "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types", | |||
"revision": "2021-02-22", | "revision": "2013-07-05", | |||
"conformance-type": "import" | "conformance-type": "import" | |||
} | } | |||
] | ] | |||
} | } | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
</section> | </section> | |||
<section numbered="false" toc="default"> | ||||
<section title="Changes between revisions"> | <name>Acknowledgements</name> | |||
<t>[[RFC editor: please remove this section before publication.]]</t> | <t>The authors would like to thank <contact fullname="Jan Lindblad"/> for | |||
<t>v09 - v10 | his help during the design of these YANG modules. | |||
<list style="symbols"> | The authors would like to thank <contact fullname="Stephane Litkowski" | |||
<t>Address comments from Last Call</t> | />, <contact fullname="Charles Eckel"/>, <contact fullname="Mohamed Boucadair"/> | |||
</list> | , <contact fullname="Tom Petch"/>, <contact fullname="Dhruv Dhody"/>, and <conta | |||
</t> | ct fullname="Rob Wilton"/> for their reviews. | |||
<t>v07 - v08 | ||||
<list style="symbols"> | ||||
<t>Address comments from Rob Wilton’s AD review</t> | ||||
</list> | ||||
</t> | ||||
<t>v06 - v07 | ||||
<list style="symbols"> | ||||
<t>Addressed early YANG doctor comments from version -06: changed -idt | ||||
y for -type or -base in identity names and removed "under-maintenance" leaf </t> | ||||
<t>Add new list of services with the corresponding subservices</t> | ||||
<t>Remove assurance-graph-version and state the limitations of having | ||||
only the current graph available in the module.</t> | ||||
<t>Added new list of agents to store symptom and guarantee unicity of | ||||
symptom ids </t> | ||||
<t>Added security consideration for readable nodes</t> | ||||
<t>Added section on rejecting circular dependencies</t> | ||||
</list> | ||||
</t> | ||||
<t>v05 - v06 | ||||
<list style="symbols"> | ||||
<t>Remove revision history in modules</t> | ||||
<t>Present elements in order of the tree for the main module</t> | ||||
<t>Rewriting and rewording for clarity</t> | ||||
<t>Made parameters mandatory for the subservices</t> | ||||
</list> | ||||
</t> | ||||
<t>v04 - v05 | ||||
<list style="symbols"> | ||||
<t>Remove Guidelines section </t> | ||||
<t>Move informative parts (examples) to appendix</t> | ||||
<t>Minor text edits and reformulations</t> | ||||
</list> | ||||
</t> | ||||
<t>v03 - v04 | ||||
<list style="symbols"> | ||||
<t> Fix YANG errors </t> | ||||
<t> Change is-is and ip-connectivity subservices from ietf to example. | ||||
</t> | ||||
<t> Mention that models are NMDA compliant </t> | ||||
<t> Fix typos, reformulate for clarity </t> | ||||
</list> | ||||
</t> | ||||
<t>v02 - v03 | ||||
<list style="symbols"> | ||||
<t>Change counter32 to counter64 to avoid resetting too frequently </t | ||||
> | ||||
<t>Explain why relation between health-score and symptom’s health-scor | ||||
e-weight is not defined and how it could be defined</t> | ||||
</list> | ||||
</t> | ||||
<t>v01 - v02 | ||||
<list style="symbols"> | ||||
<t>Explicitly represent the fact that the health-score could not be co | ||||
mputed (value -1)</t> | ||||
</list> | ||||
</t> | ||||
<t>v00 - v01 | ||||
<list style="symbols"> | ||||
<t>Added needed subservice to model example from architecture draft</t | ||||
> | ||||
<t>Added guideline section for naming models</t> | ||||
<t>Added data instance examples and validation procedure</t> | ||||
<t>Added the "parameters" container in the interface YANG module to co | ||||
rrect a bug.</t> | ||||
</list> | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title="Acknowledgements" numbered="no"> | ||||
<t>The authors would like to thank Jan Lindblad for his help during the | ||||
design of these YANG modules. | ||||
The authors would like to thank Stephane Litkowski, Charles Eckel, Moh | ||||
amed Boucadair, Tom Petch, Dhruv Dhody and Rob Wilton for their reviews. | ||||
</t> | ||||
</section> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
<!-- Local Variables: --> | <!-- Local Variables: --> | |||
<!-- fill-column:72 --> | <!-- fill-column:72 --> | |||
<!-- End: --> | <!-- End: --> | |||
End of changes. 250 change blocks. | ||||
1001 lines changed or deleted | 844 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |