RFC 9417

Service Assurance for Intent-Based Networking Architecture

πŸ“… published July 2023, from ietf

RFC 9417: Service Assurance for Intent-Based Networking Architecture πŸ’–

Okay bestie, here's the header, copied exactly so nothing gets lost πŸŽ€

Internet Engineering Task Force (IETF)                         B. Claise
Request for Comments: 9417                                   J. Quilbeuf
Category: Informational                                           Huawei
ISSN: 2070-1721                                                 D. Lopez
                                                          Telefonica I+D
                                                                D. Voyer
                                                             Bell Canada
                                                             T. Arumugam
                                                              Consultant
                                                               July 2023


       Service Assurance for Intent-Based Networking Architecture

So this is RFC 9417, and it's titled Service Assurance for Intent-Based Networking Architecture πŸ¦‹ It's from July 2023 and the category is Informational, which means it's published for information and is NOT a standards-track spec 🌸 The authors are B. Claise, J. Quilbeuf (both at Huawei), D. Lopez (Telefonica I+D), D. Voyer (Bell Canada), and T. Arumugam (a consultant) πŸ‘‘ The header doesn't list any Obsoletes or Updates entries, so this one doesn't replace or change any other RFC. The ISSN is 2070-1721 🌈


Abstract πŸ’…

Okay so this doc describes an architecture that gives you some assurance that service instances are actually running the way they should 🧚 Services depend on a bunch of subservices run by all kinds of elements, including the underlying network devices and functions, so you can only really know a service is healthy if you look at everything involved, like, holistically 😭 This architecture helps you connect a service getting worse to a symptom from one specific network component. It also tells you which services get hit when one specific component fails or degrades. Iconic, honestly ✨


Status of This Memo 🌸

This document is not an Internet Standards Track specification. It's published for informational purposes, so no vibes of "you MUST do this" here πŸ™ˆ

Wait, I shouldn't put that in caps. Redo: it is simply published for informational purposes, and it is not an Internet Standards Track specification πŸ’œ

This document is a product of the Internet Engineering Task Force (IETF) 🫢 It represents the consensus of the IETF community, got public review, and was approved for publication by the Internet Engineering Steering Group (IESG). Not every document the IESG approves is a candidate for any level of Internet Standard, so check Section 2 of RFC 7841 if you're curious about that πŸ“

You can find info about the current status of this document, any errata, and how to give feedback at https://www.rfc-editor.org/info/rfc9417 πŸ”—


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) as they stand on the publication date. Please read these carefully, because they explain your rights and restrictions for this document πŸ“œ Code Components pulled out of this document must include Revised BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come without warranty, as described in the Revised BSD License πŸ’…


Table of Contents πŸ¦‹

   1.  Introduction
   2.  Terminology
   3.  A Functional Architecture
     3.1.  Translating a Service Instance Configuration into an
           Assurance Graph
       3.1.1.  Circular Dependencies
     3.2.  Intent and Assurance Graph
     3.3.  Subservices
     3.4.  Building the Expression Graph from the Assurance Graph
     3.5.  Open Interfaces with YANG Modules
     3.6.  Handling Maintenance Windows
     3.7.  Flexible Functional Architecture
     3.8.  Time Window for Symptoms' History
     3.9.  New Assurance Graph Generation
   4.  IANA Considerations
   5.  Security Considerations
   6.  References
     6.1.  Normative References
     6.2.  Informative References
   Acknowledgements
   Contributors
   Authors' Addresses

1. Introduction ✨

Okay so, Network Service YANG Modules [RFC8199] describe the configuration, state data, operations, and notifications of abstract representations of services that run on one or more network elements πŸŽ€

Service orchestrators use Network Service YANG Modules to infer network-wide configuration, which then triggers the right device modules (Section 3 of [RFC8969]) 🧚 Here's the tea: knowing a configuration got applied doesn't mean the service instance is up and running like it should 😭 A service can be degraded because of a network failure, its quality can drop, or a service function can be reachable at the IP level and still not do its actual job πŸ’€ So the network operator has to monitor the service's operational data at the same time as the configuration (Section 3.3 of [RFC8969]) πŸ‘‘ To help with that, the industry has been standardizing on telemetry that pushes network element performance info (e.g., [RFC9375]) 🌸

A network administrator needs to monitor the network and its services as a whole, no matter which management protocol is in use 🫢 Different protocols come with different data models, and they model the same kind of info in different ways πŸ™ˆ When admins deal with multiple management protocols, the network management entities have to do the difficult, time-consuming job of mapping data models, like mapping the model used for configuration to the model used for monitoring when separate models or protocols are used 😭 It gets worse because there's a huge, messy pile of data sources, including MIB modules, YANG data models [RFC7950], IP Flow Information Export (IPFIX) information elements [RFC7011], syslog plain text [RFC5424], Terminal Access Controller Access-Control System Plus (TACACS+) [RFC8907], RADIUS [RFC2865], and more πŸ’… To skip that data model mapping, the industry converged on model-driven telemetry, which streams service operational data by reusing the YANG data models used for configuration πŸ¦‹ Model-driven telemetry makes closed-loop automation a lot easier to pull off, where events and updated operational states streamed from the network drive remediation changes back into the network πŸ”₯

But honestly, it's hard for network operators to connect a service degradation to the network root cause πŸ₯Ί Questions like "Why does my layer 3 virtual private network (L3VPN) fail to connect?" or "Why is this specific service not highly responsive?" are super common πŸ’€ The reverse matters too, meaning which services get impacted when a network component fails or degrades 😀 Think "Which services are impacted when this specific optic decibel milliwatt (dBm) begins to degrade?", "Which applications are impacted by an imbalance in this Equal-Cost Multipath (ECMP) bundle?", or "Is that issue actually impacting any other customers?" πŸ“ This job usually falls under the so-called "Service Impact Analysis" functional block 🌈

