rfc9418.original | rfc9418.txt | |||
---|---|---|---|---|
OPSAWG B. Claise | Internet Engineering Task Force (IETF) B. Claise | |||
Internet-Draft J. Quilbeuf | Request for Comments: 9418 J. Quilbeuf | |||
Intended status: Standards Track Huawei | Category: Standards Track Huawei | |||
Expires: 7 July 2023 P. Lucente | ISSN: 2070-1721 P. Lucente | |||
NTT | NTT | |||
P. Fasano | P. Fasano | |||
TIM S.p.A | TIM S.p.A | |||
T. Arumugam | T. Arumugam | |||
Cisco Systems, Inc. | Consultant | |||
3 January 2023 | June 2023 | |||
YANG Modules for Service Assurance | A YANG Data Model for Service Assurance | |||
draft-ietf-opsawg-service-assurance-yang-11 | ||||
Abstract | Abstract | |||
This document specifies YANG modules for representing assurance | This document specifies YANG modules for representing assurance | |||
graphs. These graphs represent the assurance of a given service by | graphs. These graphs represent the assurance of a given service by | |||
decomposing it into atomic assurance elements called subservices. A | decomposing it into atomic assurance elements called subservices. | |||
companion document, Service Assurance for Intent-based Networking | The companion document, "Service Assurance for Intent-Based | |||
Architecture, presents an architecture for implementing the assurance | Networking Architecture" (RFC 9417), presents an architecture for | |||
of such services. | implementing the assurance of such services. | |||
The YANG data models in this document conforms to the Network | The YANG data models in this document conform to the Network | |||
Management Datastore Architecture (NMDA) defined in RFC 8342. | Management Datastore Architecture (NMDA) defined in RFC 8342. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 7 July 2023. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9418. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2023 IETF Trust and the persons identified as the | Copyright (c) 2023 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | 1.1. Terminology | |||
2. YANG Modules Overview . . . . . . . . . . . . . . . . . . . . 3 | 2. YANG Modules Overview | |||
3. Base IETF Service Assurance YANG Module . . . . . . . . . . . 4 | 3. Base IETF Service Assurance YANG Module | |||
3.1. Concepts . . . . . . . . . . . . . . . . . . . . . . . . 5 | 3.1. Concepts | |||
3.2. Tree View . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3.2. Tree View | |||
3.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 11 | 3.3. YANG Module | |||
3.4. Rejecting Circular Dependencies . . . . . . . . . . . . . 20 | 3.4. Rejecting Circular Dependencies | |||
4. Guidelines for Defining New Subservice Types . . . . . . . . 20 | 4. Guidelines for Defining New Subservice Types | |||
5. Subservice Augmentation: ietf-service-assurance-device YANG | 5. Subservice Augmentation: "ietf-service-assurance-device" YANG | |||
module . . . . . . . . . . . . . . . . . . . . . . . . . 21 | Module | |||
5.1. Tree View . . . . . . . . . . . . . . . . . . . . . . . . 21 | 5.1. Tree View | |||
5.2. Concepts . . . . . . . . . . . . . . . . . . . . . . . . 22 | 5.2. Concepts | |||
5.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 22 | 5.3. YANG Module | |||
6. Subservice Augmentation: ietf-service-assurance-interface YANG | 6. Subservice Augmentation: "ietf-service-assurance-interface" | |||
module . . . . . . . . . . . . . . . . . . . . . . . . . 24 | YANG Module | |||
6.1. Tree View . . . . . . . . . . . . . . . . . . . . . . . . 24 | 6.1. Tree View | |||
6.2. Concepts . . . . . . . . . . . . . . . . . . . . . . . . 24 | 6.2. Concepts | |||
6.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 24 | 6.3. YANG Module | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 26 | 7. Security Considerations | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 | 8. IANA Considerations | |||
8.1. The IETF XML Registry . . . . . . . . . . . . . . . . . . 27 | 8.1. The IETF XML Registry | |||
8.2. The YANG Module Names Registry . . . . . . . . . . . . . 28 | 8.2. The YANG Module Names Registry | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 9. References | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 28 | 9.1. Normative References | |||
9.2. Informative References . . . . . . . . . . . . . . . . . 30 | 9.2. Informative References | |||
Appendix A. Vendor-specific Subservice Augmentation: | Appendix A. Vendor-Specific Subservice Augmentation: | |||
example-service-assurance-device-acme YANG module . . . . 30 | "example-service-assurance-device-acme" YANG Module | |||
A.1. Tree View . . . . . . . . . . . . . . . . . . . . . . . . 30 | A.1. Tree View | |||
A.2. Concepts . . . . . . . . . . . . . . . . . . . . . . . . 30 | A.2. Concepts | |||
A.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 31 | A.3. YANG Module | |||
Appendix B. Further Augmentations: IP Connectivity and IS-IS | Appendix B. Further Augmentations: IP Connectivity and IS-IS | |||
subservices . . . . . . . . . . . . . . . . . . . . . . . 32 | Subservices | |||
B.1. IP Connectivity Module Tree View . . . . . . . . . . . . 32 | B.1. IP Connectivity Module Tree View | |||
B.2. IS-IS Module Tree View . . . . . . . . . . . . . . . . . 33 | B.2. IS-IS Module Tree View | |||
B.3. Global Tree View . . . . . . . . . . . . . . . . . . . . 33 | B.3. Global Tree View | |||
B.4. IP Connectivity YANG Module . . . . . . . . . . . . . . . 35 | B.4. IP Connectivity YANG Module | |||
B.5. IS-IS YANG Module . . . . . . . . . . . . . . . . . . . . 37 | B.5. IS-IS YANG Module | |||
Appendix C. Example of YANG instance . . . . . . . . . . . . . . 38 | Appendix C. Example of a YANG Instance | |||
Appendix D. YANG Library for Service Assurance . . . . . . . . . 41 | Appendix D. YANG Library for Service Assurance | |||
Appendix E. Changes between revisions . . . . . . . . . . . . . 43 | Acknowledgements | |||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 45 | Authors' Addresses | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 45 | ||||
1. Introduction | 1. Introduction | |||
[I-D.ietf-opsawg-service-assurance-architecture] describes an | [RFC9417] describes an architecture and a set of involved components | |||
architecture and a set of involved components for service assurance, | for service assurance, called Service Assurance for Intent-based | |||
called Service Assurance for Intent-Based Networking (SAIN). This | Networking (SAIN). This document complements the architecture by | |||
document complements the architecture by specifying a data model for | specifying a data model for the interfaces between components. More | |||
the interfaces between components. More specifically, the document | specifically, the document provides YANG modules for the purpose of | |||
provides YANG modules for the purpose of service assurance in a | service assurance in a format that is: | |||
format that is: | ||||
* machine-readable | * machine readable, | |||
* vendor independent | * vendor independent, and | |||
* augmentable such that SAIN agents from Figure 1 of | * augmentable such that SAIN agents from Figure 1 of [RFC9417] can | |||
[I-D.ietf-opsawg-service-assurance-architecture] can support and | support and expose new subservices to SAIN orchestrators and | |||
expose new subservices to SAIN orchestrators and collectors. | collectors. | |||
1.1. Terminology | 1.1. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
The terms used in this document are defined in | The terms used in this document are defined in [RFC9417]. | |||
[I-D.ietf-opsawg-service-assurance-architecture]. | ||||
The meanings of the symbols in the tree diagrams are defined in | The meanings of the symbols in the tree diagrams are defined in | |||
[RFC8340]. | [RFC8340]. | |||
2. YANG Modules Overview | 2. YANG Modules Overview | |||
The main YANG module, "ietf-service-assurance" (Section 3), defines | The main YANG module, "ietf-service-assurance" (Section 3), defines | |||
objects for assuring network services based on their decomposition | objects for assuring network services based on their decomposition | |||
into so-called subservices. The subservices are hierarchically | into so-called subservices. The subservices are hierarchically | |||
organized by dependencies. The subservices, along with the | organized by dependencies. The subservices, along with the | |||
dependencies, constitute an assurance graph. This module should be | dependencies, constitute an assurance graph. This module should be | |||
supported by an agent, able to interact with the devices in order to | supported by an agent that is able to interact with the devices in | |||
produce a health status and symptoms for each subservice in an | order to produce the health statuses and symptoms for each subservice | |||
assurance graph. This module is intended for the following use | in an assurance graph. This module is intended for the following use | |||
cases: | 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 types. | |||
* Assurance telemetry: export the assurance graph with health status | * Assurance telemetry: Export the assurance graph with health | |||
and symptoms for each node. | statuses and symptoms for each node. | |||
The module is also intended to be exported by the SAIN collector | The module is also intended to be exported by the SAIN collector that | |||
which aggregates the output of several SAIN agents to provide the | aggregates the output of several SAIN agents to provide the global | |||
global assurance graph. In that case, only the telemetry export use | assurance graph. In that case, only the telemetry export use case is | |||
case is considered. | considered. | |||
The modules presented in this document conform to the Network | The modules presented in this document conform to the Network | |||
Management Datastore Architecture defined in [RFC8342]. | Management Datastore Architecture (NMDA) defined in [RFC8342]. | |||
The second YANG module, "ietf-service-assurance-device" (Section 5), | The second YANG module, "ietf-service-assurance-device" (Section 5), | |||
augments the "ietf-service-assurance" module by adding support for | augments the "ietf-service-assurance" module by adding support for | |||
the device subservice. Additional subservice types might be added | the device subservice. Additional subservice types might be added | |||
following a similar approach. | following a similar approach. | |||
The third YANG module, "ietf-service-assurance-interface" | The third YANG module, "ietf-service-assurance-interface" | |||
(Section 6), augments the "ietf-service-assurance" module as well, by | (Section 6), augments the "ietf-service-assurance" module as well by | |||
adding support for the interface subservice. | adding support for the interface subservice. | |||
We provide additional examples in the appendix. The module "example- | We provide additional examples in the appendix. The module "example- | |||
service-assurance-device-acme" (Appendix A) augments the "ietf- | service-assurance-device-acme" (Appendix A) augments the "ietf- | |||
service-assurance-device" module to customize it for devices of the | service-assurance-device" module to customize it for devices of the | |||
fictional ACME Corporation. Additional vendor-specific parameters | fictional Acme Corporation. Additional vendor-specific parameters | |||
might be added following a similar approach. We also provide the | might be added following a similar approach. We also provide the | |||
modules "example-service-assurance-ip-connectivity" and "example- | modules "example-service-assurance-ip-connectivity" and "example- | |||
service-assurance-is-is" (Appendix B) to model the example in | service-assurance-is-is" (Appendix B) to model the example in | |||
Figure 2 from Section 3.1 of | Figure 2 from Section 3.1 of [RFC9417]. | |||
[I-D.ietf-opsawg-service-assurance-architecture]. | ||||
3. Base IETF Service Assurance YANG Module | 3. Base IETF Service Assurance YANG Module | |||
3.1. Concepts | 3.1. Concepts | |||
The "ietf-service-assurance" YANG module assumes a set of | The "ietf-service-assurance" YANG module assumes a set of subservices | |||
subservices, to be assured independently. A subservice is a feature | to be assured independently. A subservice is a feature or a subpart | |||
or a subpart of the network system that a given service instance | of the network system that a given service instance depends on. | |||
depends on. Examples of subservice types include: | Examples of subservice types include the following: | |||
* device: whether a device is healthy, and if not, what are the | * device: Whether a device is healthy, and if not, what are the | |||
symptoms. Such a subservice might monitor the device resources | symptoms? Such a subservice might monitor the device resources, | |||
such as CPU, RAM or Ternary Content-Addressable Memory (TCAM). | such as CPU, RAM, or Ternary Content-Addressable Memory (TCAM). | |||
Potential symptoms are "CPU overloaded", "Out of RAM", or "Out of | Potential symptoms are "CPU overloaded", "Out of RAM", or "Out of | |||
TCAM". | TCAM". | |||
* 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. Potential | is the quality of the IP connectivity between them? Potential | |||
symptoms are "No route available" or "Equal Cost Multiple Paths | symptoms are "No route available" or "Equal-Cost Multipaths | |||
(ECMP) Imbalance". | (ECMPs) imbalance". | |||
An instance of the device subservice is representing a subpart of the | An instance of the device subservice is representing a subpart of the | |||
network system, namely a specific device. An instance of the ip- | network system, namely a specific device. An instance of the ip- | |||
connectivity subservice representing a feature of the network, namely | connectivity subservice is representing a feature of the network, | |||
the connectivity between two specific IP addresses on two devices. | namely the connectivity between two specific IP addresses on two | |||
In both cases, these subservices might depend on other subservices, | devices. In both cases, these subservices might depend on other | |||
for instance, the connectivity might depend on a subservice | subservices, for instance, the connectivity might depend on a | |||
representing the routing system and on a subservice representing | subservice representing the routing system and on a subservice | |||
ECMP. | representing ECMPs. | |||
The two example subservices presented above need different sets of | The two example subservices presented above need different sets of | |||
parameters to fully characterize one of their instance. An instance | parameters to fully characterize one of their instances. An instance | |||
of the device subservice is fully characterized by a single parameter | of the device subservice is fully characterized by a single parameter | |||
allowing to identify the device to monitor. For ip-connectivity | allowing to identify the device to monitor. For the ip-connectivity | |||
subservice, at least the device and IP address for both ends of the | subservice, at least the device and IP address for both ends of the | |||
link are needed to fully characterize an instance. | link are needed to fully characterize an instance. | |||
The base model presented in this section specifies a single type of | The base model presented in this section specifies a single type of | |||
subservice, which represents service instances. Such nodes play a | subservice, which represents service instances. Such nodes play a | |||
particular role in the assurance graph because they represent the | particular role in the assurance graph because they represent the | |||
starting point, or root, for the assurance graph of the corresponding | starting point, or root, for the assurance graph of the corresponding | |||
service instance. The parameters required to fully identify a | service instance. The parameters required to fully identify a | |||
service instance are the name of the service and the name of the | service instance are the name of the service and the name of the | |||
service instance. To support other types of subservice such as | service instance. To support other types of subservices, such as | |||
'device' or 'ip-connectivity', the "ietf-service-assurance" module is | device or ip-connectivity, the "ietf-service-assurance" module is | |||
intended to be augmented. | intended to be augmented. | |||
The dependencies are modelled as a list: each subservice contains a | The dependencies are modeled as a list, i.e., each subservice | |||
list of references to its dependencies. That list can be empty if | contains a list of references to its dependencies. That list can be | |||
the subservice instance does not have any dependencies. | empty if the subservice instance does not have any dependencies. | |||
By specifying service instances and their dependencies in terms of | By specifying service instances and their dependencies in terms of | |||
subservices, one defines a global assurance graph. That assurance | subservices, one defines a global assurance graph. That assurance | |||
graph is the result of merging all the individual assurance graphs | graph is the result of merging all the individual assurance graphs | |||
for the assured service instances. Each subservice instance is | for the assured service instances. Each subservice instance is | |||
expected to appear only one in the global assurance graph even if | expected to appear only once in the global assurance graph even if | |||
several service instances depend on it. For example, an instance of | several service instances depend on it. For example, an instance of | |||
the device subservice is a dependency of every service instance that | the device subservice is a dependency of every service instance that | |||
rely on the corresponding device. The assurance graph of a specific | relies on the corresponding device. The assurance graph of a | |||
service instance is the subgraph obtained by traversing the global | specific service instance is the subgraph obtained by traversing the | |||
assurance graph through the dependencies starting from the specific | global assurance graph through the dependencies, starting from the | |||
service instance. | specific service instance. | |||
An assurance agent configured with such a graph is expected to | An assurance agent configured with such a graph is expected to | |||
produce, for each configured subservice: a health-status indicating | produce, for each configured subservice, a health status that | |||
how healthy the subservice is and when the subservice is not healthy, | indicates how healthy the subservice is. If the the subservice is | |||
a list of symptoms explaining why the subservice is not healthy. | not healthy, the agent is expected to produce a list of symptoms | |||
explaining why the subservice is not healthy. | ||||
3.2. Tree View | 3.2. Tree View | |||
The following tree diagram [RFC8340] provides an overview of the | The following tree diagram [RFC8340] provides an overview of the | |||
"ietf-service-assurance" module. | "ietf-service-assurance" module. | |||
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] | |||
skipping to change at page 8, line 5 ¶ | skipping to change at line 298 ¶ | |||
| +--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 | |||
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 | |||
It must be updated each time the graph structure is changed by | only. It must be updated each time the graph structure is changed by | |||
addition or deletion of subservices, dependencies or modification of | addition or deletion of subservices and dependencies or modifications | |||
their configurable attributes, including their maintenance status. | of their configurable attributes, including their maintenance | |||
Such modifications correspond to a structural change in the graph. | statuses. Such modifications correspond to a structural change in | |||
The date of last change is useful for a client to quickly check if | the graph. The date of the last change is useful for a client to | |||
there is a need to update the graph structure. A change in the | quickly check if there is a need to update the graph structure. A | |||
health-score or symptoms associated to a service or subservice does | change in the health score or symptoms associated to a service or | |||
not change the structure of the graph and thus has no effect on the | subservice does not change the structure of the graph, and thus has | |||
date of last change. | no effect on the date of the last change. | |||
The "subservice" list contains all the subservice instances currently | The "subservices" list contains all the subservice instances | |||
known by the server (i.e. SAIN agent or SAIN collector). A | currently known by the server (i.e., SAIN agent or SAIN collector). | |||
subservice declaration MUST provide: | A subservice declaration MUST provide the following: | |||
* A subservice type ("type"): reference to an identity that inherits | * a subservice type ("type"): a reference to an identity that | |||
from "subservice-base", which is the base identity for any | inherits from "subservice-base", which is the base identity for | |||
subservice type. | any subservice type | |||
* An id ("id"): string uniquely identifying the subservice among | * an id ("id"): a string uniquely identifying the subservice among | |||
those with the same type, | those with the same type | |||
The type and id uniquely identify a given subservice. | The type and id uniquely identify a given subservice. | |||
The "last-change" indicates when the dependencies or maintenance | The "last-change" indicates when the dependencies or maintenance | |||
status of this particular subservice were last modified. | status of this particular subservice were last modified. | |||
The "label" is a human-readable description of the subservice. | The "label" is a human-readable description of the subservice. | |||
The presence of "under-maintenance" container inhibits the emission | The presence of the "under-maintenance" container inhibits the | |||
of symptoms for that subservice and subservices that depend on them. | emission of symptoms for the subservice and subservices that depend | |||
In that case, a "contact" MUST be provided to indicate who or which | on them. In that case, a "contact" MUST be provided to indicate who | |||
software is responsible for the maintenance. See Section 3.6 of | or which software is responsible for the maintenance. See | |||
[I-D.ietf-opsawg-service-assurance-architecture] for a more detailed | Section 3.6 of [RFC9417] for a more detailed discussion. | |||
discussion. | ||||
The "parameter" choice is intended to be augmented in order to | The "parameter" choice is intended to be augmented in order to | |||
describe parameters that are specific to the current subservice type. | describe parameters that are specific to the current subservice type. | |||
This base module defines only the subservice type representing | This base module defines only the subservice type representing | |||
service instances. Service instances MUST be modeled as a particular | service instances. Service instances MUST be modeled as a particular | |||
type of subservice with two parameters, "service" and "instance- | type of subservice with two parameters: "service" and "instance- | |||
name". The "service" parameter is the name of the service defined in | name". The "service" parameter is the name of the service defined in | |||
the network orchestrator, for instance "point-to-point-l2vpn". The | the network orchestrator, for instance, "point-to-point-l2vpn". The | |||
"instance-name" parameter is the name assigned to the particular | "instance-name" parameter is the name assigned to the particular | |||
instance to be assured, for instance the name of the customer using | instance to be assured, for instance, the name of the customer using | |||
that instance. | that instance. | |||
The "health-score" contains a value normally between 0 and 100 | The "health-score" contains a value normally between 0 and 100, | |||
indicating how healthy the subservice is. As mentioned in the | indicating how healthy the subservice is. As mentioned in the health | |||
health-score definition, the special value -1 can be used to specify | score definition, the special value -1 can be used to specify that no | |||
that no value could be computed for that health-score, for instance | value could be computed for that health score, for instance, if some | |||
if some metric needed for that computation could not be collected. | metric needed for that computation could not be collected. | |||
The "symptoms-history-start" is the cutoff date for reporting | The "symptoms-history-start" is the cutoff date for reporting | |||
symptoms. Symptoms that were terminated before that date are not | symptoms. Symptoms that were terminated before that date are not | |||
reported anymore in the model. | reported anymore in the model. | |||
The status of each subservice contains a list of symptoms. Each | The status of each subservice contains a list of symptoms. Each | |||
symptom is specified by | symptom is specified by: | |||
* an identifier "symptom-id" which identifies the symptom locally to | * an identifier "symptom-id", which identifies the symptom locally | |||
an agent, | to an agent, | |||
* an agent identifier "agent-id" which identifies the agent raising | * an agent identifier "agent-id", which identifies the agent raising | |||
the symptom, | the symptom, | |||
* a "health-score-weight" specifying the impact to the health score | * a "health-score-weight" specifying the impact to the health score | |||
incurred by this symptom, | incurred by this symptom, | |||
* a "start-date-time" indicating when the symptom became active and | * a "start-date-time" indicating when the symptom became active, and | |||
* a "stop-date-time" indicating when the symptom stopped being | * a "stop-date-time" indicating when the symptom stopped being | |||
active, that field is not present if the symptom is still active. | active (this field is not present if the symptom is still active). | |||
In order for the pair "agent-id" and "symptom-id" to uniquely | In order for the pair "agent-id" and "symptom-id" to uniquely | |||
identify a symptom, the following is necessary: | identify a symptom, the following is necessary: | |||
* The "agent-id" MUST be unique among all agents of the system | * "agent-id" MUST be unique among all agents of the system. | |||
* The "symptom-id" MUST be unique among all symptoms raised by the | * "symptom-id" MUST be unique among all symptoms raised by the | |||
agent | agent. | |||
Note that "agent-id" and "symptom-id" are leafrefs pointing to the | Note that "agent-id" and "symptom-id" are leafrefs pointing to the | |||
objects defined later in the document. While the combination of | objects defined later in the document. While the combination of | |||
"symptom-id" and "agent-id" is sufficient as a unique key list, the | "symptom-id" and "agent-id" is sufficient as a unique key list, the | |||
"start-date-time" second key helps to sort and retrieve relevant | "start-date-time" second key helps to sort and retrieve relevant | |||
symptoms. | symptoms. | |||
The "dependency" list contains the dependencies for the current | The "dependency" list contains the dependencies for the current | |||
subservice. Each of them is specified by a leafref to both "type" | subservice. Each of them is specified by a leafref to both "type" | |||
and "id" of the target dependencies. A dependency has a type | and "id" of the target dependencies. A dependency has a type | |||
indicated in the "dependency-type" field. Two types are specified in | indicated in the "dependency-type" field. Two types are specified in | |||
the model: | the model: | |||
* Impacting: such a dependency indicates an impact on the health of | * Impacting: Such a dependency indicates an impact on the health of | |||
the dependent, | the dependent. | |||
* Informational: such a dependency might explain why the dependent | * Informational: Such a dependency might explain why the dependent | |||
has issues but does not impact its health. | has issues but does not impact its health. | |||
To illustrate the difference between "impacting" and "informational", | To illustrate the difference between "impacting" and "informational", | |||
consider the interface subservice, representing a network interface. | consider the interface subservice representing a network interface. | |||
If the device to which the network interface belongs goes down, the | If the device to which the network interface belongs goes down, the | |||
network interface will transition to a "down" state as well. | network interface will transition to a "down" state as well. | |||
Therefore, the dependency of the interface subservice towards the | Therefore, the dependency of the interface subservice towards the | |||
device subservice is "impacting". On the other hand, a dependency | device subservice is "impacting". On the other hand, a dependency | |||
towards the ecmp-load subservice, which checks that the load between | towards the ecmp-load subservice, which checks that the load between | |||
ECMP remains stable throughout time, is only "informational". | ECMPs remains stable throughout time, is only "informational". | |||
Indeed, services might be perfectly healthy even if the load | Indeed, services might be perfectly healthy even if the load | |||
distribution between ECMP changed. However, such an instability | distribution between ECMPs changed. However, such an instability | |||
might be a relevant symptom for diagnosing the root cause of a | might be a relevant symptom for diagnosing the root cause of a | |||
problem. | problem. | |||
Within the container "agents", the list "agent" contains the list of | Within the container "agents", the list "agent" contains the list of | |||
symptoms per agent. The key of the list is the "id", which MUST be | symptoms per agent. The key of the list is the "id", which MUST be | |||
unique among agents of a given assurance system. For each agent, the | unique among agents of a given assurance system. For each agent, the | |||
list "symptoms-description" maps an "id" to its "description". The | list "symptoms-description" maps an "id" to its "description". The | |||
"id" MUST be unique among the symptoms raised by the agent. | "id" MUST be unique among the symptoms raised by the agent. | |||
Within the container "assured-services", the list "assured-service" | Within the container "assured-services", the list "assured-service" | |||
contains the subservices indexed by assured service instances. For | contains the subservices indexed by assured service instances. For | |||
each service type, identified by the "service" leaf, all instances of | each service type identified by the "service" leaf, all instances of | |||
that service are listed in the "instances" list. For each instance, | that service are listed in the "instances" list. For each instance | |||
identified by the "name" leaf, the "subservices" list contains all | identified by the "name" leaf, the "subservices" list contains all | |||
descendant subservices that are part of the assurance graph for that | descendant subservices that are part of the assurance graph for that | |||
specific instance. These imbricated lists provide a query | specific instance. These imbricated lists provide a query | |||
optimization to get the list of subservices in that assurance graph | optimization to get the list of subservices in that assurance graph | |||
in a single query, instead of recursively querying the dependencies | in a single query instead of recursively querying the dependencies of | |||
of each subservice, starting from the node representing the service | each subservice, starting from the node representing the service | |||
instance. | instance. | |||
The relation between the health score ("health-score") and the | The relation between the health score ("health-score") and the | |||
health-score-weight of the currently active symptoms is not | "health-score-weight" of the currently active symptoms is not | |||
explicitly defined in this document. The only requirement is that a | explicitly defined in this document. The only requirement is that a | |||
health score that is strictly smaller than 100 (the maximal value) | health score that is strictly smaller than 100 (the maximal value) | |||
must be explained by at least one symptom. A way to enforce that | must be explained by at least one symptom. A way to enforce that | |||
requirement is to first detect symptoms and then compute the health | requirement is to first detect symptoms and then compute the health | |||
score based on the health-score-weight of the detected symptoms. As | score based on the "health-score-weight" of the detected symptoms. | |||
an example, such a computation could be to sum the health-score- | As an example, such a computation could be to sum the "health-score- | |||
weight of the active symptoms, subtract that value from 100 and | weight" of the active symptoms, subtract that value from 100, and | |||
change the value to 0 if negative. The relation between health-score | change the value to 0 if the result is negative. The relation | |||
and health-score-weight is left to the implementor (of an agent | between health score and "health-score-weight" is left to the | |||
[I-D.ietf-opsawg-service-assurance-architecture]). | implementor (of an agent [RFC9417]). | |||
Keeping the history of the graph structure is out of scope for this | Keeping the history of the graph structure is out of scope for this | |||
YANG module. Only the current version of the assurance graph can be | YANG module. Only the current version of the assurance graph can be | |||
fetched. In order to keep the history of the graph structure, some | fetched. In order to keep the history of the graph structure, some | |||
time-series database (TSDB) or similar storage must be used. | time-series database (TSDB) or similar storage must be used. | |||
3.3. YANG Module | 3.3. YANG Module | |||
<CODE BEGINS> file "ietf-service-assurance@2022-08-10.yang" | This model contains references to [RFC6991]. | |||
module ietf-service-assurance { | ||||
yang-version 1.1; | ||||
namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance"; | ||||
prefix sain; | ||||
import ietf-yang-types { | ||||
prefix yang; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types"; | ||||
} | ||||
organization | ||||
"IETF OPSAWG Working Group"; | ||||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | ||||
WG List: <mailto:opsawg@ietf.org> | ||||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | ||||
Author: Jean Quilbeuf <mailto:jean.quilbeu@huawei.com>"; | ||||
description | ||||
"This module defines objects for assuring services based on their | ||||
decomposition into so-called subservices, according to the SAIN | ||||
(Service Assurance for Intent-based Networking) architecture. | ||||
The subservices hierarchically organised by dependencies constitute | <CODE BEGINS> file "ietf-service-assurance@2023-06-02.yang" | |||
an assurance graph. This module should be supported by an assurance | module ietf-service-assurance { | |||
agent, able to interact with the devices in order to produce a | yang-version 1.1; | |||
health status and symptoms for each subservice in the assurance | namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance"; | |||
graph. | prefix sain; | |||
This module is intended for the following use cases: | import ietf-yang-types { | |||
* Assurance graph configuration: | prefix yang; | |||
- subservices: configure a set of subservices to assure, by | reference | |||
specifying their types and parameters. | "RFC 6991: Common YANG Data Types"; | |||
- dependencies: configure the dependencies between the | } | |||
subservices, along with their type. | ||||
* Assurance telemetry: export the health status of the subservices, | ||||
along with the observed symptoms. | ||||
Copyright (c) 2022 IETF Trust and the persons identified as | organization | |||
authors of the code. All rights reserved. | "IETF OPSAWG Working Group"; | |||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | ||||
WG List: <mailto:opsawg@ietf.org> | ||||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | ||||
Author: Jean Quilbeuf <mailto:jean.quilbeu@huawei.com>"; | ||||
description | ||||
"This module defines objects for assuring services based on their | ||||
decomposition into so-called subservices, according to the | ||||
Service Assurance for Intent-based Networking (SAIN) | ||||
architecture. | ||||
Redistribution and use in source and binary forms, with or | The subservices hierarchically organized by dependencies | |||
without modification, is permitted pursuant to, and subject | constitute an assurance graph. This module should be supported | |||
to the license terms contained in, the Revised BSD License | by an assurance agent that is able to interact with the devices | |||
set forth in Section 4.c of the IETF Trust's Legal Provisions | in order to produce the health status and symptoms for each | |||
Relating to IETF Documents | subservice in the assurance graph. | |||
(https://trustee.ietf.org/license-info). | ||||
This version of this YANG module is part of RFC XXXX; see the | ||||
RFC itself for full legal notices. "; | ||||
revision 2022-08-10 { | This module is intended for the following use cases: | |||
description | * Assurance graph configuration: | |||
"Initial version."; | - Subservices: Configure a set of subservices to assure by | |||
reference | specifying their types and parameters. | |||
"RFC xxxx: YANG Modules for Service Assurance"; | - Dependencies: Configure the dependencies between the | |||
} | subservices, along with their type. | |||
* Assurance telemetry: Export the health statuses of the | ||||
subservices, along with the observed symptoms. | ||||
identity subservice-base { | Copyright (c) 2023 IETF Trust and the persons identified as | |||
description | authors of the code. All rights reserved. | |||
"Base identity for subservice types."; | ||||
} | ||||
identity service-instance-type { | Redistribution and use in source and binary forms, with or | |||
base subservice-base; | without modification, is permitted pursuant to, and subject | |||
description | to the license terms contained in, the Revised BSD License | |||
"Specific type of subservice that represents a service | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
instance. Instance of this type will depend on other subservices | Relating to IETF Documents | |||
to build the top of the assurance graph."; | (https://trustee.ietf.org/license-info). | |||
} | ||||
identity dependency-type { | This version of this YANG module is part of RFC 9418; see the | |||
description | RFC itself for full legal notices. "; | |||
"Base identity for representing dependency types."; | ||||
} | ||||
identity informational { | ||||
base dependency-type; | ||||
description | ||||
"Indicates that symptoms of the dependency might be of interest | ||||
for the dependent, but the status of the dependency should not | ||||
have any impact on the dependent."; | ||||
} | ||||
identity impacting { | revision 2023-06-02 { | |||
base dependency-type; | description | |||
description | "Initial version."; | |||
"Indicates that the status of the dependency directly impacts the | reference | |||
status of the dependent."; | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | } | |||
grouping subservice-reference { | identity subservice-base { | |||
description | description | |||
"Reference to a specific subservice, identified by its type and | "Base identity for subservice types."; | |||
identifier. This grouping is only for internal use in this | } | |||
module."; | ||||
leaf type { | ||||
type leafref { | ||||
path "/subservices/subservice/type"; | ||||
} | ||||
description | ||||
"The type of the subservice to refer to (e.g., device)."; | ||||
} | ||||
leaf id { | ||||
type leafref { | ||||
path "/subservices/subservice[type=current()/../type]/id"; | ||||
} | ||||
description | ||||
"The identifier of the subservice to refer to."; | ||||
} | ||||
} | ||||
grouping subservice-dependency { | identity service-instance-type { | |||
description | base subservice-base; | |||
"Represents a dependency to another subservice. This grouping | description | |||
is only for internal use in this module"; | "Specific type of subservice that represents a service | |||
uses subservice-reference; | instance. Instance of this type will depend on other | |||
leaf dependency-type { | subservices to build the top of the assurance graph."; | |||
type identityref { | } | |||
base dependency-type; | ||||
} | ||||
description | ||||
"Represents the type of dependency (e.g., informational, | ||||
impacting)."; | ||||
} | identity dependency-type { | |||
} | description | |||
"Base identity for representing dependency types."; | ||||
} | ||||
leaf assurance-graph-last-change { | identity informational { | |||
type yang:date-and-time; | base dependency-type; | |||
config false; | description | |||
mandatory true; | "Indicates that symptoms of the dependency might be of interest | |||
description | for the dependent, but the status of the dependency should not | |||
"Time and date at which the assurance graph last changed after any | have any impact on the dependent."; | |||
structural changes (dependencies and/or maintenance windows | } | |||
parameters) are applied to the subservice(s). The time and date | ||||
must be the same or more recent than the most recent value of any | ||||
changed subservices last-change time and date."; | ||||
} | ||||
container subservices { | ||||
description | ||||
"Root container for the subservices."; | ||||
list subservice { | ||||
key "type id"; | ||||
description | ||||
"List of configured subservices."; | ||||
leaf type { | ||||
type identityref { | ||||
base subservice-base; | ||||
} | ||||
description | ||||
"Type of the subservice, identifying the type of the part | ||||
or functionality that is being assured by this list entry. | ||||
For instance 'interface', 'device', 'ip-connectivity'."; | ||||
} | ||||
leaf id { | ||||
type string; | ||||
description | ||||
"Identifier of the subservice instance. Must be unique among | ||||
subservices of the same type."; | ||||
} | ||||
leaf last-change { | ||||
type yang:date-and-time; | ||||
config false; | ||||
description | ||||
"Date and time at which the structure for this | ||||
subservice instance last changed, i.e., dependencies and/or | ||||
maintenance windows parameters."; | ||||
} | ||||
leaf label { | ||||
type string; | ||||
config false; | ||||
description | ||||
"Label of the subservice, i.e., text describing what the | ||||
subservice is to be displayed on a human interface. | ||||
It is not intended for random end users but for | identity impacting { | |||
network/system/software engineers that are able to interpret | base dependency-type; | |||
it. Therefore, no mechanism for language tagging is needed."; | description | |||
} | "Indicates that the status of the dependency directly impacts | |||
container under-maintenance { | the status of the dependent."; | |||
presence "true"; | } | |||
description | ||||
"The presence of this container indicates that the current | ||||
subservice is under maintenance"; | ||||
leaf contact { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"A string used to model an administratively assigned name of | ||||
the resource that is performing maintenance. | ||||
It is suggested that this freeform field, which could be a | grouping subservice-reference { | |||
URI, contains one or more of the following: IP address, | description | |||
management station name, network manager's name, location, | "Reference to a specific subservice identified by its type and | |||
or phone number. It might even contain the expected | identifier. This grouping is only for internal use in this | |||
maintenance time. | module."; | |||
leaf type { | ||||
type leafref { | ||||
path "/subservices/subservice/type"; | ||||
} | ||||
description | ||||
"The type of the subservice to refer to (e.g., device)."; | ||||
} | ||||
leaf id { | ||||
type leafref { | ||||
path "/subservices/subservice[type=current()/../type]/id"; | ||||
} | ||||
description | ||||
"The identifier of the subservice to refer to."; | ||||
} | ||||
} | ||||
In some cases the agent itself will be the owner of an | grouping subservice-dependency { | |||
entry. In these cases, this string shall be set to a string | description | |||
starting with 'monitor'."; | "Represents a dependency to another subservice. This grouping | |||
} | is only for internal use in this module"; | |||
} | uses subservice-reference; | |||
choice parameter { | leaf dependency-type { | |||
mandatory true; | type identityref { | |||
description | base dependency-type; | |||
"Specify the required parameters per subservice type. Each | } | |||
module augmenting this module with a new subservice type, | description | |||
that is a new identity based on subservice-base should | "Represents the type of dependency (e.g., informational or | |||
augment this choice as well, by adding a container | impacting)."; | |||
available only if the current subservice type is | } | |||
the newly added identity."; | } | |||
container service-instance-parameter { | ||||
when "derived-from-or-self(../type, | ||||
'sain:service-instance-type')"; | ||||
description | ||||
"Specify the parameters of a service instance."; | ||||
leaf service { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Name of the service."; | ||||
} | ||||
leaf instance-name { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Name of the instance for that service."; | ||||
} | ||||
} | ||||
// Other modules can augment their own cases into here | ||||
} | ||||
leaf health-score { | ||||
type int8 { | ||||
range "-1 .. 100"; | ||||
} | ||||
config false; | ||||
mandatory true; | ||||
description | ||||
"Score value of the subservice health. A value of 100 means | ||||
that subservice is healthy. A value of 0 means that the | ||||
subservice is broken. A value between 0 and 100 means that | ||||
the subservice is degraded. The special value -1 means that | ||||
the health-score could not be computed."; | ||||
} | ||||
leaf symptoms-history-start { | ||||
type yang:date-and-time; | ||||
config false; | ||||
description | ||||
"Date and time at which the symptom’s history starts for this | ||||
subservice instance, either because the subservice instance | ||||
started at that date and time or because the symptoms before | ||||
that were removed due to a garbage collection process."; | ||||
} | ||||
container symptoms { | ||||
config false; | ||||
description | ||||
"Symptoms for the subservice."; | ||||
list symptom { | ||||
key "start-date-time agent-id symptom-id"; | ||||
unique "agent-id symptom-id"; | ||||
description | ||||
"List of symptoms the subservice. While the start-date-time | ||||
key is not necessary per se, this would get the entries | ||||
sorted by start-date-time for easy consumption."; | ||||
leaf symptom-id { | ||||
type leafref { | ||||
path "/agents/agent[id=current()/../agent-id]" | ||||
+ "/symptoms/id"; | ||||
} | leaf assurance-graph-last-change { | |||
description | type yang:date-and-time; | |||
"Identifier of the symptom, to be interpreted according | config false; | |||
to the agent identified by the agent-id."; | mandatory true; | |||
} | description | |||
leaf agent-id { | "Time and date at which the assurance graph last changed after | |||
type leafref { | any structural changes (dependencies and/or maintenance | |||
path "/agents/agent/id"; | windows parameters) are applied to the subservice(s). The | |||
} | time and date must be the same or more recent than the most | |||
description | recent value of any changed subservices last-change time and | |||
"Identifier of the agent raising the current symptom."; | date."; | |||
} | } | |||
leaf health-score-weight { | container subservices { | |||
type uint8 { | description | |||
range "0 .. 100"; | "Root container for the subservices."; | |||
} | list subservice { | |||
description | key "type id"; | |||
"The weight to the health score incurred by this symptom. | description | |||
The higher the value, the more of an impact this symptom | "List of configured subservices."; | |||
has. If a subservice health score is not 100, there must | leaf type { | |||
be at least one symptom with a health score weight | type identityref { | |||
larger than 0."; | base subservice-base; | |||
} | } | |||
leaf start-date-time { | description | |||
type yang:date-and-time; | "Type of the subservice identifying the type of the part | |||
description | or functionality that is being assured by this list | |||
"Date and time at which the symptom was detected."; | entry, for instance, interface, device, or | |||
} | ip-connectivity."; | |||
leaf stop-date-time { | } | |||
type yang:date-and-time; | leaf id { | |||
description | type string; | |||
"Date and time at which the symptom stopped being | description | |||
detected. must be after the start-date-time. If the | "Identifier of the subservice instance. Must be unique | |||
symptom is ongoing, this field should not be populated."; | among subservices of the same type."; | |||
} | } | |||
} | leaf last-change { | |||
} | type yang:date-and-time; | |||
container dependencies { | config false; | |||
description | description | |||
"Indicates the set of dependencies of the current subservice, | "Date and time at which the structure for this | |||
along with their types."; | subservice instance last changed, i.e., dependencies | |||
list dependency { | and/or maintenance windows parameters."; | |||
key "type id"; | } | |||
description | leaf label { | |||
"List of dependencies of the subservice."; | type string; | |||
uses subservice-dependency; | config false; | |||
} | description | |||
} | "Label of the subservice, i.e., text describing what the | |||
subservice is to be displayed on a human interface. | ||||
} | It is not intended for random end users but for | |||
} | network/system/software engineers that are able to | |||
container agents { | interpret it. Therefore, no mechanism for language | |||
config false; | tagging is needed."; | |||
description | } | |||
"Container for the list of agents’s symptoms"; | container under-maintenance { | |||
list agent { | presence "true"; | |||
key "id"; | description | |||
description | "The presence of this container indicates that the current | |||
"Contains symptoms of each agent involved in computing the | subservice is under maintenance."; | |||
health status of the current graph. This list acts as a | leaf contact { | |||
glossary for understanding the symptom ids returned by each | type string; | |||
agent."; | mandatory true; | |||
leaf id { | description | |||
type string; | "A string used to model an administratively assigned name | |||
description | of the resource that is performing maintenance. | |||
"Id of the agent for which we are defining the symptoms. This | ||||
identifier must be unique among all agents."; | ||||
} | ||||
list symptoms { | ||||
key "id"; | ||||
description | ||||
"List of symptoms raised by the current agent, identified | ||||
by their symptom-id."; | ||||
leaf id { | ||||
type string; | ||||
description | ||||
"Id of the symptom for the current agent. The agent must | ||||
guarantee the unicity of this identifier."; | ||||
} | ||||
leaf description { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Description of the symptom, i.e., text describing what the | ||||
symptom is, to be computer-consumable and be displayed on a | ||||
human interface. | ||||
It is not intended for random end users but for | It is suggested that this freeform field, which could be | |||
network/system/software engineers that are able to | a URI, contains one or more of the following: IP | |||
interpret it. Therefore, no mechanism for language tagging | address, management station name, network manager's | |||
is needed."; | name, location, and/or phone number. It might even | |||
} | contain the expected maintenance time. | |||
} | ||||
} | ||||
} | ||||
container assured-services { | ||||
config false; | ||||
description | ||||
"Container for the index of assured services"; | ||||
list assured-service { | ||||
key "service"; | ||||
description | ||||
"Service instances that are currently part of the assurance | ||||
graph. The list must contain an entry for every service | ||||
that is currently present in the assurance graph. This list | ||||
presents an alternate access to the graph stored in | ||||
/subservices that optimizes querying the assurance graph of a | ||||
specific service instance."; | ||||
leaf service { | ||||
type leafref { | ||||
path "/subservices/subservice/service-instance-parameter/" | ||||
+ "service"; | ||||
} | ||||
description | ||||
"Name of the service."; | ||||
} | ||||
list instances { | ||||
key "name"; | ||||
description | ||||
"Instances of the service. The list must contain | ||||
an entry for every instance of the parent service."; | ||||
leaf name { | ||||
type leafref { | ||||
path | ||||
"/subservices/subservice/service-instance-parameter/" | ||||
+ "instance-name"; | ||||
} | ||||
description | ||||
"Name of the service instance. The leafref must point to a | ||||
service-instance-parameter whose service leaf matches the | ||||
parent service."; | ||||
} | ||||
list subservices { | ||||
key "type id"; | ||||
description | ||||
"Subservices that appear in the assurance graph of the | ||||
current service instance. | ||||
The list must contain the subservice corresponding to the | In some cases, the agent itself will be the owner of an | |||
service instance, that is the subservice that matches the | entry. In these cases, this string shall be set to a | |||
service and instance-name keys. | string starting with 'monitor'."; | |||
} | ||||
} | ||||
choice parameter { | ||||
mandatory true; | ||||
description | ||||
"Specify the required parameters per subservice type. Each | ||||
module augmenting this module with a new subservice type | ||||
that is a new identity based on subservice-base should | ||||
augment this choice as well by adding a container | ||||
available only if the current subservice type is | ||||
the newly added identity."; | ||||
container service-instance-parameter { | ||||
when "derived-from-or-self(../type, | ||||
'sain:service-instance-type')"; | ||||
description | ||||
"Specify the parameters of a service instance."; | ||||
leaf service { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Name of the service."; | ||||
} | ||||
leaf instance-name { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Name of the instance for that service."; | ||||
} | ||||
} | ||||
// Other modules can augment their own cases into here. | ||||
} | ||||
leaf health-score { | ||||
type int8 { | ||||
range "-1 .. 100"; | ||||
} | ||||
config false; | ||||
mandatory true; | ||||
description | ||||
"Score value of the subservice health. A value of 100 | ||||
means that the subservice is healthy. A value of 0 means | ||||
that the subservice is broken. A value between 0 and 100 | ||||
means that the subservice is degraded. The special value | ||||
-1 means that the health score could not be computed."; | ||||
} | ||||
leaf symptoms-history-start { | ||||
type yang:date-and-time; | ||||
config false; | ||||
description | ||||
"Date and time at which the symptom's history starts for | ||||
this subservice instance, either because the subservice | ||||
instance started at that date and time or because the | ||||
symptoms before that were removed due to a garbage | ||||
collection process."; | ||||
} | ||||
container symptoms { | ||||
config false; | ||||
description | ||||
"Symptoms for the subservice."; | ||||
list symptom { | ||||
key "start-date-time agent-id symptom-id"; | ||||
unique "agent-id symptom-id"; | ||||
description | ||||
"List of symptoms of the subservice. While the | ||||
start-date-time key is not necessary per se, this would | ||||
get the entries sorted by start-date-time for easy | ||||
consumption."; | ||||
leaf symptom-id { | ||||
type leafref { | ||||
path "/agents/agent[id=current()/../agent-id]" | ||||
+ "/symptoms/id"; | ||||
} | ||||
description | ||||
"Identifier of the symptom to be interpreted according | ||||
to the agent identified by the agent-id."; | ||||
} | ||||
leaf agent-id { | ||||
type leafref { | ||||
path "/agents/agent/id"; | ||||
} | ||||
description | ||||
"Identifier of the agent raising the current symptom."; | ||||
} | ||||
leaf health-score-weight { | ||||
type uint8 { | ||||
range "0 .. 100"; | ||||
} | ||||
description | ||||
"The weight to the health score incurred by this | ||||
symptom. The higher the value, the more of an impact | ||||
this symptom has. If a subservice health score is not | ||||
100, there must be at least one symptom with a | ||||
health-score-weight larger than 0."; | ||||
} | ||||
leaf start-date-time { | ||||
type yang:date-and-time; | ||||
description | ||||
"Date and time at which the symptom was detected."; | ||||
} | ||||
leaf stop-date-time { | ||||
type yang:date-and-time; | ||||
description | ||||
"Date and time at which the symptom stopped being | ||||
detected. Must be after the start-date-time. If the | ||||
symptom is ongoing, this field should not be | ||||
populated."; | ||||
} | ||||
} | ||||
} | ||||
container dependencies { | ||||
description | ||||
"Indicates the set of dependencies of the current | ||||
subservice, along with their types."; | ||||
list dependency { | ||||
key "type id"; | ||||
description | ||||
"List of dependencies of the subservice."; | ||||
uses subservice-dependency; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
container agents { | ||||
config false; | ||||
description | ||||
"Container for the list of agents's symptoms."; | ||||
list agent { | ||||
key "id"; | ||||
description | ||||
"Contains symptoms of each agent involved in computing the | ||||
health status of the current graph. This list acts as a | ||||
glossary for understanding the symptom ids returned by each | ||||
agent."; | ||||
leaf id { | ||||
type string; | ||||
description | ||||
"Id of the agent for which we are defining the symptoms. | ||||
This identifier must be unique among all agents."; | ||||
} | ||||
list symptoms { | ||||
key "id"; | ||||
description | ||||
"List of symptoms raised by the current agent that is | ||||
identified by the symptom-id."; | ||||
leaf id { | ||||
type string; | ||||
description | ||||
"Id of the symptom for the current agent. The agent must | ||||
guarantee the unicity of this identifier."; | ||||
} | ||||
leaf description { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Description of the symptom, i.e., text describing what | ||||
the symptom is, is to be computer consumable and | ||||
displayed on a human interface. | ||||
For every subservice in the list, all subservices listed as | It is not intended for random end users but for | |||
dependencies must also appear in the list."; | network/system/software engineers that are able to | |||
uses subservice-reference; | interpret it. Therefore, no mechanism for language | |||
tagging is needed."; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
container assured-services { | ||||
config false; | ||||
description | ||||
"Container for the index of assured services."; | ||||
list assured-service { | ||||
key "service"; | ||||
description | ||||
"Service instances that are currently part of the assurance | ||||
graph. The list must contain an entry for every service | ||||
that is currently present in the assurance graph. This list | ||||
presents an alternate access to the graph stored in | ||||
subservices that optimizes querying the assurance graph of | ||||
a specific service instance."; | ||||
leaf service { | ||||
type leafref { | ||||
path "/subservices/subservice/service-instance-parameter/" | ||||
+ "service"; | ||||
} | ||||
description | ||||
"Name of the service."; | ||||
} | ||||
list instances { | ||||
key "name"; | ||||
description | ||||
"Instances of the service. The list must contain | ||||
an entry for every instance of the parent service."; | ||||
leaf name { | ||||
type leafref { | ||||
path "/subservices/subservice/service-instance-parameter" | ||||
+ "/instance-name"; | ||||
} | ||||
description | ||||
"Name of the service instance. The leafref must point to | ||||
a service-instance-parameter whose service leaf matches | ||||
the parent service."; | ||||
} | ||||
list subservices { | ||||
key "type id"; | ||||
description | ||||
"Subservices that appear in the assurance graph of the | ||||
current service instance. | ||||
} | The list must contain the subservice corresponding to | |||
} | the service instance, i.e., the subservice that | |||
} | matches the service and instance-name keys. | |||
} | ||||
} | ||||
For every subservice in the list, all subservices listed | ||||
as dependencies must also appear in the list."; | ||||
uses subservice-reference; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
} | ||||
<CODE ENDS> | <CODE ENDS> | |||
3.4. Rejecting Circular Dependencies | 3.4. Rejecting Circular Dependencies | |||
The statuses of services and subservices depend on the statuses of | The statuses of services and subservices depend on the statuses of | |||
their dependencies, and thus circular dependencies between them | their dependencies, and thus circular dependencies between them | |||
prevents the computation of statuses. The SAIN architecture document | prevent the computation of statuses. Section 3.1.1 of the SAIN | |||
[I-D.ietf-opsawg-service-assurance-architecture] discusses in | architecture document [RFC9417] discusses how such dependencies | |||
Section 3.1.1 how such dependencies appear and how they could be | appear and how they could be removed. The responsibility of avoiding | |||
removed. The responsibility of avoiding such dependencies falls to | such dependencies falls to the SAIN orchestrator. However, we | |||
the SAIN orchestrator. However, we specify in this section the | specify in this section the expected behavior when a server | |||
expected behavior when a server supporting the ietf-service-assurance | supporting the "ietf-service-assurance" module receives a data | |||
module receives a data instance containing circular dependencies. | instance containing circular dependencies. | |||
Enforcing the absence of circular dependencies as a YANG constraint | Enforcing the absence of circular dependencies as a YANG constraint | |||
falls back to implementing a graph traversal algorithm with XPath and | falls back to implementing a graph traversal algorithm with XPath and | |||
checking that the current node is not reachable from its | checking that the current node is not reachable from its | |||
dependencies. Even with such a constraint, there is no guarantee | dependencies. Even with such a constraint, there is no guarantee | |||
that merging two graphs without dependency loops will result in a | that merging two graphs without dependency loops will result in a | |||
graph without dependency loops. Indeed, the Section 3.1.1 of | graph without dependency loops. Indeed, Section 3.1.1 of [RFC9417] | |||
[I-D.ietf-opsawg-service-assurance-architecture] presents an example | presents an example where merging two graphs without dependency loops | |||
where merging two graphs without dependency loops results in a graph | results in a graph with a dependency loop. | |||
with a dependency loop. | ||||
Therefore, a server implementing the ietf-service-assurance module | Therefore, a server implementing the "ietf-service-assurance" module | |||
MUST check that there is no dependency loop whenever the graph is | MUST check that there is no dependency loop whenever the graph is | |||
modified. A modification creating a dependency loop MUST be | modified. A modification creating a dependency loop MUST be | |||
rejected. | rejected. | |||
4. Guidelines for Defining New Subservice Types | 4. Guidelines for Defining New Subservice Types | |||
The base YANG module defined in Section 3.3 only defines a single | The base YANG module defined in Section 3.3 only defines a single | |||
type of subservices that represent service instances. As explained | type of subservice that represent service instances. As explained | |||
above, this model is meant to be augmented so that a variety of | above, this model is meant to be augmented so that a variety of | |||
subservices can be used in the assurance graph. In this section, we | subservices can be used in the assurance graph. In this section, we | |||
propose some guidelines for specifying such extensions at IETF. | propose some guidelines for specifying such extensions at IETF. | |||
The mechanism to add a new subservice type is to define a new module | The mechanism to add a new subservice type is to define a new module | |||
for that subservice. The module name should start with "ietf- | for that subservice. The module name should start with "ietf- | |||
service-assurance-". The namespace of the module should start with | service-assurance-". The namespace of the module should start with | |||
"urn:ietf:params:xml:ns:yang:ietf-service-assurance-". The prefix of | "urn:ietf:params:xml:ns:yang:ietf-service-assurance-". The prefix of | |||
the module should start with "sain-". For instance, the subservice | the module should start with "sain-". For instance, the subservice | |||
type representing the assurance of a device should have: | type representing the assurance of a device should have: | |||
* the name "ietf-service-assurance-device", | * the name "ietf-service-assurance-device", | |||
* the namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance- | * the namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance- | |||
device", | device", and | |||
* and the prefix "sain-device". | * the prefix "sain-device". | |||
The new module should define: | The new module should define: | |||
* A new identity to represent the new type. | * a new identity to represent the new type and | |||
* The parameters fully specifying an instance of the new subservice | * the parameters fully specifying an instance of the new subservice | |||
type. | type. | |||
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 | The name of the identity should end with "-type", for instance, | |||
"device-type". | "device-type". | |||
The parameters should be defined in a container named "parameters" | The parameters should be defined in a container named "parameters" | |||
augmenting of the choice "/subservices/subservice/parameter" from the | that augments the choice "/subservices/subservice/parameter" from the | |||
main module. The augmentation should be restricted to cases where | main module. The augmentation should be restricted to cases where | |||
the type of the subservice matches the identity representing the new | the type of the subservice matches the identity representing the new | |||
service type. | service type. | |||
We define two subservice types in the next sections: the "device" | We define two subservice types in the next sections: the "device" | |||
subservice type is defined in Section 5 and the "interface" | subservice type is defined in Section 5 and the "interface" | |||
subservice type is defined is Section 6. These subservices can be | subservice type is defined is Section 6. These subservices can be | |||
taken as examples of the rules defined in this section. | taken as examples of the rules defined in this section. | |||
Vendors can specify their own subservices types by defining the | Vendors can specify their own subservices types by defining the | |||
corresponding modules in their own namespace. An example of such a | corresponding modules in their own namespace. An example of such a | |||
vendor-specific module is specified in Appendix Appendix A. Vendors | vendor-specific module is specified in Appendix A. Vendors can also | |||
can also augment existing IETF-specified subservices to add their own | augment existing IETF-specified subservices to add their own vendor- | |||
vendor-specific information. | specific information. | |||
5. Subservice Augmentation: ietf-service-assurance-device YANG module | 5. Subservice Augmentation: "ietf-service-assurance-device" YANG Module | |||
5.1. Tree View | 5.1. Tree View | |||
The following tree diagram [RFC8340] provides an overview of the | The following tree diagram [RFC8340] provides an overview of the | |||
"ietf-service-assurance-device" module. | "ietf-service-assurance-device" module. | |||
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 | |||
A complete tree view of the base module with all augmenting modules | A complete tree view of the base module with all augmenting modules | |||
presented in this draft is available in Appendix B.3. | presented in this document is available in Appendix B.3. | |||
5.2. Concepts | 5.2. Concepts | |||
As the number of subservices will grow over time, the YANG module is | As the number of subservices will grow over time, the YANG module is | |||
designed to be extensible. A new subservice type requires the | designed to be extensible. A new subservice type requires the | |||
precise specifications of its type and expected parameters. Let us | precise specifications of its type and expected parameters. Let us | |||
illustrate the example of the new device subservice type. As the | illustrate the example of the new device subservice type. As the | |||
name implies, it monitors and reports the device health, along with | name implies, it monitors and reports the device health, along with | |||
some symptoms in case of degradation. | some symptoms in case of degradation. | |||
For our device subservice definition, the new identity "device-type" | For our device subservice definition, the new identity "device-type" | |||
is specified, as an inheritance from the base identity for | is specified as an inheritance from the base identity for | |||
subservices. This indicates to the assurance agent that we are now | subservices. This indicates to the assurance agent that we are now | |||
assuring the health of a device. | assuring the health of a device. | |||
The typical parameter for the configuration of the device subservice | The typical parameter for the configuration of the device subservice | |||
is the name of the device that we want to assure. By augmenting the | is the name of the device that we want to assure. By augmenting the | |||
parameter choice from ietf-service-assurance YANG module for the case | parameter choice from the "ietf-service-assurance" YANG module for | |||
of the "device-type" subservice type, this new parameter is | the case of the "device-type" subservice type, this new parameter is | |||
specified. | specified. | |||
5.3. YANG Module | 5.3. YANG Module | |||
<CODE BEGINS> file "ietf-service-assurance-device@2022-08-10.yang" | <CODE BEGINS> file "ietf-service-assurance-device@2023-06-02.yang" | |||
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 { | ||||
prefix sain; | ||||
reference | ||||
"RFC xxxx: YANG Modules for Service Assurance"; | ||||
} | ||||
organization | import ietf-service-assurance { | |||
"IETF OPSAWG Working Group"; | prefix sain; | |||
reference | ||||
"RFC 9418: YANG Modules for Service Assurance"; | ||||
} | ||||
contact | organization | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "IETF OPSAWG Working Group"; | |||
WG List: <mailto:opsawg@ietf.org> | contact | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | "WG Web: <https://datatracker.ietf.org/wg/opsawg/> | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | WG List: <mailto:opsawg@ietf.org> | |||
description | Author: Benoit Claise <mailto:benoit.claise@huawei.com> | |||
"This module augments the ietf-service-assurance module with support | Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | |||
of the device subservice. | description | |||
"This module augments the ietf-service-assurance module with | ||||
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 | ||||
RFC itself for full legal notices. "; | ||||
revision 2022-08-10 { | This version of this YANG module is part of RFC 9418; see the | |||
description | RFC itself for full legal notices. "; | |||
"Initial revision."; | ||||
reference | ||||
"RFC xxxx: YANG Modules for Service Assurance"; | ||||
} | ||||
identity device-type { | revision 2023-06-02 { | |||
base sain:subservice-base; | description | |||
description | "Initial revision."; | |||
"Identity of device subservice."; | reference | |||
} | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | ||||
augment "/sain:subservices/sain:subservice/sain:parameter" { | identity device-type { | |||
when "derived-from-or-self(sain:type, 'device-type')"; | base sain:subservice-base; | |||
description | description | |||
"Augments the parameter choice from ietf-service-assurance | "Identity of device subservice."; | |||
module with a case specific to the device subservice."; | } | |||
container parameters { | ||||
description | ||||
"Parameters for the device subservice type"; | ||||
leaf device { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Identifier of the device to monitor. The | ||||
identifier (e.g. device id, hostname, management IP) | ||||
depends on the context."; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
augment "/sain:subservices/sain:subservice/sain:parameter" { | ||||
when "derived-from-or-self(sain:type, 'device-type')"; | ||||
description | ||||
"Augments the parameter choice from the ietf-service-assurance | ||||
module with a case specific to the device subservice."; | ||||
container parameters { | ||||
description | ||||
"Parameters for the device subservice type."; | ||||
leaf device { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"Identifier of the device to monitor. The | ||||
identifier (e.g., device id, hostname, or management IP) | ||||
depends on the context."; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
<CODE ENDS> | <CODE ENDS> | |||
6. Subservice Augmentation: ietf-service-assurance-interface YANG | 6. Subservice Augmentation: "ietf-service-assurance-interface" YANG | |||
module | Module | |||
6.1. Tree View | 6.1. Tree View | |||
The following tree diagram [RFC8340] provides an overview of the | The following tree diagram [RFC8340] provides an overview of the | |||
ietf-service-assurance-interface data model. | "ietf-service-assurance-interface" data model. | |||
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 | |||
A complete tree view of the base module with all augmenting modules | A complete tree view of the base module with all augmenting modules | |||
presented in this draft is available in Appendix B.3. | presented in this document is available in Appendix B.3. | |||
6.2. Concepts | 6.2. Concepts | |||
For the interface subservice definition, the new interface-type is | For the interface subservice definition, the new interface-type is | |||
specified, as an inheritance from the base identity for subservices. | specified 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 | |||
health of an interface. | health of an interface. | |||
The parameters for the configuration of the interface subservice are | The parameters for the configuration of the interface subservice are | |||
the name of the device and, on that specific device, a specific | the name of the device and, on that specific device, a specific | |||
interface. These parameters are aligned with the ietf-interfaces | interface. These parameters are aligned with the "ietf-interfaces" | |||
model described in [RFC8343] where the name of the interface is the | model described in [RFC8343], where the name of the interface is the | |||
only key needed to identify an interface on a given device. By | only key needed to identify an interface on a given device. By | |||
augmenting the parameter choice from ietf-service-assurance YANG | augmenting the parameter choice from the "ietf-service-assurance" | |||
module for the case of the interface-type subservice type, those two | YANG module for the case of the interface-type subservice type, those | |||
new parameters are specified. | two new parameters are specified. | |||
6.3. YANG Module | 6.3. YANG Module | |||
<CODE BEGINS> file "ietf-service-assurance-interface@2022-08-10.yang" | <CODE BEGINS> file "ietf-service-assurance-interface@2023-06-02.yang" | |||
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')"; | |||
description | description | |||
"Augments the parameter choice from ietf-service-assurance | "Augments the parameter choice from ietf-service-assurance | |||
module with a case specific to the interface subservice."; | module with a case specific to the interface subservice."; | |||
container parameters { | container parameters { | |||
description | description | |||
"Parameters for the interface subservice type."; | "Parameters for the interface subservice type."; | |||
skipping to change at page 26, line 30 ¶ | skipping to change at line 1172 ¶ | |||
} | } | |||
leaf interface { | leaf interface { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Name of the interface."; | "Name of the interface."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
7. Security Considerations | 7. Security Considerations | |||
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 [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer | as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer | |||
is the secure transport layer, and the mandatory-to-implement secure | is the secure transport layer, and the mandatory-to-implement secure | |||
transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer | transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer | |||
is HTTPS, and the mandatory-to-implement secure transport is TLS | is HTTPS, and the mandatory-to-implement secure transport is TLS | |||
[RFC8446]. | [RFC8446]. | |||
The Network Configuration Access Control Model (NACM) [RFC8341] | The Network Configuration Access Control Model (NACM) [RFC8341] | |||
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. | |||
There are a number of data nodes defined in this YANG module that are | There are a number of data nodes defined in these YANG modules that | |||
writable/ creatable/deletable (i.e., config true, which is the | are writable/creatable/deletable (i.e., config true, which is the | |||
default). These data nodes may be considered sensitive or vulnerable | default). These data nodes may be considered sensitive or vulnerable | |||
in some network environments. Write operations (e.g., edit-config) | in some network environments. Write operations (e.g., edit-config) | |||
to these data nodes without proper protection can have a negative | to these data nodes without proper protection can have a negative | |||
effect on network operations. These are the subtrees and data nodes | effect on network operations. These are the subtrees and data nodes | |||
and their sensitivity/vulnerability: | and their sensitivity/vulnerability: | |||
* /subservices/subservice : By modifying this subtree, one can | * /subservices/subservice : By modifying this subtree, one can | |||
modify the structure of the assurance graph which could alter the | modify the structure of the assurance graph, which could alter the | |||
status of the services reported by the assurance framework. On | status of the services reported by the assurance framework. On | |||
one hand, modifications can cause the assurance system to report a | one hand, modifications can cause the assurance system to report a | |||
service as broken when it is actually healthy (false positive), | service as broken when it is actually healthy (false positive), | |||
resulting in engineers or automation software losing time, and | resulting in engineers or automation software losing time and | |||
potentially cause real issues by doing unnecessary modifications | potentially causing real issues by doing unnecessary modifications | |||
on the network. On the other hand, modifications could prevent | on the network. On the other hand, modifications could prevent | |||
the assurance system to report actual issues (false negative), | the assurance system from reporting actual issues (false | |||
resulting in failures that could have been avoided. Depending on | negative), resulting in failures that could have been avoided. | |||
the service, the impact of these avoidable failures could be SLA | Depending on the service, the impact of these avoidable failures | |||
violations fees or disruption of emergency calls. | could be Service-Level Agreement (SLA) violations fees or | |||
disruption of emergency calls. | ||||
Some readable data nodes in this YANG module may be considered | Some readable data nodes in these YANG modules may be considered | |||
sensitive or vulnerable in some network environments. It is thus | sensitive or vulnerable in some network environments. It is thus | |||
important to control read access (e.g., via get, get-config, or | important to control read access (e.g., via get, get-config, or | |||
notification) to these data nodes. These are the subtrees and data | notification) to these data nodes. These are the subtrees and data | |||
nodes and their sensitivity/vulnerability: | nodes and their sensitivity/vulnerability: | |||
* /subservices/subservice | * /subservices/subservice | |||
* /agents/agent | * /agents/agent | |||
* /assured-services/assured-service | * /assured-services/assured-service | |||
Each of these subtrees contains information about services, | Each of these subtrees contains information about services, | |||
subservices or possible symptoms raised by the agents. The | subservices, or possible symptoms raised by the agents. The | |||
information contained in this subtree might give information about | information contained in this subtree might give information about | |||
the underlying network as well as services deployed for the | the underlying network as well as services deployed for the | |||
customers. For instance, a customer might be given access to monitor | customers. For instance, a customer might be given access to monitor | |||
their services status (e.g. via model-driven telemetry). In that | their services status (e.g., via model-driven telemetry). In that | |||
example, the customer access should be restricted to nodes | example, the customer access should be restricted to nodes | |||
representing their services, so as not to divulge information about | representing their services so as not to divulge information about | |||
the underlying network structure or others customers services. | the underlying network structure or others customers services. | |||
8. IANA Considerations | 8. IANA Considerations | |||
8.1. The IETF XML Registry | 8.1. The IETF XML Registry | |||
This document registers 3 URIs in the IETF XML registry [RFC3688]. | IANA has registered the following three URIs in the "IETF XML | |||
Following the format in [RFC3688], the following registrations are | Registry" [RFC3688]: | |||
requested: | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance | URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance | |||
Registrant Contact: The OPSAWG WG of the IETF. | Registrant Contact: The OPSAWG WG of the IETF. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A; the requested URI is an XML namespace. | |||
URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | |||
Registrant Contact: The OPSAWG WG of the IETF. | Registrant Contact: The OPSAWG WG of the IETF. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A; the requested URI is an XML namespace. | |||
URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface | URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface | |||
Registrant Contact: The OPSAWG WG of the IETF. | Registrant Contact: The OPSAWG WG of the IETF. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A; the requested URI is an XML namespace. | |||
8.2. The YANG Module Names Registry | 8.2. The YANG Module Names Registry | |||
This document registers three YANG modules in the YANG Module Names | IANA has registered the following three YANG modules in the "YANG | |||
registry [RFC7950]. Following the format in [RFC7950], the following | Module Names" registry [RFC7950]: | |||
registrations are requested: | ||||
name: ietf-service-assurance | name: ietf-service-assurance | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance | namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance | |||
prefix: sain | prefix: sain | |||
reference: RFC XXXX | reference: RFC 9418 | |||
name: ietf-service-assurance-device | name: ietf-service-assurance-device | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device | |||
prefix: sain-device | prefix: sain-device | |||
reference: RFC XXXX | reference: RFC 9418 | |||
name: ietf-service-assurance-interface | name: ietf-service-assurance-interface | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface | namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance- | |||
prefix: sain-interface | interface | |||
reference: RFC XXXX | prefix: sain-interface | |||
reference: RFC 9418 | ||||
All these modules are not maintained by IANA. | These modules are not maintained by IANA. | |||
9. References | 9. References | |||
9.1. Normative References | 9.1. Normative References | |||
[I-D.ietf-opsawg-service-assurance-architecture] | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Claise, B., Quilbeuf, J., Lopez, D. R., Voyer, D., and T. | Requirement Levels", BCP 14, RFC 2119, | |||
Arumugam, "Service Assurance for Intent-based Networking | ||||
Architecture", Work in Progress, Internet-Draft, draft- | ||||
ietf-opsawg-service-assurance-architecture-13, 3 January | ||||
2023, <https://datatracker.ietf.org/api/v1/doc/document/ | ||||
draft-ietf-opsawg-service-assurance-architecture/>. | ||||
[RFC2119] Bradner, S. and RFC Publisher, "Key words for use in RFCs | ||||
to Indicate Requirement Levels", BCP 14, RFC 2119, | ||||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3688] Mealling, M. and RFC Publisher, "The IETF XML Registry", | [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | |||
BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, | DOI 10.17487/RFC3688, January 2004, | |||
<https://www.rfc-editor.org/info/rfc3688>. | <https://www.rfc-editor.org/info/rfc3688>. | |||
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | |||
Bierman, A., Ed., and RFC Publisher, "Network | and A. Bierman, Ed., "Network Configuration Protocol | |||
Configuration Protocol (NETCONF)", RFC 6241, | (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | |||
DOI 10.17487/RFC6241, June 2011, | ||||
<https://www.rfc-editor.org/info/rfc6241>. | <https://www.rfc-editor.org/info/rfc6241>. | |||
[RFC6242] Wasserman, M. and RFC Publisher, "Using the NETCONF | [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure | |||
Protocol over Secure Shell (SSH)", RFC 6242, | Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, | |||
DOI 10.17487/RFC6242, June 2011, | ||||
<https://www.rfc-editor.org/info/rfc6242>. | <https://www.rfc-editor.org/info/rfc6242>. | |||
[RFC6991] Schoenwaelder, J., Ed. and RFC Publisher, "Common YANG | [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | |||
Data Types", RFC 6991, DOI 10.17487/RFC6991, July 2013, | RFC 6991, DOI 10.17487/RFC6991, July 2013, | |||
<https://www.rfc-editor.org/info/rfc6991>. | <https://www.rfc-editor.org/info/rfc6991>. | |||
[RFC7950] Bjorklund, M., Ed. and RFC Publisher, "The YANG 1.1 Data | [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | |||
Modeling Language", RFC 7950, DOI 10.17487/RFC7950, August | RFC 7950, DOI 10.17487/RFC7950, August 2016, | |||
2016, <https://www.rfc-editor.org/info/rfc7950>. | <https://www.rfc-editor.org/info/rfc7950>. | |||
[RFC8040] Bierman, A., Bjorklund, M., Watsen, K., and RFC Publisher, | [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF | |||
"RESTCONF Protocol", RFC 8040, DOI 10.17487/RFC8040, | Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, | |||
January 2017, <https://www.rfc-editor.org/info/rfc8040>. | <https://www.rfc-editor.org/info/rfc8040>. | |||
[RFC8174] Leiba, B. and RFC Publisher, "Ambiguity of Uppercase vs | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
DOI 10.17487/RFC8174, May 2017, | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
<https://www.rfc-editor.org/info/rfc8174>. | ||||
[RFC8341] Bierman, A., Bjorklund, M., and RFC Publisher, "Network | [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration | |||
Configuration Access Control Model", STD 91, RFC 8341, | Access Control Model", STD 91, RFC 8341, | |||
DOI 10.17487/RFC8341, March 2018, | DOI 10.17487/RFC8341, March 2018, | |||
<https://www.rfc-editor.org/info/rfc8341>. | <https://www.rfc-editor.org/info/rfc8341>. | |||
[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., | [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., | |||
Wilton, R., and RFC Publisher, "Network Management | and R. Wilton, "Network Management Datastore Architecture | |||
Datastore Architecture (NMDA)", RFC 8342, | (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, | |||
DOI 10.17487/RFC8342, March 2018, | ||||
<https://www.rfc-editor.org/info/rfc8342>. | <https://www.rfc-editor.org/info/rfc8342>. | |||
[RFC8446] Rescorla, E. and RFC Publisher, "The Transport Layer | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Security (TLS) Protocol Version 1.3", RFC 8446, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
DOI 10.17487/RFC8446, August 2018, | ||||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC9417] Claise, B., Quilbeuf, J., Lopez, D., Voyer, D., and T. | ||||
Arumugam, "Service Assurance for Intent-Based Networking | ||||
Architecture", RFC 9417, DOI 10.17487/RFC9417, June 2023, | ||||
<https://www.rfc-editor.org/info/rfc9417>. | ||||
9.2. Informative References | 9.2. Informative References | |||
[RFC8340] Bjorklund, M., Berger, L., Ed., and RFC Publisher, "YANG | [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", | |||
Tree Diagrams", BCP 215, RFC 8340, DOI 10.17487/RFC8340, | BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, | |||
March 2018, <https://www.rfc-editor.org/info/rfc8340>. | <https://www.rfc-editor.org/info/rfc8340>. | |||
[RFC8343] Bjorklund, M. and RFC Publisher, "A YANG Data Model for | [RFC8343] Bjorklund, M., "A YANG Data Model for Interface | |||
Interface Management", RFC 8343, DOI 10.17487/RFC8343, | Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, | |||
March 2018, <https://www.rfc-editor.org/info/rfc8343>. | <https://www.rfc-editor.org/info/rfc8343>. | |||
[RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., | [RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., | |||
Wilton, R., and RFC Publisher, "YANG Library", RFC 8525, | and R. Wilton, "YANG Library", RFC 8525, | |||
DOI 10.17487/RFC8525, March 2019, | DOI 10.17487/RFC8525, March 2019, | |||
<https://www.rfc-editor.org/info/rfc8525>. | <https://www.rfc-editor.org/info/rfc8525>. | |||
Appendix A. Vendor-specific Subservice Augmentation: example-service- | Appendix A. Vendor-Specific Subservice Augmentation: "example-service- | |||
assurance-device-acme YANG module | assurance-device-acme" YANG Module | |||
A.1. Tree View | A.1. Tree View | |||
The following tree diagram [RFC8340] provides an overview of the | The following tree diagram [RFC8340] provides an overview of the | |||
"example-service-assurance-device-acme" module. | "example-service-assurance-device-acme" module. | |||
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 | |||
A complete tree view of the base module with all augmenting modules | A complete tree view of the base module with all augmenting modules | |||
presented in this draft is available in Appendix B.3. | presented in this document is available in Appendix B.3. | |||
A.2. Concepts | A.2. Concepts | |||
Under some circumstances, vendor-specific subservice types might be | Under some circumstances, vendor-specific subservice types might be | |||
required. As an example of this vendor-specific implementation, this | required. As an example of this vendor-specific implementation, this | |||
section shows how to augment the "ietf-service-assurance-device" | section shows how to augment the "ietf-service-assurance-device" | |||
module to add custom support for the device subservice, specific to | module to add custom support for the device subservice specific to | |||
the ACME Corporation. The specific version adds a new parameter, | the Acme Corporation. The specific version adds a new parameter | |||
named "acme-specific-parameter". It's an implementation choice to | named "acme-specific-parameter". It's an implementation choice to | |||
either derive a new specific identity from the "subservice-base" | either derive a new specific identity from the "subservice-base" | |||
identity defined in ietf-service-assurance or to augment the | identity defined in the "ietf-service-assurance" module or to augment | |||
parameters from ietf-service-assurance-device, here we choose to | the parameters from the "ietf-service-assurance-device" module; here, | |||
create a new identity. | we choose to create a new identity. | |||
A.3. YANG Module | A.3. YANG Module | |||
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 { | ||||
prefix sain; | ||||
reference | ||||
"RFC xxxx: YANG Modules for Service Assurance"; | ||||
} | ||||
import ietf-service-assurance-device { | ||||
prefix sain-device; | ||||
reference | ||||
"RFC xxxx: YANG Modules for Service Assurance"; | ||||
} | ||||
organization | import ietf-service-assurance { | |||
"IETF OPSAWG Working Group"; | prefix sain; | |||
contact | reference | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "RFC 9418: YANG Modules for Service Assurance"; | |||
WG List: <mailto:opsawg@ietf.org> | } | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | import ietf-service-assurance-device { | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | prefix sain-device; | |||
description | reference | |||
"This example module extends the ietf-service-assurance-device | "RFC 9418: YANG Modules for Service Assurance"; | |||
module to add specific support for devices of ACME Corporation. "; | } | |||
revision 2022-08-10 { | organization | |||
"IETF OPSAWG Working Group"; | ||||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | ||||
WG List: <mailto:opsawg@ietf.org> | ||||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | ||||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | ||||
description | description | |||
"Initial revision"; | "This example module extends the ietf-service-assurance-device | |||
reference | module to add specific support for devices of the Acme | |||
"RFC xxxx: YANG Modules for Service Assurance"; | Corporation. "; | |||
} | ||||
identity device-acme-type { | revision 2023-06-02 { | |||
base sain-device:device-type; | description | |||
description | "Initial revision."; | |||
"Network Device is healthy."; | reference | |||
} | "RFC 9418: YANG Modules for Service Assurance"; | |||
} | ||||
augment "/sain:subservices/sain:subservice/sain:parameter" { | identity device-acme-type { | |||
when "derived-from-or-self(sain:type, 'device-acme-type')"; | base sain-device:device-type; | |||
description | ||||
"Augments the parameter choice from ietf-service-assurance | ||||
module with a case specific to the device-acme subservice."; | ||||
container parameters { | ||||
description | description | |||
"Parameters for the device-acme subservice type"; | "Network device is healthy."; | |||
leaf device { | } | |||
type string; | ||||
mandatory true; | augment "/sain:subservices/sain:subservice/sain:parameter" { | |||
description | when "derived-from-or-self(sain:type, 'device-acme-type')"; | |||
"The device to monitor."; | description | |||
} | "Augments the parameter choice from the ietf-service-assurance | |||
leaf acme-specific-parameter { | module with a case specific to the device-acme subservice."; | |||
type string; | container parameters { | |||
mandatory true; | ||||
description | description | |||
"The ACME Corporation specific parameter."; | "Parameters for the device-acme subservice type."; | |||
leaf device { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"The device to monitor."; | ||||
} | ||||
leaf acme-specific-parameter { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"The Acme-Corporation-specific parameter."; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | ||||
Appendix B. Further Augmentations: IP Connectivity and IS-IS | Appendix B. Further Augmentations: IP Connectivity and IS-IS | |||
subservices | Subservices | |||
In this section, we provide two additional YANG modules to completely | In this section, we provide two additional YANG modules to completely | |||
cover the example in Figure 2 from Section 3.1 of | cover the example in Figure 2 from Section 3.1 of [RFC9417]. The two | |||
[I-D.ietf-opsawg-service-assurance-architecture]. The two missing | missing subservice types are IP connectivity and the Intermediate | |||
subservice types are IP Connectivity and the Intermediate System to | System to Intermediate System (IS-IS) routing protocol. These | |||
Intermediate System (IS-IS) routing protocol. These modules are | modules are presented as examples; some future work is needed to | |||
presented as examples, some future work is needed to propose a more | propose a more complete version. | |||
complete version. | ||||
B.1. IP Connectivity Module Tree View | B.1. IP Connectivity Module Tree View | |||
That subservice represents the unicast connectivity between two IP | That subservice represents the unicast connectivity between two IP | |||
addresses located on two different devices. Such a subservice could | addresses located on two different devices. Such a subservice could | |||
report symptoms such as "No route found". The following tree diagram | report symptoms such as "No route found". The following tree diagram | |||
[RFC8340] provides an overview of the "example-service-assurance-ip- | [RFC8340] provides an overview of the "example-service-assurance-ip- | |||
connectivity" module. | connectivity" module. | |||
module: example-service-assurance-ip-connectivity | module: example-service-assurance-ip-connectivity | |||
skipping to change at page 33, line 38 ¶ | skipping to change at line 1496 ¶ | |||
+--rw instance-name string | +--rw instance-name string | |||
The parameter of this subservice is the name of the IS-IS instance to | The parameter of this subservice is the name of the IS-IS instance to | |||
assure. | assure. | |||
B.3. Global Tree View | B.3. Global Tree View | |||
The following tree diagram [RFC8340] provides an overview of the | The following tree diagram [RFC8340] provides an overview of the | |||
"ietf-service-assurance", "ietf-service-assurance-device", "example- | "ietf-service-assurance", "ietf-service-assurance-device", "example- | |||
service-assurance-device-acme", "example-service-assurance-ip- | service-assurance-device-acme", "example-service-assurance-ip- | |||
connectivity" and "example-service-assurance-is-is" modules. | connectivity", and "example-service-assurance-is-is" modules. | |||
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 | |||
skipping to change at page 35, line 18 ¶ | skipping to change at line 1571 ¶ | |||
+--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 | |||
B.4. IP Connectivity YANG Module | B.4. IP Connectivity YANG Module | |||
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 { | ||||
prefix inet; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types"; | ||||
} | ||||
import ietf-service-assurance { | ||||
prefix sain; | ||||
reference | ||||
"RFC xxxx: YANG Modules for Service Assurance"; | ||||
} | ||||
organization | import ietf-inet-types { | |||
"IETF OPSAWG Working Group"; | prefix inet; | |||
contact | reference | |||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | "RFC 6991: Common YANG Data Types"; | |||
WG List: <mailto:opsawg@ietf.org> | } | |||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | import ietf-service-assurance { | |||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | prefix sain; | |||
description | reference | |||
"This example module augments the ietf-service-assurance module to | "RFC 9418: YANG Modules for Service Assurance"; | |||
add support for the subservice ip-connectivity. | } | |||
Checks whether the ip connectivity between two ip addresses | organization | |||
belonging to two network devices is healthy."; | "IETF OPSAWG Working Group"; | |||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/opsawg/> | ||||
WG List: <mailto:opsawg@ietf.org> | ||||
Author: Benoit Claise <mailto:benoit.claise@huawei.com> | ||||
Author: Jean Quilbeuf <mailto:jean.quilbeuf@huawei.com>"; | ||||
description | ||||
"This example module augments the ietf-service-assurance module | ||||
to add support for the subservice ip-connectivity. | ||||
revision 2022-08-10 { | It checks whether the IP connectivity between two IP addresses | |||
description | belonging to two network devices is healthy."; | |||
"Initial version"; | ||||
reference | revision 2023-06-02 { | |||
"RFC xxxx: YANG Modules for Service Assurance"; | description | |||
} | "Initial version."; | |||
reference | ||||
"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 | |||
"Address at the first end of the connection."; | "Address at the first end of the connection."; | |||
} | } | |||
leaf device2 { | leaf device2 { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Device at the second end of the connection."; | "Device at the second end of the connection."; | |||
} | } | |||
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."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
B.5. IS-IS YANG Module | B.5. IS-IS YANG Module | |||
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."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
Appendix C. Example of YANG instance | Appendix C. Example of a YANG Instance | |||
This section contains an example of YANG instance that conform to the | This section contains an example of a YANG instance that conforms to | |||
YANG modules. The validity of this data instance has been checked | the YANG modules. The validity of this data instance has been | |||
using yangson (https://yangson.labs.nic.cz/). Yangson requires a | checked using yangson <https://yangson.labs.nic.cz/>. Yangson | |||
YANG library [RFC8525] to define the complete model against which the | requires a YANG library [RFC8525] to define the complete model | |||
data instance must be validated. We provide in Appendix D the JSON | against which the data instance must be validated. In Appendix D, we | |||
library file, named "ietf-service-assurance-library.json", that we | provide the JSON library file named "ietf-service-assurance- | |||
used for validation. | library.json", which we used for validation. | |||
We provide below the contents of the file | Below, we provide the contents of the file | |||
"example_configuration_instance.json" which contains the | "example_configuration_instance.json", which contains the | |||
configuration data that models the Figure 2 from Section 3.1 of | configuration data that models Figure 2 from Section 3.1 of | |||
[I-D.ietf-opsawg-service-assurance-architecture]. The instance can | [RFC9417]. The instance can be validated with yangson by using the | |||
be validated with yangson by using the invocation "yangson -v | invocation "yangson -v example_configuration_instance.json ietf- | |||
example_configuration_instance.json ietf-service-assurance- | service-assurance-library.json", assuming all the files (YANG and | |||
library.json", assuming all the files (YANG and JSON) defined in this | JSON) defined in this document reside in the current folder. | |||
draft reside in the current folder. | ||||
{ | { | |||
"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": | |||
"id": "interface/peer1/tunnel0", | "ietf-service-assurance-interface:interface-type", | |||
"dependency-type": "impacting" | "id": "interface/peer1/tunnel0", | |||
}, | "dependency-type": "impacting" | |||
{ | }, | |||
"type": "ietf-service-assurance-interface:interface-type", | { | |||
"id": "interface/peer2/tunnel9", | "type": | |||
"dependency-type": "impacting" | "ietf-service-assurance-interface:interface-type", | |||
}, | "id": "interface/peer2/tunnel9", | |||
{ | "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": | |||
"dependency-type": "impacting" | "connectivity/peer1/2001:db8::1/peer2/2001:db8::2", | |||
} | "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": | |||
"id": "interface/peer1/physical0", | "ietf-service-assurance-interface:interface-type", | |||
"dependency-type": "impacting" | "id": "interface/peer1/physical0", | |||
}, | "dependency-type": "impacting" | |||
{ | }, | |||
"type": "ietf-service-assurance-interface:interface-type", | { | |||
"id": "interface/peer2/physical5", | "type": | |||
"dependency-type": "impacting" | "ietf-service-assurance-interface:interface-type", | |||
}, | "id": "interface/peer2/physical5", | |||
{ | "dependency-type": "impacting" | |||
"type": "example-service-assurance-is-is:is-is-type", | }, | |||
"id": "is-is/instance1", | { | |||
"dependency-type": "impacting" | "type": "example-service-assurance-is-is:is-is-type", | |||
} | "id": "is-is/instance1", | |||
] | "dependency-type": "impacting" | |||
} | } | |||
}, | ] | |||
{ | } | |||
"type": "example-service-assurance-is-is:is-is-type", | }, | |||
"id": "is-is/instance1", | { | |||
"example-service-assurance-is-is:parameters": { | "type": "example-service-assurance-is-is:is-is-type", | |||
"instance-name": "instance1" | "id": "is-is/instance1", | |||
} | "example-service-assurance-is-is:parameters": { | |||
"instance-name": "instance1" | ||||
}, | } | |||
{ | }, | |||
"type": "ietf-service-assurance-interface:interface-type", | { | |||
"id": "interface/peer1/tunnel0", | "type": "ietf-service-assurance-interface:interface-type", | |||
"ietf-service-assurance-interface:parameters": { | "id": "interface/peer1/tunnel0", | |||
"device": "Peer1", | "ietf-service-assurance-interface:parameters": { | |||
"interface": "tunnel0" | "device": "Peer1", | |||
}, | "interface": "tunnel0" | |||
"dependencies": { | }, | |||
"dependency": [ | "dependencies": { | |||
{ | "dependency": [ | |||
"type": "ietf-service-assurance-interface:interface-type", | { | |||
"id": "interface/peer1/physical0", | "type": | |||
"dependency-type": "impacting" | "ietf-service-assurance-interface:interface-type", | |||
} | "id": "interface/peer1/physical0", | |||
] | "dependency-type": "impacting" | |||
} | } | |||
}, | ] | |||
{ | } | |||
"type": "ietf-service-assurance-interface:interface-type", | }, | |||
"id": "interface/peer1/physical0", | { | |||
"ietf-service-assurance-interface:parameters": { | "type": "ietf-service-assurance-interface:interface-type", | |||
"device": "Peer1", | "id": "interface/peer1/physical0", | |||
"interface": "physical0" | "ietf-service-assurance-interface:parameters": { | |||
}, | "device": "Peer1", | |||
"dependencies": { | "interface": "physical0" | |||
"dependency": [ | }, | |||
{ | "dependencies": { | |||
"type": "ietf-service-assurance-device:device-type", | "dependency": [ | |||
"id": "interface/peer1", | { | |||
"dependency-type": "impacting" | "type": "ietf-service-assurance-device:device-type", | |||
} | "id": "interface/peer1", | |||
] | "dependency-type": "impacting" | |||
} | } | |||
}, | ] | |||
{ | } | |||
"type": "ietf-service-assurance-device:device-type", | }, | |||
"id": "interface/peer1", | { | |||
"ietf-service-assurance-device:parameters": { | "type": "ietf-service-assurance-device:device-type", | |||
"device": "Peer1" | "id": "interface/peer1", | |||
} | "ietf-service-assurance-device:parameters": { | |||
}, | "device": "Peer1" | |||
{ | } | |||
"type": "ietf-service-assurance-interface:interface-type", | }, | |||
"id": "interface/peer2/tunnel9", | { | |||
"ietf-service-assurance-interface:parameters": { | "type": "ietf-service-assurance-interface:interface-type", | |||
"device": "Peer2", | "id": "interface/peer2/tunnel9", | |||
"interface": "tunnel9" | "ietf-service-assurance-interface:parameters": { | |||
"device": "Peer2", | ||||
}, | "interface": "tunnel9" | |||
"dependencies": { | }, | |||
"dependency": [ | "dependencies": { | |||
{ | "dependency": [ | |||
"type": "ietf-service-assurance-interface:interface-type", | { | |||
"id": "interface/peer2/physical5", | "type": | |||
"dependency-type": "impacting" | "ietf-service-assurance-interface:interface-type", | |||
} | "id": "interface/peer2/physical5", | |||
] | "dependency-type": "impacting" | |||
} | } | |||
}, | ] | |||
{ | } | |||
"type": "ietf-service-assurance-interface:interface-type", | }, | |||
"id": "interface/peer2/physical5", | { | |||
"ietf-service-assurance-interface:parameters": { | "type": "ietf-service-assurance-interface:interface-type", | |||
"device": "Peer2", | "id": "interface/peer2/physical5", | |||
"interface": "physical5" | "ietf-service-assurance-interface:parameters": { | |||
}, | "device": "Peer2", | |||
"dependencies": { | "interface": "physical5" | |||
"dependency": [ | }, | |||
{ | "dependencies": { | |||
"type": "ietf-service-assurance-device:device-type", | "dependency": [ | |||
"id": "interface/peer2", | { | |||
"dependency-type": "impacting" | "type": "ietf-service-assurance-device:device-type", | |||
} | "id": "interface/peer2", | |||
] | "dependency-type": "impacting" | |||
} | } | |||
}, | ] | |||
{ | } | |||
"type": "ietf-service-assurance-device:device-type", | }, | |||
"id": "interface/peer2", | { | |||
"ietf-service-assurance-device:parameters": { | "type": "ietf-service-assurance-device:device-type", | |||
"device": "Peer2" | "id": "interface/peer2", | |||
} | "ietf-service-assurance-device:parameters": { | |||
} | "device": "Peer2" | |||
] | } | |||
} | } | |||
} | ] | |||
} | ||||
} | ||||
Appendix D. YANG Library for Service Assurance | Appendix D. YANG Library for Service Assurance | |||
This section provides the JSON encoding of the YANG library [RFC8525] | This section provides the JSON encoding of the YANG library [RFC8525] | |||
listing all modules defined in this draft and their dependencies. | that lists all modules defined in this document and their | |||
This library can be used to validate data instances using yangson, as | dependencies. This library can be used to validate data instances | |||
explained in the previous section. | using yangson, as explained in the previous section. | |||
{ | { | |||
"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" | |||
} | } | |||
] | ] | |||
} | } | |||
} | } | |||
Appendix E. Changes between revisions | ||||
[[RFC editor: please remove this section before publication.]] | ||||
v09 - v10 | ||||
* Address comments from Last Call | ||||
v07 - v08 | ||||
* Address comments from Rob Wilton's AD review | ||||
v06 - v07 | ||||
* Addressed early YANG doctor comments from version -06: changed | ||||
-idty for -type or -base in identity names and removed "under- | ||||
maintenance" leaf | ||||
* Add new list of services with the corresponding subservices | ||||
* Remove assurance-graph-version and state the limitations of having | ||||
only the current graph available in the module. | ||||
* Added new list of agents to store symptom and guarantee unicity of | ||||
symptom ids | ||||
* Added security consideration for readable nodes | ||||
* Added section on rejecting circular dependencies | ||||
v05 - v06 | ||||
* Remove revision history in modules | ||||
* Present elements in order of the tree for the main module | ||||
* Rewriting and rewording for clarity | ||||
* Made parameters mandatory for the subservices | ||||
v04 - v05 | ||||
* Remove Guidelines section | ||||
* Move informative parts (examples) to appendix | ||||
* Minor text edits and reformulations | ||||
v03 - v04 | ||||
* Fix YANG errors | ||||
* Change is-is and ip-connectivity subservices from ietf to example. | ||||
* Mention that models are NMDA compliant | ||||
* Fix typos, reformulate for clarity | ||||
v02 - v03 | ||||
* Change counter32 to counter64 to avoid resetting too frequently | ||||
* Explain why relation between health-score and symptom's health- | ||||
score-weight is not defined and how it could be defined | ||||
v01 - v02 | ||||
* Explicitly represent the fact that the health-score could not be | ||||
computed (value -1) | ||||
v00 - v01 | ||||
* Added needed subservice to model example from architecture draft | ||||
* Added guideline section for naming models | ||||
* Added data instance examples and validation procedure | ||||
* Added the "parameters" container in the interface YANG module to | ||||
correct a bug. | ||||
Acknowledgements | Acknowledgements | |||
The authors would like to thank Jan Lindblad for his help during the | The authors would like to thank Jan Lindblad for his help during the | |||
design of these YANG modules. The authors would like to thank | design of these YANG modules. The authors would like to thank | |||
Stephane Litkowski, Charles Eckel, Mohamed Boucadair, Tom Petch, | Stephane Litkowski, Charles Eckel, Mohamed Boucadair, Tom Petch, | |||
Dhruv Dhody and Rob Wilton for their reviews. | Dhruv Dhody, and Rob Wilton for their reviews. | |||
Authors' Addresses | Authors' Addresses | |||
Benoit Claise | Benoit Claise | |||
Huawei | Huawei | |||
Email: benoit.claise@huawei.com | Email: benoit.claise@huawei.com | |||
Jean Quilbeuf | Jean Quilbeuf | |||
Huawei | Huawei | |||
Email: jean.quilbeuf@huawei.com | Email: jean.quilbeuf@huawei.com | |||
skipping to change at page 45, line 37 ¶ | skipping to change at line 1987 ¶ | |||
Email: paolo@ntt.net | Email: paolo@ntt.net | |||
Paolo Fasano | Paolo Fasano | |||
TIM S.p.A | TIM S.p.A | |||
via G. Reiss Romoli, 274 | via G. Reiss Romoli, 274 | |||
10148 Torino | 10148 Torino | |||
Italy | Italy | |||
Email: paolo2.fasano@telecomitalia.it | Email: paolo2.fasano@telecomitalia.it | |||
Thangam Arumugam | Thangam Arumugam | |||
Cisco Systems, Inc. | Consultant | |||
Milpitas (California), | Milpitas, California | |||
United States | United States of America | |||
Email: tarumuga@cisco.com | Email: thangavelu@yahoo.com | |||
End of changes. 201 change blocks. | ||||
1295 lines changed or deleted | 1204 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |