Skip to content

ANTA catalog for IS-IS tests

Tests

Module related to IS-IS tests.

VerifyISISInterfaceMode

Verifies IS-IS interfaces are running in the correct mode.

Expected Results
  • Success: The test will pass if all provided IS-IS interfaces are running in the correct mode.
  • Failure: The test will fail if any of the provided IS-IS interfaces are not configured or running in the incorrect mode.
  • Skipped: The test will be skipped if IS-IS is not configured.
Examples
anta.tests.routing:
  isis:
    - VerifyISISInterfaceMode:
        interfaces:
          - name: Loopback0
            mode: passive
          - name: Ethernet2
            mode: passive
            level: 2
          - name: Ethernet1
            mode: point-to-point
            vrf: PROD

Inputs

Name Type Description Default
interfaces list[ISISInterface]
List of IS-IS interfaces with their information.
-
Source code in anta/tests/routing/isis.py
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
class VerifyISISInterfaceMode(AntaTest):
    """Verifies IS-IS interfaces are running in the correct mode.

    Expected Results
    ----------------
    * Success: The test will pass if all provided IS-IS interfaces are running in the correct mode.
    * Failure: The test will fail if any of the provided IS-IS interfaces are not configured or running in the incorrect mode.
    * Skipped: The test will be skipped if IS-IS is not configured.

    Examples
    --------
    ```yaml
    anta.tests.routing:
      isis:
        - VerifyISISInterfaceMode:
            interfaces:
              - name: Loopback0
                mode: passive
              - name: Ethernet2
                mode: passive
                level: 2
              - name: Ethernet1
                mode: point-to-point
                vrf: PROD
    ```
    """

    categories: ClassVar[list[str]] = ["isis"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show isis interface brief vrf all", revision=1)]

    class Input(AntaTest.Input):
        """Input model for the VerifyISISInterfaceMode test."""

        interfaces: list[ISISInterface]
        """List of IS-IS interfaces with their information."""
        InterfaceState: ClassVar[type[InterfaceState]] = InterfaceState

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyISISInterfaceMode."""
        self.result.is_success()

        # Verify if IS-IS is configured
        if not (command_output := self.instance_commands[0].json_output["vrfs"]):
            self.result.is_skipped("IS-IS not configured")
            return

        for interface in self.inputs.interfaces:
            interface_detail = {}
            vrf_instances = get_value(command_output, f"{interface.vrf}..isisInstances", default={}, separator="..")
            for instance_data in vrf_instances.values():
                if interface_data := get_value(instance_data, f"interfaces..{interface.name}", separator=".."):
                    interface_detail = interface_data
                    # An interface can only be configured in one IS-IS instance at a time
                    break

            if not interface_detail:
                self.result.is_failure(f"{interface} - Not configured")
                continue

            # Check for passive
            if interface.mode == "passive":
                if get_value(interface_detail, f"intfLevels.{interface.level}.passive", default=False) is False:
                    self.result.is_failure(f"{interface} - Not running in passive mode")

            # Check for point-to-point or broadcast
            elif interface.mode != (interface_type := get_value(interface_detail, "interfaceType", default="unset")):
                self.result.is_failure(f"{interface} - Incorrect interface mode - Expected: {interface.mode} Actual: {interface_type}")

VerifyISISNeighborCount

Verifies the number of IS-IS neighbors per interface and level.

Expected Results
  • Success: The test will pass if all provided IS-IS interfaces have the expected number of neighbors.
  • Failure: The test will fail if any of the provided IS-IS interfaces are not configured or have an incorrect number of neighbors.
  • Skipped: The test will be skipped if IS-IS is not configured.
Examples
anta.tests.routing:
  isis:
    - VerifyISISNeighborCount:
        interfaces:
          - name: Ethernet1
            level: 1
            count: 2
          - name: Ethernet2
            level: 2
            count: 1
          - name: Ethernet3
            count: 2

Inputs

Name Type Description Default
interfaces list[ISISInterface]
List of IS-IS interfaces with their information.
-
Source code in anta/tests/routing/isis.py
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
class VerifyISISNeighborCount(AntaTest):
    """Verifies the number of IS-IS neighbors per interface and level.

    Expected Results
    ----------------
    * Success: The test will pass if all provided IS-IS interfaces have the expected number of neighbors.
    * Failure: The test will fail if any of the provided IS-IS interfaces are not configured or have an incorrect number of neighbors.
    * Skipped: The test will be skipped if IS-IS is not configured.

    Examples
    --------
    ```yaml
    anta.tests.routing:
      isis:
        - VerifyISISNeighborCount:
            interfaces:
              - name: Ethernet1
                level: 1
                count: 2
              - name: Ethernet2
                level: 2
                count: 1
              - name: Ethernet3
                count: 2
    ```
    """

    categories: ClassVar[list[str]] = ["isis"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show isis interface brief vrf all", revision=1)]

    class Input(AntaTest.Input):
        """Input model for the VerifyISISNeighborCount test."""

        interfaces: list[ISISInterface]
        """List of IS-IS interfaces with their information."""
        InterfaceCount: ClassVar[type[InterfaceCount]] = InterfaceCount

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyISISNeighborCount."""
        self.result.is_success()

        # Verify if IS-IS is configured
        if not (command_output := self.instance_commands[0].json_output["vrfs"]):
            self.result.is_skipped("IS-IS not configured")
            return

        for interface in self.inputs.interfaces:
            interface_detail = {}
            vrf_instances = get_value(command_output, f"{interface.vrf}..isisInstances", default={}, separator="..")
            for instance_data in vrf_instances.values():
                if interface_data := get_value(instance_data, f"interfaces..{interface.name}..intfLevels..{interface.level}", separator=".."):
                    interface_detail = interface_data
                    # An interface can only be configured in one IS-IS instance at a time
                    break

            if not interface_detail:
                self.result.is_failure(f"{interface} - Not configured")
                continue

            if interface_detail["passive"] is False and (act_count := interface_detail["numAdjacencies"]) != interface.count:
                self.result.is_failure(f"{interface} - Neighbor count mismatch - Expected: {interface.count} Actual: {act_count}")

VerifyISISNeighborState

Verifies the health of IS-IS neighbors.

Expected Results
  • Success: The test will pass if all IS-IS neighbors are in the up state.
  • Failure: The test will fail if any IS-IS neighbor adjacency is down.
  • Skipped: The test will be skipped if IS-IS is not configured or no IS-IS neighbor is found.
Examples
anta.tests.routing:
  isis:
    - VerifyISISNeighborState:
        check_all_vrfs: true

Inputs

Name Type Description Default
check_all_vrfs bool
If enabled, verifies IS-IS instances of all VRFs.
False
Source code in anta/tests/routing/isis.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class VerifyISISNeighborState(AntaTest):
    """Verifies the health of IS-IS neighbors.

    Expected Results
    ----------------
    * Success: The test will pass if all IS-IS neighbors are in the `up` state.
    * Failure: The test will fail if any IS-IS neighbor adjacency is down.
    * Skipped: The test will be skipped if IS-IS is not configured or no IS-IS neighbor is found.

    Examples
    --------
    ```yaml
    anta.tests.routing:
      isis:
        - VerifyISISNeighborState:
            check_all_vrfs: true
    ```
    """

    categories: ClassVar[list[str]] = ["isis"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show isis neighbors vrf all", revision=1)]

    class Input(AntaTest.Input):
        """Input model for the VerifyISISNeighborState test."""

        check_all_vrfs: bool = False
        """If enabled, verifies IS-IS instances of all VRFs."""

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyISISNeighborState."""
        self.result.is_success()

        # Verify if IS-IS is configured
        if not (command_output := self.instance_commands[0].json_output["vrfs"]):
            self.result.is_skipped("IS-IS not configured")
            return

        vrfs_to_check = command_output
        if not self.inputs.check_all_vrfs:
            vrfs_to_check = {"default": command_output["default"]}

        no_neighbor = True
        for vrf, vrf_data in vrfs_to_check.items():
            for isis_instance, instance_data in vrf_data["isisInstances"].items():
                neighbors = instance_data["neighbors"]
                if not neighbors:
                    continue
                no_neighbor = False
                interfaces = [(adj["interfaceName"], adj["state"]) for neighbor in neighbors.values() for adj in neighbor["adjacencies"] if adj["state"] != "up"]
                for interface in interfaces:
                    self.result.is_failure(
                        f"Instance: {isis_instance} VRF: {vrf} Interface: {interface[0]} - Incorrect adjacency state - Expected: up Actual: {interface[1]}"
                    )

        if no_neighbor:
            self.result.is_skipped("No IS-IS neighbor detected")

VerifyISISSegmentRoutingAdjacencySegments

Verifies IS-IS segment routing adjacency segments.

IS-IS SR Limitation

As of EOS 4.33.1F, IS-IS SR is supported only in the default VRF. Please refer to the IS-IS Segment Routing documentation for more information.

Expected Results
  • Success: The test will pass if all provided IS-IS instances have the correct adjacency segments.
  • Failure: The test will fail if any of the provided IS-IS instances have no adjacency segments or incorrect segments.
  • Skipped: The test will be skipped if IS-IS is not configured.
Examples
anta.tests.routing:
  isis:
    - VerifyISISSegmentRoutingAdjacencySegments:
        instances:
          - name: CORE-ISIS
            vrf: default
            segments:
              - interface: Ethernet2
                address: 10.0.1.3
                sid_origin: dynamic

Inputs

Name Type Description Default
instances list[ISISInstance]
List of IS-IS instances with their information.
-
Source code in anta/tests/routing/isis.py
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
class VerifyISISSegmentRoutingAdjacencySegments(AntaTest):
    """Verifies IS-IS segment routing adjacency segments.

    !!! warning "IS-IS SR Limitation"
        As of EOS 4.33.1F, IS-IS SR is supported only in the default VRF.
        Please refer to the IS-IS Segment Routing [documentation](https://www.arista.com/en/support/toi/eos-4-17-0f/13789-isis-segment-routing)
        for more information.

    Expected Results
    ----------------
    * Success: The test will pass if all provided IS-IS instances have the correct adjacency segments.
    * Failure: The test will fail if any of the provided IS-IS instances have no adjacency segments or incorrect segments.
    * Skipped: The test will be skipped if IS-IS is not configured.

    Examples
    --------
    ```yaml
    anta.tests.routing:
      isis:
        - VerifyISISSegmentRoutingAdjacencySegments:
            instances:
              - name: CORE-ISIS
                vrf: default
                segments:
                  - interface: Ethernet2
                    address: 10.0.1.3
                    sid_origin: dynamic
    ```
    """

    categories: ClassVar[list[str]] = ["isis", "segment-routing"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show isis segment-routing adjacency-segments", ofmt="json")]

    class Input(AntaTest.Input):
        """Input model for the VerifyISISSegmentRoutingAdjacencySegments test."""

        instances: list[ISISInstance]
        """List of IS-IS instances with their information."""
        IsisInstance: ClassVar[type[IsisInstance]] = IsisInstance

        @field_validator("instances")
        @classmethod
        def validate_instances(cls, instances: list[ISISInstance]) -> list[ISISInstance]:
            """Validate that 'vrf' field is 'default' in each IS-IS instance."""
            for instance in instances:
                if instance.vrf != "default":
                    msg = f"{instance} 'vrf' field must be 'default'"
                    raise ValueError(msg)
            return instances

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyISISSegmentRoutingAdjacencySegments."""
        self.result.is_success()

        # Verify if IS-IS is configured
        if not (command_output := self.instance_commands[0].json_output["vrfs"]):
            self.result.is_skipped("IS-IS not configured")
            return

        for instance in self.inputs.instances:
            if not (act_segments := get_value(command_output, f"{instance.vrf}..isisInstances..{instance.name}..adjacencySegments", default=[], separator="..")):
                self.result.is_failure(f"{instance} - No adjacency segments found")
                continue

            for segment in instance.segments:
                if (act_segment := get_item(act_segments, "ipAddress", str(segment.address))) is None:
                    self.result.is_failure(f"{instance} {segment} - Adjacency segment not found")
                    continue

                # Check SID origin
                if (act_origin := act_segment["sidOrigin"]) != segment.sid_origin:
                    self.result.is_failure(f"{instance} {segment} - Incorrect SID origin - Expected: {segment.sid_origin} Actual: {act_origin}")

                # Check IS-IS level
                if (actual_level := act_segment["level"]) != segment.level:
                    self.result.is_failure(f"{instance} {segment} - Incorrect IS-IS level - Expected: {segment.level} Actual: {actual_level}")

VerifyISISSegmentRoutingDataplane

Verifies IS-IS segment routing data-plane configuration.

IS-IS SR Limitation

As of EOS 4.33.1F, IS-IS SR is supported only in the default VRF. Please refer to the IS-IS Segment Routing documentation for more information.

Expected Results
  • Success: The test will pass if all provided IS-IS instances have the correct data-plane configured.
  • Failure: The test will fail if any of the provided IS-IS instances have an incorrect data-plane configured.
  • Skipped: The test will be skipped if IS-IS is not configured.
Examples
anta.tests.routing:
  isis:
    - VerifyISISSegmentRoutingDataplane:
        instances:
          - name: CORE-ISIS
            vrf: default
            dataplane: MPLS

Inputs

Name Type Description Default
instances list[ISISInstance]
List of IS-IS instances with their information.
-
Source code in anta/tests/routing/isis.py
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
class VerifyISISSegmentRoutingDataplane(AntaTest):
    """Verifies IS-IS segment routing data-plane configuration.

    !!! warning "IS-IS SR Limitation"
        As of EOS 4.33.1F, IS-IS SR is supported only in the default VRF.
        Please refer to the IS-IS Segment Routing [documentation](https://www.arista.com/en/support/toi/eos-4-17-0f/13789-isis-segment-routing)
        for more information.

    Expected Results
    ----------------
    * Success: The test will pass if all provided IS-IS instances have the correct data-plane configured.
    * Failure: The test will fail if any of the provided IS-IS instances have an incorrect data-plane configured.
    * Skipped: The test will be skipped if IS-IS is not configured.

    Examples
    --------
    ```yaml
    anta.tests.routing:
      isis:
        - VerifyISISSegmentRoutingDataplane:
            instances:
              - name: CORE-ISIS
                vrf: default
                dataplane: MPLS
    ```
    """

    categories: ClassVar[list[str]] = ["isis", "segment-routing"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show isis segment-routing", ofmt="json")]

    class Input(AntaTest.Input):
        """Input model for the VerifyISISSegmentRoutingDataplane test."""

        instances: list[ISISInstance]
        """List of IS-IS instances with their information."""
        IsisInstance: ClassVar[type[IsisInstance]] = IsisInstance

        @field_validator("instances")
        @classmethod
        def validate_instances(cls, instances: list[ISISInstance]) -> list[ISISInstance]:
            """Validate that 'vrf' field is 'default' in each IS-IS instance."""
            for instance in instances:
                if instance.vrf != "default":
                    msg = f"{instance} 'vrf' field must be 'default'"
                    raise ValueError(msg)
            return instances

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyISISSegmentRoutingDataplane."""
        self.result.is_success()

        # Verify if IS-IS is configured
        if not (command_output := self.instance_commands[0].json_output["vrfs"]):
            self.result.is_skipped("IS-IS not configured")
            return

        for instance in self.inputs.instances:
            if not (instance_data := get_value(command_output, f"{instance.vrf}..isisInstances..{instance.name}", separator="..")):
                self.result.is_failure(f"{instance} - Not configured")
                continue

            if instance.dataplane.upper() != (dataplane := instance_data["dataPlane"]):
                self.result.is_failure(f"{instance} - Data-plane not correctly configured - Expected: {instance.dataplane.upper()} Actual: {dataplane}")

VerifyISISSegmentRoutingTunnels

Verify ISIS-SR tunnels computed by device.

Expected Results
  • Success: The test will pass if all listed tunnels are computed on device.
  • Failure: The test will fail if one of the listed tunnels is missing.
  • Skipped: The test will be skipped if ISIS-SR is not configured.
Examples
anta.tests.routing:
  isis:
    - VerifyISISSegmentRoutingTunnels:
        entries:
          # Check only endpoint
          - endpoint: 1.0.0.122/32
          # Check endpoint and via TI-LFA
          - endpoint: 1.0.0.13/32
            vias:
              - type: tunnel
                tunnel_id: ti-lfa
          # Check endpoint and via IP routers
          - endpoint: 1.0.0.14/32
            vias:
              - type: ip
                nexthop: 1.1.1.1

Inputs

Name Type Description Default
entries list[Tunnel]
List of tunnels to check on device.
-
Source code in anta/tests/routing/isis.py
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
class VerifyISISSegmentRoutingTunnels(AntaTest):
    """Verify ISIS-SR tunnels computed by device.

    Expected Results
    ----------------
    * Success: The test will pass if all listed tunnels are computed on device.
    * Failure: The test will fail if one of the listed tunnels is missing.
    * Skipped: The test will be skipped if ISIS-SR is not configured.

    Examples
    --------
    ```yaml
    anta.tests.routing:
      isis:
        - VerifyISISSegmentRoutingTunnels:
            entries:
              # Check only endpoint
              - endpoint: 1.0.0.122/32
              # Check endpoint and via TI-LFA
              - endpoint: 1.0.0.13/32
                vias:
                  - type: tunnel
                    tunnel_id: ti-lfa
              # Check endpoint and via IP routers
              - endpoint: 1.0.0.14/32
                vias:
                  - type: ip
                    nexthop: 1.1.1.1
    ```
    """

    categories: ClassVar[list[str]] = ["isis", "segment-routing"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show isis segment-routing tunnel", ofmt="json")]

    class Input(AntaTest.Input):
        """Input model for the VerifyISISSegmentRoutingTunnels test."""

        entries: list[Tunnel]
        """List of tunnels to check on device."""
        Entry: ClassVar[type[Entry]] = Entry

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyISISSegmentRoutingTunnels.

        This method performs the main test logic for verifying ISIS Segment Routing tunnels.
        It checks the command output, initiates defaults, and performs various checks on the tunnels.
        """
        self.result.is_success()

        command_output = self.instance_commands[0].json_output
        if len(command_output["entries"]) == 0:
            self.result.is_skipped("IS-IS-SR not configured")
            return

        for input_entry in self.inputs.entries:
            entries = list(command_output["entries"].values())
            if (eos_entry := get_item(entries, "endpoint", str(input_entry.endpoint))) is None:
                self.result.is_failure(f"{input_entry} - Tunnel not found")
                continue

            if input_entry.vias is not None:
                for via_input in input_entry.vias:
                    via_search_result = any(self._via_matches(via_input, eos_via) for eos_via in eos_entry["vias"])
                    if not via_search_result:
                        self.result.is_failure(f"{input_entry} {via_input} - Tunnel is incorrect")

    def _via_matches(self, via_input: TunnelPath, eos_via: dict[str, Any]) -> bool:
        """Check if the via input matches the eos via.

        Parameters
        ----------
        via_input : TunnelPath
            The input via to check.
        eos_via : dict[str, Any]
            The EOS via to compare against.

        Returns
        -------
        bool
            True if the via input matches the eos via, False otherwise.
        """
        return (
            (via_input.type is None or via_input.type == eos_via.get("type"))
            and (via_input.nexthop is None or str(via_input.nexthop) == eos_via.get("nexthop"))
            and (via_input.interface is None or via_input.interface == eos_via.get("interface"))
            and (via_input.tunnel_id is None or via_input.tunnel_id.upper() == get_value(eos_via, "tunnelId.type", default="").upper())
        )

Input models

Module containing input models for routing IS-IS tests.

Entry

Alias for the Tunnel model to maintain backward compatibility.

When initialized, it will emit a deprecation warning and call the Tunnel model.

TODO: Remove this class in ANTA v2.0.0.

Source code in anta/input_models/routing/isis.py
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
class Entry(Tunnel):  # pragma: no cover
    """Alias for the Tunnel model to maintain backward compatibility.

    When initialized, it will emit a deprecation warning and call the Tunnel model.

    TODO: Remove this class in ANTA v2.0.0.
    """

    def __init__(self, **data: Any) -> None:  # noqa: ANN401
        """Initialize the Entry class, emitting a deprecation warning."""
        warn(
            message="Entry model is deprecated and will be removed in ANTA v2.0.0. Use the Tunnel model instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        super().__init__(**data)

ISISInstance

Model for an IS-IS instance.

Name Type Description Default
name str
The name of the IS-IS instance.
-
vrf str
VRF context of the IS-IS instance.
'default'
dataplane Literal['MPLS', 'mpls', 'unset']
Configured SR data-plane for the IS-IS instance.
'MPLS'
segments list[Segment] | None
List of IS-IS SR segments associated with the instance. Required field in the `VerifyISISSegmentRoutingAdjacencySegments` test.
None
Source code in anta/input_models/routing/isis.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class ISISInstance(BaseModel):
    """Model for an IS-IS instance."""

    model_config = ConfigDict(extra="forbid")
    name: str
    """The name of the IS-IS instance."""
    vrf: str = "default"
    """VRF context of the IS-IS instance."""
    dataplane: Literal["MPLS", "mpls", "unset"] = "MPLS"
    """Configured SR data-plane for the IS-IS instance."""
    segments: list[Segment] | None = None
    """List of IS-IS SR segments associated with the instance. Required field in the `VerifyISISSegmentRoutingAdjacencySegments` test."""

    def __str__(self) -> str:
        """Return a human-readable string representation of the ISISInstance for reporting."""
        return f"Instance: {self.name} VRF: {self.vrf}"

ISISInterface

Model for an IS-IS enabled interface.

Name Type Description Default
name Interface
Interface name.
-
vrf str
VRF context of the interface.
'default'
level Literal[1, 2]
IS-IS level of the interface.
2
count int | None
Expected number of IS-IS neighbors on this interface. Required field in the `VerifyISISNeighborCount` test.
None
mode Literal['point-to-point', 'broadcast', 'passive'] | None
IS-IS network type of the interface. Required field in the `VerifyISISInterfaceMode` test.
None
Source code in anta/input_models/routing/isis.py
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class ISISInterface(BaseModel):
    """Model for an IS-IS enabled interface."""

    model_config = ConfigDict(extra="forbid")
    name: Interface
    """Interface name."""
    vrf: str = "default"
    """VRF context of the interface."""
    level: Literal[1, 2] = 2
    """IS-IS level of the interface."""
    count: int | None = None
    """Expected number of IS-IS neighbors on this interface. Required field in the `VerifyISISNeighborCount` test."""
    mode: Literal["point-to-point", "broadcast", "passive"] | None = None
    """IS-IS network type of the interface. Required field in the `VerifyISISInterfaceMode` test."""

    def __str__(self) -> str:
        """Return a human-readable string representation of the ISISInterface for reporting."""
        return f"Interface: {self.name} VRF: {self.vrf} Level: {self.level}"

InterfaceCount

Alias for the ISISInterface model to maintain backward compatibility.

When initialized, it will emit a deprecation warning and call the ISISInterface model.

TODO: Remove this class in ANTA v2.0.0.

Source code in anta/input_models/routing/isis.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
class InterfaceCount(ISISInterface):  # pragma: no cover
    """Alias for the ISISInterface model to maintain backward compatibility.

    When initialized, it will emit a deprecation warning and call the ISISInterface model.

    TODO: Remove this class in ANTA v2.0.0.
    """

    def __init__(self, **data: Any) -> None:  # noqa: ANN401
        """Initialize the InterfaceCount class, emitting a deprecation warning."""
        warn(
            message="InterfaceCount model is deprecated and will be removed in ANTA v2.0.0. Use the ISISInterface model instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        super().__init__(**data)

InterfaceState

Alias for the ISISInterface model to maintain backward compatibility.

When initialized, it will emit a deprecation warning and call the ISISInterface model.

TODO: Remove this class in ANTA v2.0.0.

Source code in anta/input_models/routing/isis.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
class InterfaceState(ISISInterface):  # pragma: no cover
    """Alias for the ISISInterface model to maintain backward compatibility.

    When initialized, it will emit a deprecation warning and call the ISISInterface model.

    TODO: Remove this class in ANTA v2.0.0.
    """

    def __init__(self, **data: Any) -> None:  # noqa: ANN401
        """Initialize the InterfaceState class, emitting a deprecation warning."""
        warn(
            message="InterfaceState model is deprecated and will be removed in ANTA v2.0.0. Use the ISISInterface model instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        super().__init__(**data)

IsisInstance

Alias for the ISISInstance model to maintain backward compatibility.

When initialized, it will emit a deprecation warning and call the ISISInstance model.

TODO: Remove this class in ANTA v2.0.0.

Source code in anta/input_models/routing/isis.py
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
class IsisInstance(ISISInstance):  # pragma: no cover
    """Alias for the ISISInstance model to maintain backward compatibility.

    When initialized, it will emit a deprecation warning and call the ISISInstance model.

    TODO: Remove this class in ANTA v2.0.0.
    """

    def __init__(self, **data: Any) -> None:  # noqa: ANN401
        """Initialize the IsisInstance class, emitting a deprecation warning."""
        warn(
            message="IsisInstance model is deprecated and will be removed in ANTA v2.0.0. Use the ISISInstance model instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        super().__init__(**data)

Segment

Model for an IS-IS segment.

Name Type Description Default
interface Interface
Local interface name.
-
level Literal[1, 2]
IS-IS level of the segment.
2
sid_origin Literal['dynamic', 'configured']
Origin of the segment ID.
'dynamic'
address IPv4Address
Adjacency IPv4 address of the segment.
-
Source code in anta/input_models/routing/isis.py
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Segment(BaseModel):
    """Model for an IS-IS segment."""

    model_config = ConfigDict(extra="forbid")
    interface: Interface
    """Local interface name."""
    level: Literal[1, 2] = 2
    """IS-IS level of the segment."""
    sid_origin: Literal["dynamic", "configured"] = "dynamic"
    """Origin of the segment ID."""
    address: IPv4Address
    """Adjacency IPv4 address of the segment."""

    def __str__(self) -> str:
        """Return a human-readable string representation of the Segment for reporting."""
        return f"Local Intf: {self.interface} Adj IP Address: {self.address}"

Tunnel

Model for a IS-IS SR tunnel.

Name Type Description Default
endpoint IPv4Network
Endpoint of the tunnel.
-
vias list[TunnelPath] | None
Optional list of paths to reach the endpoint.
None
Source code in anta/input_models/routing/isis.py
127
128
129
130
131
132
133
134
135
136
137
138
class Tunnel(BaseModel):
    """Model for a IS-IS SR tunnel."""

    model_config = ConfigDict(extra="forbid")
    endpoint: IPv4Network
    """Endpoint of the tunnel."""
    vias: list[TunnelPath] | None = None
    """Optional list of paths to reach the endpoint."""

    def __str__(self) -> str:
        """Return a human-readable string representation of the Tunnel for reporting."""
        return f"Endpoint: {self.endpoint}"

TunnelPath

Model for a IS-IS tunnel path.

Name Type Description Default
nexthop IPv4Address | None
Nexthop of the tunnel.
None
type Literal['ip', 'tunnel'] | None
Type of the tunnel.
None
interface Interface | None
Interface of the tunnel.
None
tunnel_id Literal['TI-LFA', 'ti-lfa', 'unset'] | None
Computation method of the tunnel.
None
Source code in anta/input_models/routing/isis.py
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
class TunnelPath(BaseModel):
    """Model for a IS-IS tunnel path."""

    model_config = ConfigDict(extra="forbid")
    nexthop: IPv4Address | None = None
    """Nexthop of the tunnel."""
    type: Literal["ip", "tunnel"] | None = None
    """Type of the tunnel."""
    interface: Interface | None = None
    """Interface of the tunnel."""
    tunnel_id: Literal["TI-LFA", "ti-lfa", "unset"] | None = None
    """Computation method of the tunnel."""

    def __str__(self) -> str:
        """Return a human-readable string representation of the TunnelPath for reporting."""
        base_string = ""
        if self.nexthop:
            base_string += f" Next-hop: {self.nexthop}"
        if self.type:
            base_string += f" Type: {self.type}"
        if self.interface:
            base_string += f" Interface: {self.interface}"
        if self.tunnel_id:
            base_string += f" Tunnel ID: {self.tunnel_id}"

        return base_string.lstrip()

Vias

Alias for the TunnelPath model to maintain backward compatibility.

When initialized, it will emit a deprecation warning and call the TunnelPath model.

TODO: Remove this class in ANTA v2.0.0.

Source code in anta/input_models/routing/isis.py
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
class Vias(TunnelPath):  # pragma: no cover
    """Alias for the TunnelPath model to maintain backward compatibility.

    When initialized, it will emit a deprecation warning and call the TunnelPath model.

    TODO: Remove this class in ANTA v2.0.0.
    """

    def __init__(self, **data: Any) -> None:  # noqa: ANN401
        """Initialize the Vias class, emitting a deprecation warning."""
        warn(
            message="Vias model is deprecated and will be removed in ANTA v2.0.0. Use the TunnelPath model instead.",
            category=DeprecationWarning,
            stacklevel=2,
        )
        super().__init__(**data)