This document defines an architecture that implements Service Assurance for Intent-based Networking (SAIN) πŸ‘‘ Intent-based approaches are often declarative: they start from a statement of "The service works as expected" and then try to enforce it 🧚 Some services were already defined using a different approach, though 🌸 Aligned with Section 3.3 of [RFC7149], this architecture doesn't require a declarative intent as a starting point. Instead, it focuses on services that are already defined and tries to infer what "The service works as expected" means for them πŸ’– It does this by working from an assurance graph, which gets deduced from the configuration pushed to the device to enable the service instance 🫢 If the SAIN orchestrator supports it, the service model (Section 2 of [RFC8309]) or the network model (Section 2.1 of [RFC8969]) can also be used to build the assurance graph ✨ In that case, if the service model also includes the declarative intent, the SAIN orchestrator can rely on that declared intent instead of inferring it πŸ’… The assurance graph can also be explicitly completed to add an intent that isn't exposed in the service model itself πŸŽ€

The assurance graph of a service instance gets broken down into components, which are then assured independently πŸ¦‹ The top of the graph is the service instance being assured, and its children are the components identified as its direct dependencies. Each component can have dependencies of its own 🌈 Components involved in a service's assurance graph are called subservices πŸ“ The SAIN orchestrator updates the assurance graph automatically whenever the service instance gets modified πŸ”₯

When a service is degraded, the SAIN architecture highlights where in the assurance graph to look, instead of you going hop by hop to troubleshoot 🧚 More precisely, the SAIN architecture associates each service instance with a list of symptoms coming from specific subservices, which correspond to components of the network 🫢 These components are good candidates for explaining where a service degradation comes from πŸ‘‘ This architecture doesn't just help correlate service degradation with network root cause and symptoms. It can also deduce, from the assurance graph, the list of service instances impacted by a component degradation or failure πŸ’œ That info tells the operational team where to focus for maximum return 🌸 The team will probably prioritize degrading or failing components that hit the most customers, especially the ones with Service-Level Agreement (SLA) contracts that carry penalties in case of failure 😭

This architecture provides the building blocks to assure both physical and virtual entities, and it's flexible about services, subservices, and (distributed) graphs and components (Section 3.7) πŸ¦‹

The architecture presented in this document is implemented by a set of YANG modules defined in a companion document [RFC9418] πŸŽ€ These YANG modules properly define the interfaces between the various components of the architecture, which helps everything interoperate πŸ’–

2. Terminology ✨

okay bestie, first we need the vocab, because SAIN has a whole glossary and you can't follow the rest without it πŸŽ€

SAIN agent: this is the functional component that talks to a device, a bunch of devices, or another agent. It takes the assurance graph it gets, builds an expression graph from it, and does the math for the health status and symptoms. Fun fact: a SAIN agent might be running right on the device it's monitoring 🧚

Assurance case: the RFC quotes this one directly: "An assurance case is a structured argument, supported by evidence, intended to justify that a system is acceptably assured relative to a concern (such as safety or security) in the intended operating environment" [Piovesan2017]. Basically it's a receipt that says "yes, this system is actually fine, and here's why" πŸ’…

Service instance: a specific instance of a service. Simple, iconic 🌸

Intent: the RFC quotes this as "A set of operational goals (that a network should meet) and outcomes (that a network is supposed to deliver) defined in a declarative manner without specifying how to achieve or implement them" [RFC9315]. So it's the what, never the how πŸ¦‹

Subservice: a part or functionality of the network system that can be independently assured as a single entity in an assurance graph. Little pieces with their own main character energy πŸ‘‘

Assurance graph: a Directed Acyclic Graph (DAG) that represents the assurance case for one or several service instances. The nodes (also called vertices, in DAG-speak) are the service instances themselves plus the subservices, and the edges show a dependency relation. It's a whole map of who depends on who πŸ—ΊοΈ

SAIN collector: a functional component that fetches or receives the computer-consumable output of the SAIN agent(s) and processes it locally, which includes showing it in a user-friendly form. The pretty dashboard, basically πŸ’–

DAG: Directed Acyclic Graph. Yes we just said it, but it's the acronym so it gets its own entry 🫢

ECMP: Equal-Cost Multipath. 🌈

Expression graph: a generic term for a DAG that represents a computation in SAIN. There are more specific flavours below πŸ“

  • Subservice expressions: an expression graph covering all the computations to run for a subservice.
  • Service expressions: an expression graph covering all the computations to run for a service instance. This includes the computations for all the dependent subservices too, so it's the full package 🎁
  • Global computation graph: an expression graph covering all the computations to run for all service instances, meaning every computation that gets performed.

Dependency: the directed relationship between subservice instances in the assurance graph. Who leans on who 🫠

Metric: a piece of information retrieved from the network that's running the assured service. The raw data, the tea β˜•

Metric engine: a functional component, part of the SAIN agent, that maps metrics to a list of candidate metric implementations, depending on the network element. It's the matchmaker between a metric and the ways to get it πŸ’˜

Metric implementation: the actual way of retrieving a metric from a network element. The how, after the metric engine picks one πŸ”§

Network Service YANG Module: the characteristics of a service, as agreed upon with consumers of that service [RFC8199]. It's the contract, not the wiring πŸ“œ

Service orchestrator: the RFC quotes this one too: "Network Service YANG Modules describe the characteristics of a service, as agreed upon with consumers of that service. That is, a service module does not expose the detailed configuration parameters of all participating network elements and features but describes an abstract model that allows instances of the service to be decomposed into instance data according to the Network Element YANG Modules of the participating network elements. The service-to-element decomposition is a separate process; the details depend on how the network operator chooses to realize the service. For the purpose of this document, the term "orchestrator" is used to describe a system implementing such a process" [RFC8199]. Translation: the orchestrator is the system that does the breaking-down-the-service part ✨

SAIN orchestrator: a functional component that's in charge of fetching the configuration specific to each service instance and converting it into an assurance graph. The one doing the paperwork πŸ“

Health status: the score and symptoms that show whether a service instance or a subservice is "healthy". A non-maximal score must always be explained by one or more symptoms. No mystery scores allowed, periodt πŸ™…β€β™€οΈ

