diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
commit | 4bfd864f10b68b71482b35c818559068ef8d5797 (patch) | |
tree | e3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc9418.txt | |
parent | ea76e11061bda059ae9f9ad130a9895cc85607db (diff) |
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc9418.txt')
-rw-r--r-- | doc/rfc/rfc9418.txt | 1998 |
1 files changed, 1998 insertions, 0 deletions
diff --git a/doc/rfc/rfc9418.txt b/doc/rfc/rfc9418.txt new file mode 100644 index 0000000..5669675 --- /dev/null +++ b/doc/rfc/rfc9418.txt @@ -0,0 +1,1998 @@ + + + + +Internet Engineering Task Force (IETF) B. Claise +Request for Comments: 9418 J. Quilbeuf +Category: Standards Track Huawei +ISSN: 2070-1721 P. Lucente + NTT + P. Fasano + TIM S.p.A + T. Arumugam + Consultant + July 2023 + + + A YANG Data Model for Service Assurance + +Abstract + + This document specifies YANG modules for representing assurance + graphs. These graphs represent the assurance of a given service by + decomposing it into atomic assurance elements called subservices. + The companion document, "Service Assurance for Intent-Based + Networking Architecture" (RFC 9417), presents an architecture for + implementing the assurance of such services. + + The YANG data models in this document conform to the Network + Management Datastore Architecture (NMDA) defined in RFC 8342. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + 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 (c) 2023 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 1.1. Terminology + 2. YANG Modules Overview + 3. Base IETF Service Assurance YANG Module + 3.1. Concepts + 3.2. Tree View + 3.3. YANG Module + 3.4. Rejecting Circular Dependencies + 4. Guidelines for Defining New Subservice Types + 5. Subservice Augmentation: "ietf-service-assurance-device" YANG + Module + 5.1. Tree View + 5.2. Concepts + 5.3. YANG Module + 6. Subservice Augmentation: "ietf-service-assurance-interface" + YANG Module + 6.1. Tree View + 6.2. Concepts + 6.3. YANG Module + 7. Security Considerations + 8. IANA Considerations + 8.1. The IETF XML Registry + 8.2. The YANG Module Names Registry + 9. References + 9.1. Normative References + 9.2. Informative References + Appendix A. Vendor-Specific Subservice Augmentation: + "example-service-assurance-device-acme" YANG Module + A.1. Tree View + A.2. Concepts + A.3. YANG Module + Appendix B. Further Augmentations: IP Connectivity and IS-IS + Subservices + B.1. IP Connectivity Module Tree View + B.2. IS-IS Module Tree View + B.3. Global Tree View + B.4. IP Connectivity YANG Module + B.5. IS-IS YANG Module + Appendix C. Example of a YANG Instance + Appendix D. YANG Library for Service Assurance + Acknowledgements + Authors' Addresses + +1. Introduction + + [RFC9417] describes an architecture and a set of involved components + for service assurance, called Service Assurance for Intent-based + Networking (SAIN). This document complements the architecture by + specifying a data model for the interfaces between components. More + specifically, the document provides YANG modules for the purpose of + service assurance in a format that is: + + * machine readable, + + * vendor independent, and + + * augmentable such that SAIN agents from Figure 1 of [RFC9417] can + support and expose new subservices to SAIN orchestrators and + collectors. + +1.1. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + The terms used in this document are defined in [RFC9417]. + + The meanings of the symbols in the tree diagrams are defined in + [RFC8340]. + +2. YANG Modules Overview + + The main YANG module, "ietf-service-assurance" (Section 3), defines + objects for assuring network services based on their decomposition + into so-called subservices. The subservices are hierarchically + organized by dependencies. The subservices, along with the + dependencies, constitute an assurance graph. This module should be + supported by an agent that is able to interact with the devices in + order to produce the health statuses and symptoms for each subservice + in an assurance graph. This module is intended for the following use + cases: + + * Assurance graph configuration: + + - Subservices: Configure a set of subservices to assure by + specifying their types and parameters. + + - Dependencies: Configure the dependencies between the + subservices, along with their types. + + * Assurance telemetry: Export the assurance graph with health + statuses and symptoms for each node. + + The module is also intended to be exported by the SAIN collector that + aggregates the output of several SAIN agents to provide the global + assurance graph. In that case, only the telemetry export use case is + considered. + + The modules presented in this document conform to the Network + Management Datastore Architecture (NMDA) defined in [RFC8342]. + + The second YANG module, "ietf-service-assurance-device" (Section 5), + augments the "ietf-service-assurance" module by adding support for + the device subservice. Additional subservice types might be added + following a similar approach. + + The third YANG module, "ietf-service-assurance-interface" + (Section 6), augments the "ietf-service-assurance" module as well by + adding support for the interface subservice. + + We provide additional examples in the appendix. The module "example- + service-assurance-device-acme" (Appendix A) augments the "ietf- + service-assurance-device" module to customize it for devices of the + fictional Acme Corporation. Additional vendor-specific parameters + might be added following a similar approach. We also provide the + modules "example-service-assurance-ip-connectivity" and "example- + service-assurance-is-is" (Appendix B) to model the example in + Figure 2 from Section 3.1 of [RFC9417]. + +3. Base IETF Service Assurance YANG Module + +3.1. Concepts + + The "ietf-service-assurance" YANG module assumes a set of subservices + to be assured independently. A subservice is a feature or a subpart + of the network system that a given service instance depends on. + Examples of subservice types include the following: + + * device: Whether a device is healthy, and if not, what are the + symptoms? Such a subservice might monitor the device resources, + such as CPU, RAM, or Ternary Content-Addressable Memory (TCAM). + Potential symptoms are "CPU overloaded", "Out of RAM", or "Out of + TCAM". + + * ip-connectivity: Given two IP addresses bound to two devices, what + is the quality of the IP connectivity between them? Potential + symptoms are "No route available" or "Equal-Cost Multipaths + (ECMPs) imbalance". + + An instance of the device subservice is representing a subpart of the + network system, namely a specific device. An instance of the ip- + connectivity subservice is representing a feature of the network, + namely the connectivity between two specific IP addresses on two + devices. In both cases, these subservices might depend on other + subservices, for instance, the connectivity might depend on a + subservice representing the routing system and on a subservice + representing ECMPs. + + The two example subservices presented above need different sets of + parameters to fully characterize one of their instances. An instance + of the device subservice is fully characterized by a single parameter + allowing to identify the device to monitor. For the ip-connectivity + subservice, at least the device and IP address for both ends of the + link are needed to fully characterize an instance. + + The base model presented in this section specifies a single type of + subservice, which represents service instances. Such nodes play a + particular role in the assurance graph because they represent the + starting point, or root, for the assurance graph of the corresponding + service instance. The parameters required to fully identify a + service instance are the name of the service and the name of the + service instance. To support other types of subservices, such as + device or ip-connectivity, the "ietf-service-assurance" module is + intended to be augmented. + + The dependencies are modeled as a list, i.e., each subservice + contains a list of references to its dependencies. That list can be + empty if the subservice instance does not have any dependencies. + + By specifying service instances and their dependencies in terms of + subservices, one defines a global assurance graph. That assurance + graph is the result of merging all the individual assurance graphs + for the assured service instances. Each subservice instance is + expected to appear only once in the global assurance graph even if + several service instances depend on it. For example, an instance of + the device subservice is a dependency of every service instance that + relies on the corresponding device. The assurance graph of a + specific service instance is the subgraph obtained by traversing the + global assurance graph through the dependencies, starting from the + specific service instance. + + An assurance agent configured with such a graph is expected to + produce, for each configured subservice, a health status that + indicates how healthy the subservice is. If the subservice is not + healthy, the agent is expected to produce a list of symptoms + explaining why the subservice is not healthy. + +3.2. Tree View + + The following tree diagram [RFC8340] provides an overview of the + "ietf-service-assurance" module. + + module: ietf-service-assurance + +--ro assurance-graph-last-change yang:date-and-time + +--rw subservices + | +--rw subservice* [type id] + | +--rw type identityref + | +--rw id string + | +--ro last-change? yang:date-and-time + | +--ro label? string + | +--rw under-maintenance! + | | +--rw contact string + | +--rw (parameter) + | | +--:(service-instance-parameter) + | | +--rw service-instance-parameter + | | +--rw service string + | | +--rw instance-name string + | +--ro health-score int8 + | +--ro symptoms-history-start? yang:date-and-time + | +--ro symptoms + | | +--ro symptom* [start-date-time agent-id symptom-id] + | | +--ro symptom-id leafref + | | +--ro agent-id -> /agents/agent/id + | | +--ro health-score-weight? uint8 + | | +--ro start-date-time yang:date-and-time + | | +--ro stop-date-time? yang:date-and-time + | +--rw dependencies + | +--rw dependency* [type id] + | +--rw type + | | -> /subservices/subservice/type + | +--rw id leafref + | +--rw dependency-type? identityref + +--ro agents + | +--ro agent* [id] + | +--ro id string + | +--ro symptoms* [id] + | +--ro id string + | +--ro description string + +--ro assured-services + +--ro assured-service* [service] + +--ro service leafref + +--ro instances* [name] + +--ro name leafref + +--ro subservices* [type id] + +--ro type -> /subservices/subservice/type + +--ro id leafref + + The date of the last change in "assurance-graph-last-change" is read + only. It must be updated each time the graph structure is changed by + addition or deletion of subservices and dependencies or modifications + of their configurable attributes, including their maintenance + statuses. Such modifications correspond to a structural change in + the graph. The date of the last change is useful for a client to + quickly check if there is a need to update the graph structure. A + change in the health score or symptoms associated to a service or + subservice does not change the structure of the graph, and thus has + no effect on the date of the last change. + + The "subservices" list contains all the subservice instances + currently known by the server (i.e., SAIN agent or SAIN collector). + A subservice declaration MUST provide the following: + + * a subservice type ("type"): a reference to an identity that + inherits from "subservice-base", which is the base identity for + any subservice type + + * an id ("id"): a string uniquely identifying the subservice among + those with the same type + + The type and id uniquely identify a given subservice. + + The "last-change" indicates when the dependencies or maintenance + status of this particular subservice were last modified. + + The "label" is a human-readable description of the subservice. + + The presence of the "under-maintenance" container inhibits the + emission of symptoms for the subservice and subservices that depend + on them. In that case, a "contact" MUST be provided to indicate who + or which software is responsible for the maintenance. See + Section 3.6 of [RFC9417] for a more detailed discussion. + + The "parameter" choice is intended to be augmented in order to + describe parameters that are specific to the current subservice type. + This base module defines only the subservice type representing + service instances. Service instances MUST be modeled as a particular + type of subservice with two parameters: "service" and "instance- + name". The "service" parameter is the name of the service defined in + the network orchestrator, for instance, "point-to-point-l2vpn". The + "instance-name" parameter is the name assigned to the particular + instance to be assured, for instance, the name of the customer using + that instance. + + The "health-score" contains a value normally between 0 and 100, + indicating how healthy the subservice is. As mentioned in the health + score definition, the special value -1 can be used to specify that no + value could be computed for that health score, for instance, if some + metric needed for that computation could not be collected. + + The "symptoms-history-start" is the cutoff date for reporting + symptoms. Symptoms that were terminated before that date are not + reported anymore in the model. + + The status of each subservice contains a list of symptoms. Each + symptom is specified by: + + * an identifier "symptom-id", which identifies the symptom locally + to an agent, + + * an agent identifier "agent-id", which identifies the agent raising + the symptom, + + * a "health-score-weight" specifying the impact to the health score + incurred by this symptom, + + * a "start-date-time" indicating when the symptom became active, and + + * a "stop-date-time" indicating when the symptom stopped being + active (this field is not present if the symptom is still active). + + In order for the pair "agent-id" and "symptom-id" to uniquely + identify a symptom, the following is necessary: + + * "agent-id" MUST be unique among all agents of the system. + + * "symptom-id" MUST be unique among all symptoms raised by the + agent. + + Note that "agent-id" and "symptom-id" are leafrefs pointing to the + objects defined later in the document. While the combination of + "symptom-id" and "agent-id" is sufficient as a unique key list, the + "start-date-time" second key helps to sort and retrieve relevant + symptoms. + + The "dependency" list contains the dependencies for the current + subservice. Each of them is specified by a leafref to both "type" + and "id" of the target dependencies. A dependency has a type + indicated in the "dependency-type" field. Two types are specified in + the model: + + * Impacting: Such a dependency indicates an impact on the health of + the dependent. + + * Informational: Such a dependency might explain why the dependent + has issues but does not impact its health. + + To illustrate the difference between "impacting" and "informational", + consider the interface subservice representing a network interface. + If the device to which the network interface belongs goes down, the + network interface will transition to a "down" state as well. + Therefore, the dependency of the interface subservice towards the + device subservice is "impacting". On the other hand, a dependency + towards the ecmp-load subservice, which checks that the load between + ECMPs remains stable throughout time, is only "informational". + Indeed, services might be perfectly healthy even if the load + distribution between ECMPs changed. However, such an instability + might be a relevant symptom for diagnosing the root cause of a + problem. + + 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 + unique among agents of a given assurance system. For each agent, the + list "symptoms-description" maps an "id" to its "description". The + "id" MUST be unique among the symptoms raised by the agent. + + Within the container "assured-services", the list "assured-service" + contains the subservices indexed by assured service instances. For + each service type identified by the "service" leaf, all instances of + that service are listed in the "instances" list. For each instance + identified by the "name" leaf, the "subservices" list contains all + descendant subservices that are part of the assurance graph for that + specific instance. These imbricated lists provide a query + optimization to get the list of subservices in that assurance graph + in a single query instead of recursively querying the dependencies of + each subservice, starting from the node representing the service + instance. + + The relation between the health score ("health-score") and the + "health-score-weight" of the currently active symptoms is not + explicitly defined in this document. The only requirement is that a + health score that is strictly smaller than 100 (the maximal value) + must be explained by at least one symptom. A way to enforce that + requirement is to first detect symptoms and then compute the health + score based on the "health-score-weight" of the detected symptoms. + As an example, such a computation could be to sum the "health-score- + weight" of the active symptoms, subtract that value from 100, and + change the value to 0 if the result is negative. The relation + between health score and "health-score-weight" is left to the + implementor (of an agent [RFC9417]). + + 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 + fetched. In order to keep the history of the graph structure, some + time-series database (TSDB) or similar storage must be used. + +3.3. YANG Module + + This model contains references to [RFC6991]. + + <CODE BEGINS> file "ietf-service-assurance@2023-07-11.yang" + 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 + Service Assurance for Intent-based Networking (SAIN) + architecture. + + The subservices hierarchically organized by dependencies + constitute an assurance graph. This module should be supported + by an assurance agent that is able to interact with the devices + in order to produce the health status and symptoms for each + subservice in the assurance graph. + + This module is intended for the following use cases: + * Assurance graph configuration: + - Subservices: Configure a set of subservices to assure by + specifying their types and parameters. + - 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. + + Copyright (c) 2023 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 9418; see the + RFC itself for full legal notices. "; + + revision 2023-07-11 { + description + "Initial version."; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + identity subservice-base { + description + "Base identity for subservice types."; + } + + identity service-instance-type { + base subservice-base; + description + "Specific type of subservice that represents a service + instance. Instance of this type will depend on other + subservices to build the top of the assurance graph."; + } + + identity dependency-type { + description + "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 { + base dependency-type; + description + "Indicates that the status of the dependency directly impacts + the status of the dependent."; + } + + grouping subservice-reference { + description + "Reference to a specific subservice identified by its type and + 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 { + description + "Represents a dependency to another subservice. This grouping + is only for internal use in this module"; + uses subservice-reference; + leaf dependency-type { + type identityref { + base dependency-type; + } + description + "Represents the type of dependency (e.g., informational or + impacting)."; + } + } + + leaf assurance-graph-last-change { + type yang:date-and-time; + config false; + mandatory true; + description + "Time and date at which the assurance graph last changed after + any 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, or + 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 + network/system/software engineers that are able to + interpret it. Therefore, no mechanism for language + tagging is needed."; + } + container under-maintenance { + 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 URI, contains one or more of the following: IP + address, management station name, network manager's + name, location, and/or phone number. It might even + contain the expected maintenance time. + + In some cases, the agent itself will be the owner of an + entry. In these cases, this string shall be set to a + 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' 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. + + It is not intended for random end users but for + network/system/software engineers that are able to + 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> + +3.4. Rejecting Circular Dependencies + + The statuses of services and subservices depend on the statuses of + their dependencies, and thus circular dependencies between them + prevent the computation of statuses. Section 3.1.1 of the SAIN + architecture document [RFC9417] discusses how such dependencies + appear and how they could be removed. The responsibility of avoiding + such dependencies falls to the SAIN orchestrator. However, we + specify in this section the expected behavior when a server + supporting the "ietf-service-assurance" module receives a data + instance containing circular dependencies. + + Enforcing the absence of circular dependencies as a YANG constraint + falls back to implementing a graph traversal algorithm with XPath and + checking that the current node is not reachable from its + dependencies. Even with such a constraint, there is no guarantee + that merging two graphs without dependency loops will result in a + graph without dependency loops. Indeed, Section 3.1.1 of [RFC9417] + presents an example where merging two graphs without dependency loops + results in a graph with a dependency loop. + + Therefore, a server implementing the "ietf-service-assurance" module + MUST check that there is no dependency loop whenever the graph is + modified. A modification creating a dependency loop MUST be + rejected. + +4. Guidelines for Defining New Subservice Types + + The base YANG module defined in Section 3.3 only defines a single + type of subservice that represent service instances. As explained + 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 + propose some guidelines for specifying such extensions at IETF. + + The mechanism to add a new subservice type is to define a new module + for that subservice. The module name should start with "ietf- + service-assurance-". The namespace of the module should start with + "urn:ietf:params:xml:ns:yang:ietf-service-assurance-". The prefix of + the module should start with "sain-". For instance, the subservice + type representing the assurance of a device should have: + + * the name "ietf-service-assurance-device", + + * the namespace "urn:ietf:params:xml:ns:yang:ietf-service-assurance- + device", and + + * the prefix "sain-device". + + The new module should define: + + * a new identity to represent the new type and + + * the parameters fully specifying an instance of the new subservice + type. + + The new identity should be based on the "subservice-base" identity. + The name of the identity should end with "-type", for instance, + "device-type". + + The parameters should be defined in a container named "parameters" + that augments the choice "/subservices/subservice/parameter" from the + main module. The augmentation should be restricted to cases where + the type of the subservice matches the identity representing the new + service type. + + 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 is Section 6. These subservices can be + taken as examples of the rules defined in this section. + + Vendors can specify their own subservices types by defining the + corresponding modules in their own namespace. An example of such a + vendor-specific module is specified in Appendix A. Vendors can also + augment existing IETF-specified subservices to add their own vendor- + specific information. + +5. Subservice Augmentation: "ietf-service-assurance-device" YANG Module + +5.1. Tree View + + The following tree diagram [RFC8340] provides an overview of the + "ietf-service-assurance-device" module. + + module: ietf-service-assurance-device + + augment /sain:subservices/sain:subservice/sain:parameter: + +--rw parameters + +--rw device string + + A complete tree view of the base module with all augmenting modules + presented in this document is available in Appendix B.3. + +5.2. Concepts + + As the number of subservices will grow over time, the YANG module is + designed to be extensible. A new subservice type requires the + precise specifications of its type and expected parameters. Let us + illustrate the example of the new device subservice type. As the + name implies, it monitors and reports the device health, along with + some symptoms in case of degradation. + + For our device subservice definition, the new identity "device-type" + is specified as an inheritance from the base identity for + subservices. This indicates to the assurance agent that we are now + assuring the health of a device. + + The typical parameter for the configuration of the device subservice + is the name of the device that we want to assure. By augmenting the + parameter choice from the "ietf-service-assurance" YANG module for + the case of the "device-type" subservice type, this new parameter is + specified. + +5.3. YANG Module + + <CODE BEGINS> file "ietf-service-assurance-device@2023-07-11.yang" + module ietf-service-assurance-device { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-service-assurance-device"; + prefix sain-device; + + import ietf-service-assurance { + prefix sain; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + 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 + "This module augments the ietf-service-assurance module with + support of the device subservice. + + Copyright (c) 2023 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 9418; see the + RFC itself for full legal notices. "; + + revision 2023-07-11 { + description + "Initial revision."; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + identity device-type { + base sain:subservice-base; + description + "Identity of device subservice."; + } + + 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> + +6. Subservice Augmentation: "ietf-service-assurance-interface" YANG + Module + +6.1. Tree View + + The following tree diagram [RFC8340] provides an overview of the + "ietf-service-assurance-interface" data model. + + module: ietf-service-assurance-interface + + augment /sain:subservices/sain:subservice/sain:parameter: + +--rw parameters + +--rw device string + +--rw interface string + + A complete tree view of the base module with all augmenting modules + presented in this document is available in Appendix B.3. + +6.2. Concepts + + For the interface subservice definition, the new interface-type is + specified as an inheritance from the base identity for subservices. + This indicates to the assurance agent that we are now assuring the + health of an interface. + + The parameters for the configuration of the interface subservice are + the name of the device and, on that specific device, a specific + interface. These parameters are aligned with the "ietf-interfaces" + model described in [RFC8343], where the name of the interface is the + only key needed to identify an interface on a given device. By + augmenting the parameter choice from the "ietf-service-assurance" + YANG module for the case of the interface-type subservice type, those + two new parameters are specified. + +6.3. YANG Module + + <CODE BEGINS> file "ietf-service-assurance-interface@2023-07-11.yang" + module ietf-service-assurance-interface { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface"; + prefix sain-interface; + + import ietf-service-assurance { + prefix sain; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + 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 + "This module extends the ietf-service-assurance module to add + support for the interface subservice. + + It checks whether an interface is healthy. + + Copyright (c) 2023 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 9418; see the + RFC itself for full legal notices. "; + + revision 2023-07-11 { + description + "Initial revision."; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + identity interface-type { + base sain:subservice-base; + description + "Checks whether an interface is healthy."; + } + + augment "/sain:subservices/sain:subservice/sain:parameter" { + when "derived-from-or-self(sain:type, 'interface-type')"; + description + "Augments the parameter choice from ietf-service-assurance + module with a case specific to the interface subservice."; + container parameters { + description + "Parameters for the interface subservice type."; + leaf device { + type string; + mandatory true; + description + "Device supporting the interface."; + } + leaf interface { + type string; + mandatory true; + description + "Name of the interface."; + } + } + } + } + <CODE ENDS> + +7. Security Considerations + + The YANG modules specified in this document define schema for data + that is designed to be accessed via network management protocols such + as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer + is the secure transport layer, and the mandatory-to-implement secure + transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer + is HTTPS, and the mandatory-to-implement secure transport is TLS + [RFC8446]. + + The Network Configuration Access Control Model (NACM) [RFC8341] + provides the means to restrict access for particular NETCONF or + RESTCONF users to a preconfigured subset of all available NETCONF or + RESTCONF protocol operations and content. + + There are a number of data nodes defined in these YANG modules that + are writable/creatable/deletable (i.e., config true, which is the + default). These data nodes may be considered sensitive or vulnerable + in some network environments. Write operations (e.g., edit-config) + to these data nodes without proper protection can have a negative + effect on network operations. These are the subtrees and data nodes + and their sensitivity/vulnerability: + + * /subservices/subservice : By modifying this subtree, one can + modify the structure of the assurance graph, which could alter the + status of the services reported by the assurance framework. On + one hand, modifications can cause the assurance system to report a + service as broken when it is actually healthy (false positive), + resulting in engineers or automation software losing time and + potentially causing real issues by doing unnecessary modifications + on the network. On the other hand, modifications could prevent + the assurance system from reporting actual issues (false + negative), resulting in failures that could have been avoided. + Depending on the service, the impact of these avoidable failures + could be Service-Level Agreement (SLA) violations fees or + disruption of emergency calls. + + Some readable data nodes in these YANG modules may be considered + sensitive or vulnerable in some network environments. It is thus + important to control read access (e.g., via get, get-config, or + notification) to these data nodes. These are the subtrees and data + nodes and their sensitivity/vulnerability: + + * /subservices/subservice + + * /agents/agent + + * /assured-services/assured-service + + Each of these subtrees contains information about services, + subservices, or possible symptoms raised by the agents. The + information contained in this subtree might give information about + the underlying network as well as services deployed for the + customers. For instance, a customer might be given access to monitor + their services status (e.g., via model-driven telemetry). In that + example, the customer access should be restricted to nodes + representing their services so as not to divulge information about + the underlying network structure or others customers services. + +8. IANA Considerations + +8.1. The IETF XML Registry + + IANA has registered the following three URIs in the "IETF XML + Registry" [RFC3688]: + + URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance + Registrant Contact: The OPSAWG WG of the IETF. + XML: N/A; the requested URI is an XML namespace. + + URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device + Registrant Contact: The OPSAWG WG of the IETF. + XML: N/A; the requested URI is an XML namespace. + + URI: urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface + Registrant Contact: The OPSAWG WG of the IETF. + XML: N/A; the requested URI is an XML namespace. + +8.2. The YANG Module Names Registry + + IANA has registered the following three YANG modules in the "YANG + Module Names" registry [RFC7950]: + + name: ietf-service-assurance + namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance + prefix: sain + reference: RFC 9418 + + name: ietf-service-assurance-device + namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance-device + prefix: sain-device + reference: RFC 9418 + + name: ietf-service-assurance-interface + namespace: urn:ietf:params:xml:ns:yang:ietf-service-assurance- + interface + prefix: sain-interface + reference: RFC 9418 + + These modules are not maintained by IANA. + +9. References + +9.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, + DOI 10.17487/RFC3688, January 2004, + <https://www.rfc-editor.org/info/rfc3688>. + + [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., + and A. Bierman, Ed., "Network Configuration Protocol + (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, + <https://www.rfc-editor.org/info/rfc6241>. + + [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure + Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, + <https://www.rfc-editor.org/info/rfc6242>. + + [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", + RFC 6991, DOI 10.17487/RFC6991, July 2013, + <https://www.rfc-editor.org/info/rfc6991>. + + [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", + RFC 7950, DOI 10.17487/RFC7950, August 2016, + <https://www.rfc-editor.org/info/rfc7950>. + + [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF + Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, + <https://www.rfc-editor.org/info/rfc8040>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration + Access Control Model", STD 91, RFC 8341, + DOI 10.17487/RFC8341, March 2018, + <https://www.rfc-editor.org/info/rfc8341>. + + [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., + and R. Wilton, "Network Management Datastore Architecture + (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, + <https://www.rfc-editor.org/info/rfc8342>. + + [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol + Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, + <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, July 2023, + <https://www.rfc-editor.org/info/rfc9417>. + +9.2. Informative References + + [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", + BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, + <https://www.rfc-editor.org/info/rfc8340>. + + [RFC8343] Bjorklund, M., "A YANG Data Model for Interface + Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, + <https://www.rfc-editor.org/info/rfc8343>. + + [RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., + and R. Wilton, "YANG Library", RFC 8525, + DOI 10.17487/RFC8525, March 2019, + <https://www.rfc-editor.org/info/rfc8525>. + +Appendix A. Vendor-Specific Subservice Augmentation: "example-service- + assurance-device-acme" YANG Module + +A.1. Tree View + + The following tree diagram [RFC8340] provides an overview of the + "example-service-assurance-device-acme" module. + + module: example-service-assurance-device-acme + + augment /sain:subservices/sain:subservice/sain:parameter: + +--rw parameters + +--rw device string + +--rw acme-specific-parameter string + + A complete tree view of the base module with all augmenting modules + presented in this document is available in Appendix B.3. + +A.2. Concepts + + Under some circumstances, vendor-specific subservice types might be + required. As an example of this vendor-specific implementation, this + section shows how to augment the "ietf-service-assurance-device" + module to add custom support for the device subservice specific to + the Acme Corporation. The specific version adds a new parameter + named "acme-specific-parameter". It's an implementation choice to + either derive a new specific identity from the "subservice-base" + identity defined in the "ietf-service-assurance" module or to augment + the parameters from the "ietf-service-assurance-device" module; here, + we choose to create a new identity. + +A.3. YANG Module + + module example-service-assurance-device-acme { + yang-version 1.1; + namespace "urn:example:example-service-assurance-device-acme"; + prefix example-device-acme; + + import ietf-service-assurance { + prefix sain; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + import ietf-service-assurance-device { + prefix sain-device; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + 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 + "This example module extends the ietf-service-assurance-device + module to add specific support for devices of the Acme + Corporation. "; + + revision 2023-07-11 { + description + "Initial revision."; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + identity device-acme-type { + base sain-device:device-type; + description + "Network device is healthy."; + } + + augment "/sain:subservices/sain:subservice/sain:parameter" { + when "derived-from-or-self(sain:type, 'device-acme-type')"; + description + "Augments the parameter choice from the ietf-service-assurance + module with a case specific to the device-acme subservice."; + container parameters { + description + "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 + Subservices + + In this section, we provide two additional YANG modules to completely + cover the example in Figure 2 from Section 3.1 of [RFC9417]. The two + missing subservice types are IP connectivity and the Intermediate + System to Intermediate System (IS-IS) routing protocol. These + modules are presented as examples; some future work is needed to + propose a more complete version. + +B.1. IP Connectivity Module Tree View + + That subservice represents the unicast connectivity between two IP + addresses located on two different devices. Such a subservice could + report symptoms such as "No route found". The following tree diagram + [RFC8340] provides an overview of the "example-service-assurance-ip- + connectivity" module. + + module: example-service-assurance-ip-connectivity + + augment /sain:subservices/sain:subservice/sain:parameter: + +--rw parameters + +--rw device1 string + +--rw address1 inet:ip-address + +--rw device2 string + +--rw address2 inet:ip-address + + To specify the connectivity that we are interested in, we specify two + IP addresses and two devices. The subservice assures that the + connectivity between IP address 1 on device 1 and IP address 2 on + device 2 is healthy. + +B.2. IS-IS Module Tree View + + The following tree diagram [RFC8340] provides an overview of the + "example-service-assurance-is-is" module. + + module: example-service-assurance-is-is + + augment /sain:subservices/sain:subservice/sain:parameter: + +--rw parameters + +--rw instance-name string + + The parameter of this subservice is the name of the IS-IS instance to + assure. + +B.3. Global Tree View + + The following tree diagram [RFC8340] provides an overview of the + "ietf-service-assurance", "ietf-service-assurance-device", "example- + service-assurance-device-acme", "example-service-assurance-ip- + connectivity", and "example-service-assurance-is-is" modules. + + module: ietf-service-assurance + +--ro assurance-graph-last-change yang:date-and-time + +--rw subservices + | +--rw subservice* [type id] + | +--rw type identityref + | +--rw id string + | +--ro last-change? + | | yang:date-and-time + | +--ro label? string + | +--rw under-maintenance! + | | +--rw contact string + | +--rw (parameter) + | | +--:(service-instance-parameter) + | | | +--rw service-instance-parameter + | | | +--rw service string + | | | +--rw instance-name string + | | +--:(example-ip-connectivity:parameters) + | | | +--rw example-ip-connectivity:parameters + | | | +--rw example-ip-connectivity:device1 string + | | | +--rw example-ip-connectivity:address1 + | | | | inet:ip-address + | | | +--rw example-ip-connectivity:device2 string + | | | +--rw example-ip-connectivity:address2 + | | | inet:ip-address + | | +--:(example-is-is:parameters) + | | | +--rw example-is-is:parameters + | | | +--rw example-is-is:instance-name string + | | +--:(sain-device:parameters) + | | | +--rw sain-device:parameters + | | | +--rw sain-device:device string + | | +--:(example-device-acme:parameters) + | | | +--rw example-device-acme:parameters + | | | +--rw example-device-acme:device + | | | | string + | | | +--rw example-device-acme:acme-specific-parameter + | | | string + | | +--:(sain-interface:parameters) + | | +--rw sain-interface:parameters + | | +--rw sain-interface:device string + | | +--rw sain-interface:interface string + | +--ro health-score int8 + | +--ro symptoms-history-start? + | | yang:date-and-time + | +--ro symptoms + | | +--ro symptom* [start-date-time agent-id symptom-id] + | | +--ro symptom-id leafref + | | +--ro agent-id -> /agents/agent/id + | | +--ro health-score-weight? uint8 + | | +--ro start-date-time yang:date-and-time + | | +--ro stop-date-time? yang:date-and-time + | +--rw dependencies + | +--rw dependency* [type id] + | +--rw type + | | -> /subservices/subservice/type + | +--rw id leafref + | +--rw dependency-type? identityref + +--ro agents + | +--ro agent* [id] + | +--ro id string + | +--ro symptoms* [id] + | +--ro id string + | +--ro description string + +--ro assured-services + +--ro assured-service* [service] + +--ro service leafref + +--ro instances* [name] + +--ro name leafref + +--ro subservices* [type id] + +--ro type -> /subservices/subservice/type + +--ro id leafref + +B.4. IP Connectivity YANG Module + + module example-service-assurance-ip-connectivity { + yang-version 1.1; + namespace "urn:example:example-service-assurance-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 9418: YANG Modules for Service Assurance"; + } + + 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 + "This example module augments the ietf-service-assurance module + to add support for the subservice ip-connectivity. + + It checks whether the IP connectivity between two IP addresses + belonging to two network devices is healthy."; + + revision 2023-07-11 { + description + "Initial version."; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + identity ip-connectivity-type { + base sain:subservice-base; + description + "Checks connectivity between two IP addresses."; + } + + augment "/sain:subservices/sain:subservice/sain:parameter" { + when "derived-from-or-self(sain:type, 'ip-connectivity-type')"; + description + "Augments the parameter choice from the ietf-service-assurance + module with a case specific to the ip-connectivity + subservice."; + container parameters { + description + "Parameters for the ip-connectivity subservice type."; + leaf device1 { + type string; + mandatory true; + description + "Device at the first end of the connection."; + } + leaf address1 { + type inet:ip-address; + mandatory true; + description + "Address at the first end of the connection."; + } + leaf device2 { + type string; + mandatory true; + description + "Device at the second end of the connection."; + } + leaf address2 { + type inet:ip-address; + mandatory true; + description + "Address at the second end of the connection."; + } + } + } + } + +B.5. IS-IS YANG Module + + module example-service-assurance-is-is { + yang-version 1.1; + namespace "urn:example:example-service-assurance-is-is"; + prefix example-is-is; + + import ietf-service-assurance { + prefix sain; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + 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 + "This example module augments the ietf-service-assurance module + to add support for the subservice is-is. + + It checks whether an IS-IS instance is healthy."; + + revision 2023-07-11 { + description + "Initial version."; + reference + "RFC 9418: YANG Modules for Service Assurance"; + } + + identity is-is-type { + base sain:subservice-base; + description + "Health of IS-IS routing protocol."; + } + + augment "/sain:subservices/sain:subservice/sain:parameter" { + when "derived-from-or-self(sain:type, 'is-is-type')"; + description + "Augments the parameter choice from the ietf-service-assurance + module with a case specific to the is-is subservice."; + container parameters { + description + "Parameters for the is-is subservice type."; + leaf instance-name { + type string; + mandatory true; + description + "The instance to monitor."; + } + } + } + } + +Appendix C. Example of a YANG Instance + + This section contains an example of a YANG instance that conforms to + the YANG modules. The validity of this data instance has been + checked using yangson <https://yangson.labs.nic.cz/>. Yangson + requires a YANG library [RFC8525] to define the complete model + against which the data instance must be validated. In Appendix D, we + provide the JSON library file named "ietf-service-assurance- + library.json", which we used for validation. + + Below, we provide the contents of the file + "example_configuration_instance.json", which contains the + configuration data that models Figure 2 from Section 3.1 of + [RFC9417]. The instance can be validated with yangson by using the + invocation "yangson -v example_configuration_instance.json ietf- + service-assurance-library.json", assuming all the files (YANG and + JSON) defined in this document reside in the current folder. + + { + "ietf-service-assurance:subservices": { + "subservice": [ + { + "type": "service-instance-type", + "id": "simple-tunnel/example", + "service-instance-parameter": { + "service": "simple-tunnel", + "instance-name": "example" + }, + "dependencies": { + "dependency": [ + { + "type": + "ietf-service-assurance-interface:interface-type", + "id": "interface/peer1/tunnel0", + "dependency-type": "impacting" + }, + { + "type": + "ietf-service-assurance-interface:interface-type", + "id": "interface/peer2/tunnel9", + "dependency-type": "impacting" + }, + { + "type": + "example-service-assurance-ip-connectivity:ip-connectivity-type", + "id": + "connectivity/peer1/2001:db8::1/peer2/2001:db8::2", + "dependency-type": "impacting" + } + ] + } + }, + { + "type": + "example-service-assurance-ip-connectivity:ip-connectivity-type", + "id": "connectivity/peer1/2001:db8::1/peer2/2001:db8::2", + "example-service-assurance-ip-connectivity:parameters": { + "device1": "Peer1", + "address1": "2001:db8::1", + "device2": "Peer2", + "address2": "2001:db8::2" + }, + "dependencies": { + "dependency": [ + { + "type": + "ietf-service-assurance-interface:interface-type", + "id": "interface/peer1/physical0", + "dependency-type": "impacting" + }, + { + "type": + "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", + "example-service-assurance-is-is:parameters": { + "instance-name": "instance1" + } + }, + { + "type": "ietf-service-assurance-interface:interface-type", + "id": "interface/peer1/tunnel0", + "ietf-service-assurance-interface:parameters": { + "device": "Peer1", + "interface": "tunnel0" + }, + "dependencies": { + "dependency": [ + { + "type": + "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": { + "device": "Peer1", + "interface": "physical0" + }, + "dependencies": { + "dependency": [ + { + "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": { + "device": "Peer1" + } + }, + { + "type": "ietf-service-assurance-interface:interface-type", + "id": "interface/peer2/tunnel9", + "ietf-service-assurance-interface:parameters": { + "device": "Peer2", + "interface": "tunnel9" + }, + "dependencies": { + "dependency": [ + { + "type": + "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": { + "device": "Peer2", + "interface": "physical5" + }, + "dependencies": { + "dependency": [ + { + "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": { + "device": "Peer2" + } + } + ] + } + } + +Appendix D. YANG Library for Service Assurance + + This section provides the JSON encoding of the YANG library [RFC8525] + that lists all modules defined in this document and their + dependencies. This library can be used to validate data instances + using yangson, as explained in the previous section. + + { + "ietf-yang-library:modules-state": { + "module-set-id": "ietf-service-assurance@2023-07-11", + "module": [ + { + "name": "ietf-service-assurance", + "namespace": + "urn:ietf:params:xml:ns:yang:ietf-service-assurance", + "revision": "2023-07-11", + "conformance-type": "implement" + }, + { + "name": "ietf-service-assurance-device", + "namespace": + "urn:ietf:params:xml:ns:yang:ietf-service-assurance-device", + "revision": "2023-07-11", + "conformance-type": "implement" + }, + { + "name": "ietf-service-assurance-interface", + "namespace": + "urn:ietf:params:xml:ns:yang:ietf-service-assurance-interface", + "revision": "2023-07-11", + "conformance-type": "implement" + }, + { + "name": "example-service-assurance-device-acme", + "namespace": + "urn:example:example-service-assurance-device-acme", + "revision": "2023-07-11", + "conformance-type": "implement" + }, + { + "name": "example-service-assurance-is-is", + "namespace": "urn:example:example-service-assurance-is-is", + "revision": "2023-07-11", + "conformance-type": "implement" + }, + { + "name": "example-service-assurance-ip-connectivity", + "namespace": + "urn:example:example-service-assurance-ip-connectivity", + "revision": "2023-07-11", + "conformance-type": "implement" + }, + { + "name": "ietf-yang-types", + "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types", + "revision": "2013-07-05", + "conformance-type": "import" + }, + { + "name": "ietf-inet-types", + "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types", + "revision": "2013-07-05", + "conformance-type": "import" + } + ] + } + } + +Acknowledgements + + The authors would like to thank Jan Lindblad for his help during the + design of these YANG modules. The authors would like to thank + Stephane Litkowski, Charles Eckel, Mohamed Boucadair, Tom Petch, + Dhruv Dhody, and Rob Wilton for their reviews. + +Authors' Addresses + + Benoit Claise + Huawei + Email: benoit.claise@huawei.com + + + Jean Quilbeuf + Huawei + Email: jean.quilbeuf@huawei.com + + + Paolo Lucente + NTT + Siriusdreef 70-72 + 2132 Hoofddorp + Netherlands + Email: paolo@ntt.net + + + Paolo Fasano + TIM S.p.A + via G. Reiss Romoli, 274 + 10148 Torino + Italy + Email: paolo2.fasano@telecomitalia.it + + + Thangavelu Arumugam + Consultant + Milpitas, California + United States of America + Email: thangavelu@yahoo.com |