Health score: an integer from 0 to 100 that shows how healthy a subservice is. A score of 0 means the subservice is broken, and a score of 100 means it's operating as expected. The special value -1 can be used to say that no value could be computed for the health score. For example, that happens if some metric needed for the computation couldn't be collected πŸ₯Ί

Strongly connected component: a subset of a directed graph where there's a (directed) path from any node of the subset to any other node. A DAG does not contain any strongly connected component, which is exactly why DAGs are so chill πŸ§˜β€β™€οΈ

Symptom: a reason explaining why a service instance or a subservice isn't completely healthy. The "why is this sad" note 😭

3. A Functional Architecture πŸ—οΈ

okay so the big goal of SAIN is to make sure service instances are running the way they're supposed to (aka the observed service matches the expected service), and if they're not, to figure out exactly what's wrong πŸ” It computes a score for each service instance and spits out symptoms that explain that score. The only valid situation where no symptoms come back is when the score is maximal, which means nothing was flagged for that instance. The score plus its symptoms is called the health status πŸ’… The exact meaning of the health score value is out of scope of this document. Still, the following constraints should be followed: the higher the score, the better the service health is. The two extremes are 0, meaning the service is completely broken, and 100, meaning it's completely operational 🌈

The SAIN architecture is generic, which means it generates an assurance graph from service instance(s), as specified in Section 3.1. It's not picky about the environment, so it works for wireline and wireless, and for different domains too (like a 5G network function virtualization (NFV) domain with a virtual infrastructure manager (VIM), for example). It also works for physical or virtual devices, and for virtual functions. And thanks to the distributed graph design principle, graphs from different environments and orchestrators can be combined into the graph for a service instance that spans multiple domains. Teamwork makes the dream work 🫢

Let's use a point-to-point layer 2 virtual private network (L2VPN) as an example of a service. [RFC8466] specifies the parameters for that kind of service. Some example symptoms could be ones reported by specific subservices, like "Interface has high error rate", "Interface flapping", or "Device almost out of memory". There can also be symptoms that are more specific to the service, like "Site disconnected from VPN" πŸ™ˆ

To compute the health status of an instance of that service, the service definition gets decomposed into an assurance graph made of subservices linked through dependencies. Each subservice then turns into an expression graph that details how to fetch metrics from the devices and compute the subservice's health status. Then the subservice expressions get combined according to the dependencies between the subservices, so you end up with the expression graph that computes the health status of the whole service instance. It's like building a LEGO set, but make it networking 🧱

Here's the overall SAIN architecture, shown in Figure 1. The SAIN orchestrator uses the service configuration from the service orchestrator to break down the assurance graph. Then it sends the assurance graph to the SAIN agents, along with some other configuration options. The SAIN agents build the expression graph and compute the health statuses in a distributed way. The collector handles collecting and displaying the current inferred health status of the service instances and subservices. It also notices changes in the assurance graph structures (for instance, a switchover from a primary path to a backup path), and it forwards that info to the orchestrator, which reconfigures the agents. Finally, the automation loop closes when the SAIN collector gives feedback to the network/service orchestrator. A full circle moment πŸ”„

        +-----------------+
        | Service         |
        | Orchestrator    |<----------------------+
        |                 |                       |
        +-----------------+                       |
           |            ^                         |
           |            | Network                 |
           |            | Service                 | Feedback
           |            | Instance                | Loop
           |            | Configuration           |
           |            |                         |
           |            V                         |
           |        +-----------------+  Graph  +-------------------+
           |        | SAIN            | Updates | SAIN              |
           |        | Orchestrator    |<--------| Collector         |
           |        +-----------------+         +-------------------+
           |            |                          ^
           |           Y| Configuration            | Health Status
           |            | (Assurance Graph)       Y| (Score + Symptoms)
           |            V                          | Streamed
           |     +-------------------+             | via Telemetry
           |     |+-------------------+            |
           |     ||+-------------------+           |
           |     +|| SAIN              |-----------+
           |      +| Agent             |
           |       +-------------------+
           |               ^ ^ ^
           |               | | |
           |               | | |  Metric Collection
           V               V V V
       +-------------------------------------------------------------+
       |           (Network) System                                  |
       |                                                             |
       +-------------------------------------------------------------+

Figure 1: SAIN Architecture πŸ¦‹

To make sure agents, orchestrators, and collectors from different vendors can work together, their interface is defined as a YANG module in a companion document [RFC9418]. In Figure 1, the communications that this YANG module normalizes are tagged with a "Y". Section 3.5 explains how to use this YANG module more. Interop era, let's gooo πŸŽ‰

To produce the score for a service instance, the different components do these things:

  • Analyze the configuration pushed to the network device(s) that's configuring the service instance. From there, figure out which information (called a metric) has to be collected from the device(s), and which operations to apply to the metrics to compute the health status. Detective mode activated πŸ•΅οΈβ€β™€οΈ
  • Stream operational and config metric values (via telemetry, such as YANG-Push [RFC8641]) when possible, and otherwise poll continuously. Streaming is the move, but polling is the backup plan πŸ“‘
  • Continuously compute the health status of the service instances based on the metric values. Never stops, never sleeps πŸ’œ

The SAIN architecture requires time synchronization between all elements, with the Network Time Protocol (NTP) [RFC5905] as a candidate. Those elements are the monitored entities, the SAIN agents, the service orchestrator, the SAIN collector, and the SAIN orchestrator. Why? Because it guarantees that all the symptoms are correlated correctly, and correlated with the right assurance graph version. Clocks gotta be on time or the whole vibe is off ⏰✨

3.1. Translating a Service Instance Configuration into an Assurance Graph ✨

okay so bestie, the SAIN orchestrator's first big job is to chop a service instance up into smaller pieces called subservice instances 🧩. Each subservice instance zooms in on one specific feature or subpart of the service, and this decomposition is honestly the backbone of the whole architecture πŸ’–.

It matters for a few reasons, and they're all giving main character energy:

  • It gives the operator a relational picture of the service instance, and that picture can be drawn as a graph called an assurance graph πŸ¦‹.
  • Subservices give a home to particular expertise, so external experts can jump in and help. For example, the subservice about an optic's health should be reviewed and extended by an expert in optical interfaces πŸ”₯.
  • Subservices that are shared between several service instances get reused, which means less computation πŸ™Œ. For example, the subservice assuring a given interface gets reused by any service instance that relies on that interface πŸ’….

Now the assurance graph itself. It's a DAG (directed acyclic graph) that shows the structure of the assurance case for the service instance 🌸. The nodes are service instances or subservice instances. Each edge is a dependency between the two nodes at its ends: the service or subservice at the source of the edge depends on the service or subservice at the destination 🫢.

Here's a simplistic example for a tunnel service πŸŽ€. The service instance sits at the top, and everything below it is a dependency. The tunnel service depends on the "peer1" and "peer2" tunnel interfaces (the ones created on the peer1 and peer2 devices, respectively). Those depend on their physical interfaces, and those finally depend on the "peer1" and "peer2" devices πŸ’€. The tunnel service also depends on IP connectivity, which depends on the IS-IS routing protocol 🧚.

                            +------------------+
                            | Tunnel           |
                            | Service Instance |
                            +------------------+
                                      |
                 +--------------------+-------------------+
                 |                    |                   |
                 v                    v                   v
            +-------------+    +--------------+    +-------------+
            | Peer1       |    | IP           |    | Peer2       |
            | Tunnel      |    | Connectivity |    | Tunnel      |
            | Interface   |    |              |    | Interface   |
            +-------------+    +--------------+    +-------------+
                   |                  |                  |
                   |    +-------------+--------------+   |
                   |    |             |              |   |
                   v    v             v              v   v
            +-------------+    +-------------+     +-------------+
            | Peer1       |    | IS-IS       |     | Peer2       |
            | Physical    |    | Routing     |     | Physical    |
            | Interface   |    | Protocol    |     | Interface   |
            +-------------+    +-------------+     +-------------+
                   |                                     |
                   v                                     v
            +-------------+                        +-------------+
            |             |                        |             |
            | Peer1       |                        | Peer2       |
            | Device      |                        | Device      |
            +-------------+                        +-------------+

                     Figure 2: Assurance Graph Example

Drawing the assurance graph helps the operator understand (and assert) the decomposition, so it's a total must πŸ“Š. The assurance graph SHALL be maintained during normal operation as service instances are added, modified, and removed ✨. Any change in the network configuration or topology SHALL be reflected in the assurance graph automatically πŸͺ„. For example, switching the routing protocol from IS-IS to OSPF would update the assurance graph to match πŸ”„. Another example: if ECMP is in place for the source router for that tunnel, then multiple interfaces now need to be monitored, on top of monitoring the ECMP health itself πŸ“.

3.1.1. Circular Dependencies

okay so the edges of the assurance graph are dependencies πŸ”— and an assurance graph is a DAG if and only if there are no circular dependencies among the subservices. every assurance graph should avoid circular dependencies, bestie, but ngl sometimes they still show up anyway πŸ’€

First, the assurance graph of a whole system is made by combining the assurance graph of every service running on that system. When we combine, two subservices with the same type and the same parameters are actually the same subservice, so they become a single node in the graph ✨. For example, the subservice of type "device" with the only parameter (the device ID) set to "PE1" will appear only once in the whole assurance graph, even if several service instances rely on that device. Now here's where it gets messy πŸ™ˆ. If two engineers design assurance graphs for two different services, and Engineer A decides that an interface depends on the link it is connected to, but Engineer B decides that the link depends on the interface it is connected to, then when we combine the two assurance graphs, we get a circular dependency: interface -> link -> interface. not it 😭

Another case that can cause circular dependencies is when subservices are not properly identified 🫠. Say we want to assure a cloud-based computing cluster that runs containers. We could represent the cluster by one subservice, and the network service connecting the containers on the cluster by another subservice. We would likely model that as the network service depending on the cluster, because the network service runs in a container supported by the cluster. But then the cluster depends on the network service for connectivity between containers, and that creates a circular dependency πŸŒ€. A finer decomposition might split things up: the resources for executing containers (a part of our cluster subservice) and the communication between the containers (which could be modeled in the same way as communication between routers). Much cleaner, iykyk πŸ¦‹.

In any case, it is likely that circular dependencies will show up in the assurance graph. A first step would be to detect circular dependencies as soon as possible in the SAIN architecture πŸ”. Such a detection could be carried out by the SAIN orchestrator. Whenever a circular dependency is detected, the newly added service would not be monitored until more careful modeling or alignment between the different teams (Engineers A and B) removes the circular dependency. no monitoring for the drama queen until the teams get their act together πŸ’….

As a more elaborate solution, we could consider a graph transformation 🧚:

  • Decompose the graph into strongly connected components.
  • For each strongly connected component:
    • remove all edges between nodes of the strongly connected component;
    • add a new "synthetic" node for the strongly connected component;
    • for each edge pointing to a node in the strongly connected component, change the destination to the "synthetic" node; and
    • add a dependency from the "synthetic" node to every node in the strongly connected component.

Such an algorithm would include all symptoms detected by any subservice in one of the strongly connected components and make it available to any subservice that depends on it. Figure 3 shows an example of such a transformation 🌈. On the left-hand side, the nodes c, d, e, and f form a strongly connected component. The status of node a should depend on the status of nodes c, d, e, f, g, and h, but this is hard to compute because of the circular dependency πŸ˜΅β€πŸ’«. On the right-hand side, node a depends on all these nodes as well, but the circular dependency has been removed. slay the graph, literally πŸ‘‘

         +---+    +---+          |                +---+    +---+
         | a |    | b |          |                | a |    | b |
         +---+    +---+          |                +---+    +---+
           |        |            |                  |        |
           v        v            |                  v        v
         +---+    +---+          |                +------------+
         | c |--->| d |          |                |  synthetic |
         +---+    +---+          |                +------------+
           ^        |            |               /   |      |   \
           |        |            |              /    |      |    \
           |        v            |             v     v      v     v
         +---+    +---+          |          +---+  +---+  +---+  +---+
         | f |<---| e |          |          | f |  | c |  | d |  | e |
         +---+    +---+          |          +---+  +---+  +---+  +---+
           |        |            |            |                    |
           v        v            |            v                    v
         +---+    +---+          |          +---+                +---+
         | g |    | h |          |          | g |                | h |
         +---+    +---+          |          +---+                +---+

            Before                                     After
         Transformation                           Transformation

                       Figure 3: Graph Transformation

We consider a concrete example to illustrate this transformation πŸŽ€. Let's assume that Engineer A is building an assurance graph dealing with IS-IS and Engineer B is building an assurance graph dealing with OSPF. The graph from Engineer A could contain the following:

                   +------------+
                   | IS-IS Link |
                   +------------+
                         |
                         v
                   +------------+
                   | Phys. Link |
                   +------------+
                     |       |
                     v       v
          +-------------+  +-------------+
          | Interface 1 |  | Interface 2 |
          +-------------+  +-------------+

         Figure 4: Fragment of the Assurance Graph from Engineer A

The graph from Engineer B could contain the following:

                   +------------+
                   | OSPF Link  |
                   +------------+
                     |   |   |
                     v   |   v
        +-------------+  |  +-------------+
        | Interface 1 |  |  | Interface 2 |
        +-------------+  |  +-------------+
                      |  |   |
                      v  v   v
                   +------------+
                   | Phys. Link |
                   +------------+

         Figure 5: Fragment of the Assurance Graph from Engineer B

The Interface subservices and the Physical Link subservice are common to both fragments above 🀝. Each of these subservices appears only once in the graph merging the two fragments. Dependencies from both fragments are included in the merged graph, and that results in a circular dependency 😩:

         +------------+      +------------+
         | IS-IS Link |      | OSPF Link  |---+
         +------------+      +------------+   |
               |               |     |        |
               |     +-------- +     |        |
               v     v               |        |
         +------------+              |        |
         | Phys. Link |<-------+     |        |
         +------------+        |     |        |
           |  ^     |          |     |        |
           |  |     +-------+  |     |        |
           v  |             v  |     v        |
         +-------------+  +-------------+     |
         | Interface 1 |  | Interface 2 |     |
         +-------------+  +-------------+     |
               ^                              |
               |                              |
               +------------------------------+

              Figure 6: Merging Graphs from Engineers A and B

The solution presented above would result in a graph looking as follows, where a new "synthetic" node is included πŸ¦„. Using that transformation, all dependencies are indirectly satisfied for the nodes outside the circular dependency, in the sense that both IS-IS and OSPF links have indirect dependencies to the two interfaces and the link. However, the dependencies between the link and the interfaces are lost, since they were causing the circular dependency πŸ₯².

               +------------+      +------------+
               | IS-IS Link |      | OSPF Link  |
               +------------+      +------------+
                          |          |
                          v          v
                         +------------+
                         |  synthetic |
                         +------------+
                               |
                   +-----------+-------------+
                   |           |             |
                   v           v             v
         +-------------+ +------------+ +-------------+
         | Interface 1 | | Phys. Link | | Interface 2 |
         +-------------+ +------------+ +-------------+

       Figure 7: Removing Circular Dependencies after Merging Graphs
                           from Engineers A and B

3.2. Intent and Assurance Graph

The SAIN orchestrator analyzes the configuration of a service instance to do the following 🧐:

  • Try to capture the intent of the service instance, i.e., What is the service instance trying to achieve? At a minimum, this requires the SAIN orchestrator to know the YANG modules that are being configured on the devices to enable the service. Note that, if the service model or the network model is known to the SAIN orchestrator, the latter can exploit it. In that case, the intent could be directly extracted and include more details, such as the notion of sites for a VPN, which is out of scope of the device configuration πŸ’Ό.
  • Decompose the service instance into subservices representing the network features on which the service instance relies.

The SAIN orchestrator must be able to analyze the configuration pushed to various devices of a service instance and produce the assurance graph for that service instance. no skipping this part, periodt πŸ’–

To schematize what a SAIN orchestrator does, assume that a service instance touches two devices and configures a virtual tunnel interface on each device 🫢. Then:

  • Capturing the intent would start by detecting that the service instance is actually a tunnel between the two devices and stating that this tunnel must be operational. This solution is minimally invasive, as it does not require modifying nor knowing the service model. If the service model or network model is known by the SAIN orchestrator, it can be used to further capture the intent and include more information, such as Service-Level Objectives (e.g., the latency and bandwidth requirements for the tunnel) if present in the service model πŸ“.
  • Decomposing the service instance into subservices would result in the assurance graph depicted in Figure 2, for instance.

The assurance graph, or more precisely the subservices and dependencies that a SAIN orchestrator can instantiate, should be curated. The organization of such a process (i.e., ensure that existing subservices are reused as much as possible and avoid circular dependencies) is out-of-scope for this document 🌸.

To be applied, SAIN requires a mechanism mapping a service instance to the configuration actually required on the devices for that service instance to run. While Figure 1 makes a distinction between the SAIN orchestrator and a different component providing the service instance configuration, in practice those two components are most likely combined. The internals of the orchestrator are out of scope of this document πŸ™Œ.

3.3. Subservices 🧩

okay so a subservice is a subpart or feature of the network system that a service instance needs in order to function properly πŸ’…. In SAIN, every subservice is linked to its assurance, which is the method for checking that the subservice is behaving correctly πŸ”.

Subservices are just like services in that they have high-level parameters saying which instance to assure πŸŽ€. Which parameters you need depends on the subservice type. For example, assuring a device needs a specific deviceId, and assuring an interface needs a specific combo of deviceId and interfaceId 🧚.

When you're designing a new type of subservice, you should carefully define what the assured object or functionality is πŸ€“. Then the parameters must be chosen as a minimal set that completely identifies the object (see the examples in the previous paragraph). Parameters cannot change during the life cycle of a subservice. For instance, an IP address is a good parameter when assuring connectivity toward that address (a given device can reach a given IP address) 🌐. But it's not a good parameter for identifying an interface, because the IP address assigned to that interface can be changed πŸ™ˆ.

A subservice is also characterized by a list of metrics to fetch, plus a list of operations to apply to those metrics in order to infer a health status πŸ’œ.


3.4. Building the Expression Graph from the Assurance Graph πŸ•ΈοΈ

so from the assurance graph, we derive a so-called global computation graph ✨. First, each subservice instance gets transformed into a set of subservice expressions. These take metrics and constants as input (they're the sources of the DAG) and produce the status of the subservice based on some heuristics πŸ”₯. For instance, the health of an interface is 0 (the minimal score) with the symptom "interface admin-down" if the interface is disabled in the configuration πŸ™ƒ.

Then, for each service instance, the service expressions get built by combining the subservice expressions of its dependencies. How service expressions get combined depends on the dependency types (impacting or informational) πŸŽ€. Finally, the global computation graph is built by combining the service expressions into one global view of all subservices πŸ‘‘. In other words, the global computation graph encodes all the operations needed to produce health statuses from the collected metrics πŸ’….

The two types of dependencies used for combining subservices are:

  • Informational Dependency: a dependency type whose health score does not impact the health score of its parent subservice or service instance(s) in the assurance graph. However, its symptoms should be taken into account in the parent service instance or subservice instance(s), for informational reasons 🫢.
  • Impacting Dependency: a dependency type whose health score does impact the health score of its parent subservice or service instance(s) in the assurance graph. Its symptoms are taken into account in the parent service instance or subservice instance(s) as the impacting reasons πŸ’€.

The set of dependency types listed here is not exhaustive. More specific dependency types can be defined by extending the YANG module 🌈. For instance, a connectivity subservice that depends on several path subservices is partially impacted if only one of those paths fails πŸ¦‹. Adding these new dependency types requires defining the corresponding operation for combining the statuses of subservices ⭐.

Subservices shall not be dependent on the protocol used to retrieve the metrics 🚫. Let's look at the interface operational status to see why. Depending on the device capabilities, this status can be collected by an industry-accepted YANG module (e.g., IETF or Openconfig [OpenConfig]), by a vendor-specific YANG module, or even by a MIB module 🧠. If a subservice depended on the mechanism used to collect the operational status, we'd need multiple subservice definitions to support all the different mechanisms 😭. This also means that, while we wait for all the metrics to be available via standard YANG modules, SAIN agents might have to retrieve metric values via nonstandard YANG data models, MIB modules, the Command-Line Interface (CLI), and so on. In effect, they're implementing a normalization layer between data models and information models πŸ§ƒ.

To keep subservices independent of the metric collection method (or, put differently, to support multiple combinations of platforms, OSes, and even vendors), the architecture introduces the concept of the "metric engine" πŸ¦„. The metric engine maps each device-independent metric used in the subservices to a list of device-specific metric implementations that precisely define how to fetch values for that metric πŸ—ΊοΈ. That mapping is parameterized by the characteristics (i.e., model, OS version, etc.) of the device the metrics are fetched from. This metric engine is included in the SAIN agent πŸ’–.


3.5. Open Interfaces with YANG Modules πŸ”Œ

the interfaces between the architecture components are open thanks to the YANG modules specified in [RFC9418] 🫧. These modules specify objects for assuring network services based on their decomposition into so-called subservices, according to the SAIN architecture ✨.

These modules are meant 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 health status of the subservices, along with the observed symptoms πŸ“‘.

Some examples of YANG instances can be found in Appendix A of [RFC9418] πŸ“š.


3.6. Handling Maintenance Windows πŸ› οΈ

whenever network components are under maintenance, the operator wants to inhibit the emission of symptoms from those components πŸ™Š. A typical use case is device maintenance, during which the device isn't supposed to be operational. So symptoms related to the device health should be ignored 😴. Symptoms related to the device-specific subservices, such as the interfaces, might also be ignored, because their state changes are probably the consequence of the maintenance πŸ“.

The ietf-service-assurance model described in [RFC9418] lets you flag subservices as under maintenance. When you do, it requires a string that identifies the person or process that requested the maintenance 🫢. When a service or subservice is flagged as under maintenance, it must report a generic "Under Maintenance" symptom for propagation toward the subservices that depend on this specific subservice 🚧. Any other symptom from this service, or from one of its impacting dependencies, must not be reported πŸ”‡.

Let's walk through this mechanism with three independent examples based on the assurance graph depicted in Figure 2 🎬:

  • Device maintenance, for instance, upgrading the device OS. The operator flags the subservice "Peer1" device as under maintenance. This inhibits the emission of symptoms, except "Under Maintenance" from "Peer1 Physical Interface", "Peer1 Tunnel Interface", and "Tunnel Service Instance". All other subservices are unaffected πŸ’».
  • Interface maintenance, for instance, replacing a broken optic. The operator flags the subservice "Peer1 Physical Interface" as under maintenance. This inhibits the emission of symptoms, except "Under Maintenance" from "Peer 1 Tunnel Interface" and "Tunnel Service Instance". All other subservices are unaffected πŸ”§.
  • Routing protocol maintenance, for instance, modifying parameters or redistribution. The operator marks the subservice "IS-IS Routing Protocol" as under maintenance. This inhibits the emission of symptoms, except "Under Maintenance" from "IP connectivity" and "Tunnel Service Instance". All other subservices are unaffected πŸ¦‹.

In each example above, the subservice under maintenance completely impacts the service instance, which puts the service instance under maintenance as well 🌸. But there are use cases where the subservice under maintenance only partially impacts the service instance. For instance, consider a service instance supported by both a primary and a backup path. If a subservice impacting the primary path is under maintenance, the service instance might still be functional but degraded. In that case, the status of the service instance might include "Primary path Under Maintenance" and "No redundancy", as well as other symptoms from the backup path that explain the lower health score πŸŒ—. In general, the computation of the service instance status from the subservices is done in the SAIN collector, whose implementation is out of scope for this document 🧠.

The maintenance of a subservice might modify, or hide modifications of, the structure of the assurance graph. Therefore, unflagging a subservice as under maintenance should trigger an update of the assurance graph πŸ”„βœ¨.

3.7. Flexible Functional Architecture πŸ¦‹

okay so SAIN is SO flexible about its components πŸ’…. Figure 1 makes it look like the service orchestrator and the SAIN orchestrator are two separate things, but ngl they're most likely combined in real life 🫢. The SAIN agents are drawn as separate boxes too, but they could be independent components or built right into the monitored entities. A practical example is an agent living inside a router 🌸.

Services and subservices are flexible too πŸ’–. The SAIN orchestrator is coupled to a service orchestrator, and that one decides which kinds of services the architecture handles. Most examples in this document are about Network Service YANG Modules with well-known services, like L2VPN or tunnels. But the concept of "service" is general enough to cross into other domains 🌈. One of them is service management on network elements, which also needs its own assurance. Think a DHCP server on a Linux server, a data plane, an IPFIX export, etc. So the notion of "service" is generic here and depends on the service orchestrator and the underlying network system. These examples show what I mean:

  • If a main service orchestrator coordinates several lower-level controllers, a service for the controller can be a subservice from the point of view of the orchestrator.
  • A DHCP server / data plane / IPFIX export can be considered subservices for a device.
  • A routing instance can be considered a subservice for an L3VPN.
  • A tunnel can be considered a subservice for an application in the cloud.
  • A service function can be considered a subservice for a service function chain [RFC7665].

The assurance graph is built to be flexible and open, no matter the subservice types, locations, or domains πŸŽ€.

The SAIN architecture is also flexible about distributed graphs πŸ“. As Figure 1 shows, the architecture has several agents, and each agent handles a subgraph of the assurance graph. The collector's job is to fetch those subgraphs from the different agents and glue them together. For example, in the graph from Figure 2, the subservices for Peer 1 might be handled by a different agent than the subservices for Peer 2, and the Connectivity and IS-IS subservices might be handled by yet another agent. The agents export their partial graphs, and the collector stitches them together as dependencies of the service instance ✨.

And finally, SAIN is flexible about what it monitors 🧚. Most (if not all) examples here talk about physical components, but that's not a rule. Assurance of virtual components would follow the same principles, and an assurance graph made of virtualized components (or a mix of virtualized and physical ones) is supported by this architecture πŸ’œ.


3.8. Time Window for Symptoms' History ⏳

The health status reported through the YANG modules has, for each subservice, a list of symptoms. Symptoms have a start and end date, which makes it possible to report symptoms that are no longer occurring πŸ™ˆ.

Here's the tea: the SAIN agent might have to remove some symptoms for specific subservice symptoms, either because they're outdated and no longer relevant, or simply because the agent needs to free up some space. Whatever the reason, it matters a LOT that a SAIN collector connecting or reconnecting to a SAIN agent understands the effect of this garbage collection 😭.

So the SAIN agent contains a YANG object that specifies the date and time at which the symptoms' history starts for the subservice instances. The subservice only reports symptoms that are occurring, or that have been occurring since the history start date 🫢.


3.9. New Assurance Graph Generation 🌸

The assurance graph changes over time, because services and subservices come and go (which changes the dependencies between subservices), or because maintenance issues get resolved πŸ”„. So an assurance graph version has to be maintained, along with the date and time of its last generation. The date and time of a particular subservice instance (for dependencies or maintenance) might be kept too. From a client point of view, an assurance graph change is triggered by the value of the assurance-graph-version and assurance-graph-last-change YANG leaves. At that point, the client (collector) follows this process πŸ‘‘:

  • Keep the previous assurance-graph-last-change value (let's call it time T).
  • Run through all the subservice instances, and process the subservice instances whose last-change is newer than time T.
  • Keep the new assurance-graph-last-change as the new referenced date and time.

4. IANA Considerations πŸŽ€

This document has no IANA actions. Nothing to see here, bestie 🫢.


5. Security Considerations πŸ’€

Okay, this section is the serious part, so please read it carefully πŸ™. SAIN helps operators reduce the mean time to detect and the mean time to repair. BUT the SAIN agents MUST be secured, because a compromised SAIN agent may be sending incorrect root causes or symptoms to the management systems. (Wait, scratch that. That was me hyping. The original says "must," so the text stays lowercase below.)

Let me say it properly πŸ’…: the SAIN agents must be secured. A compromised SAIN agent may be sending incorrect root causes or symptoms to the management systems. Securing the agents comes down to ensuring the integrity and confidentiality of the assurance graph. This can be partially achieved by correctly setting the permissions of each node in the YANG data model, as described in Section 6 of [RFC9418].

Major alert 🚨: except for the configuration of telemetry, the agents do NOT need "write access" to the devices they monitor.

That configuration is applied with a YANG module, and its protection is covered by Secure Shell (SSH) [RFC6242] for the Network Configuration Protocol (NETCONF) or by TLS [RFC8446] for RESTCONF. Devices should be configured so that agents have their own credentials, with write access only for the YANG nodes that configure the telemetry πŸ”.

The data collected by SAIN could potentially be compromising to the network, or give more insight into how the network is designed πŸ‘€. Given the data SAIN requires (including CLI access in some cases), you should weigh data access concerns against the impact that reduced visibility will have on rapidly identifying root causes βš–οΈ.

For building the assurance graph, the SAIN orchestrator needs to obtain the configuration from the service orchestrator. The latter should restrict the SAIN orchestrator's access to the information needed to build the assurance graph 🧚.

If a closed loop system relies on this architecture, then the well-known issue of those systems also applies. A lying device or a compromised agent could trigger partial reconfiguration of the service or network 😱. SAIN neither augments nor reduces this risk. An extension of SAIN, which is out of scope for this document, could detect discrepancies between symptoms reported by different agents, and so detect anomalies if an agent or a device is lying πŸ•΅οΈβ€β™€οΈ.

And if NTP service goes down, the devices' clocks might lose their synchronization. In that case, correlating information from different devices, like detecting symptoms about a link or correlating symptoms from different devices, will give inaccurate results πŸ’€.


6. References πŸ“š

6.1. Normative References

[RFC8309]  Wu, Q., Liu, W., and A. Farrel, "Service Models
           Explained", RFC 8309, DOI 10.17487/RFC8309, January 2018,
           <https://www.rfc-editor.org/info/rfc8309>.

[RFC8969]  Wu, Q., Ed., Boucadair, M., Ed., Lopez, D., Xie, C., and
           L. Geng, "A Framework for Automating Service and Network
           Management with YANG", RFC 8969, DOI 10.17487/RFC8969,
           January 2021, <https://www.rfc-editor.org/info/rfc8969>.

[RFC9418]  Claise, B., Quilbeuf, J., Lucente, P., Fasano, P., and T.
           Arumugam, "A YANG Data Model for Service Assurance",
           RFC 9418, DOI 10.17487/RFC9418, July 2023,
           <https://www.rfc-editor.org/info/rfc9418>.

6.2. Informative References ✨

okay so the informative references are the ones that give context, not the stuff you have to follow 🧚 here's the whole list, exactly as it's written:

[OpenConfig]
           "OpenConfig", <https://openconfig.net>.

[Piovesan2017]
           Piovesan, A. and E. Griffor, "7 - Reasoning About Safety
           and Security: The Logic of Assurance",
           DOI 10.1016/B978-0-12-803773-7.00007-3, 2017,
           <https://doi.org/10.1016/B978-0-12-803773-7.00007-3>.

[RFC2865]  Rigney, C., Willens, S., Rubens, A., and W. Simpson,
           "Remote Authentication Dial In User Service (RADIUS)",
           RFC 2865, DOI 10.17487/RFC2865, June 2000,
           <https://www.rfc-editor.org/info/rfc2865>.

[RFC5424]  Gerhards, R., "The Syslog Protocol", RFC 5424,
           DOI 10.17487/RFC5424, March 2009,
           <https://www.rfc-editor.org/info/rfc5424>.

[RFC5905]  Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch,
           "Network Time Protocol Version 4: Protocol and Algorithms
           Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010,
           <https://www.rfc-editor.org/info/rfc5905>.

[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>.

[RFC7011]  Claise, B., Ed., Trammell, B., Ed., and P. Aitken,
           "Specification of the IP Flow Information Export (IPFIX)
           Protocol for the Exchange of Flow Information", STD 77,
           RFC 7011, DOI 10.17487/RFC7011, September 2013,
           <https://www.rfc-editor.org/info/rfc7011>.

[RFC7149]  Boucadair, M. and C. Jacquenet, "Software-Defined
           Networking: A Perspective from within a Service Provider
           Environment", RFC 7149, DOI 10.17487/RFC7149, March 2014,
           <https://www.rfc-editor.org/info/rfc7149>.

[RFC7665]  Halpern, J., Ed. and C. Pignataro, Ed., "Service Function
           Chaining (SFC) Architecture", RFC 7665,
           DOI 10.17487/RFC7665, October 2015,
           <https://www.rfc-editor.org/info/rfc7665>.

[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>.

[RFC8199]  Bogdanovic, D., Claise, B., and C. Moberg, "YANG Module
           Classification", RFC 8199, DOI 10.17487/RFC8199, July
           2017, <https://www.rfc-editor.org/info/rfc8199>.

[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>.

[RFC8466]  Wen, B., Fioccola, G., Ed., Xie, C., and L. Jalil, "A YANG
           Data Model for Layer 2 Virtual Private Network (L2VPN)
           Service Delivery", RFC 8466, DOI 10.17487/RFC8466, October
           2018, <https://www.rfc-editor.org/info/rfc8466>.

[RFC8641]  Clemm, A. and E. Voit, "Subscription to YANG Notifications
           for Datastore Updates", RFC 8641, DOI 10.17487/RFC8641,
           September 2019, <https://www.rfc-editor.org/info/rfc8641>.

[RFC8907]  Dahm, T., Ota, A., Medway Gash, D.C., Carrel, D., and L.
           Grant, "The Terminal Access Controller Access-Control
           System Plus (TACACS+) Protocol", RFC 8907,
           DOI 10.17487/RFC8907, September 2020,
           <https://www.rfc-editor.org/info/rfc8907>.

[RFC9315]  Clemm, A., Ciavaglia, L., Granville, L. Z., and J.
           Tantsura, "Intent-Based Networking - Concepts and
           Definitions", RFC 9315, DOI 10.17487/RFC9315, October
           2022, <https://www.rfc-editor.org/info/rfc9315>.

[RFC9375]  Wu, B., Ed., Wu, Q., Ed., Boucadair, M., Ed., Gonzalez de
           Dios, O., and B. Wen, "A YANG Data Model for Network and
           VPN Service Performance Monitoring", RFC 9375,
           DOI 10.17487/RFC9375, April 2023,
           <https://www.rfc-editor.org/info/rfc9375>.

Acknowledgements

the authors really said thank you to this whole crew 🫢 here's the list, exactly as written:

The authors would like to thank Stephane Litkowski, Charles Eckel, Rob Wilton, Vladimir Vassiliev, Gustavo Alburquerque, Stefan Vallin, Γ‰ric Vyncke, Mohamed Boucadair, Dhruv Dhody, Michael Richardson, and Rob Wilton for their reviews and feedback.

Contributors

  • Youssef El Fathi
  • Γ‰ric Vyncke

Authors' Addresses

and last but definitely not least, the people who wrote this πŸ’…

Benoit Claise
Huawei
Email: benoit.claise@huawei.com


Jean Quilbeuf
Huawei
Email: jean.quilbeuf@huawei.com


Diego R. Lopez
Telefonica I+D
Don Ramon de la Cruz, 82
28006 Madrid
Spain
Email: diego.r.lopez@telefonica.com


Dan Voyer
Bell Canada
Canada
Email: daniel.voyer@bell.ca


Thangavelu Arumugam
Consultant
Milpitas, California
United States of America
Email: thangavelu@yahoo.com

that's the whole thing, bestie πŸŒˆπŸŽ€βœ¨

πŸ“¦ where this page comes from