Skip to content

ANTA catalog for CVX tests

VerifyActiveCVXConnections

Verifies the number of active CVX Connections.

Expected Results
  • Success: The test will pass if number of connections is equal to the expected number of connections.
  • Failure: The test will fail otherwise.
Examples
anta.tests.cvx:
  - VerifyActiveCVXConnections:
      connections_count: 100

Inputs

Name Type Description Default
connections_count PositiveInteger
The expected number of active CVX Connections.
-
Source code in anta/tests/cvx.py
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 VerifyActiveCVXConnections(AntaTest):
    """Verifies the number of active CVX Connections.

    Expected Results
    ----------------
    * Success: The test will pass if number of connections is equal to the expected number of connections.
    * Failure: The test will fail otherwise.

    Examples
    --------
    ```yaml
    anta.tests.cvx:
      - VerifyActiveCVXConnections:
          connections_count: 100
    ```
    """

    categories: ClassVar[list[str]] = ["cvx"]
    # TODO: @gmuloc - cover "% Unavailable command (controller not ready)"
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show cvx connections brief", revision=1)]

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

        connections_count: PositiveInteger
        """The expected number of active CVX Connections."""

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyActiveCVXConnections."""
        command_output = self.instance_commands[0].json_output
        self.result.is_success()

        if not (connections := command_output.get("connections")):
            self.result.is_failure("CVX connections are not available.")
            return

        active_count = len([connection for connection in connections if connection.get("oobConnectionActive")])

        if self.inputs.connections_count != active_count:
            self.result.is_failure(f"CVX active connections count. Expected: {self.inputs.connections_count}, Actual : {active_count}")

VerifyCVXClusterStatus

Verifies the CVX Server Cluster status.

Expected Results
  • Success: The test will pass if all of the following conditions is met:
    • CVX Enabled state is true
    • Cluster Mode is true
    • Role is either Master or Standby.
    • peer_status matches defined state
  • Failure: The test will fail if any of the success conditions is not met.
Examples
anta.tests.cvx:
  - VerifyCVXClusterStatus:
      role: Master
      peer_status:
        - peer_name : cvx-red-2
          registration_state: Registration complete
        - peer_name: cvx-red-3
          registration_state: Registration error

Inputs

Name Type Description Default
Source code in anta/tests/cvx.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
class VerifyCVXClusterStatus(AntaTest):
    """Verifies the CVX Server Cluster status.

    Expected Results
    ----------------
    * Success: The test will pass if all of the following conditions is met:
        - CVX Enabled state is true
        - Cluster Mode is true
        - Role is either Master or Standby.
        - peer_status matches defined state
    * Failure: The test will fail if any of the success conditions is not met.

    Examples
    --------
    ```yaml
    anta.tests.cvx:
      - VerifyCVXClusterStatus:
          role: Master
          peer_status:
            - peer_name : cvx-red-2
              registration_state: Registration complete
            - peer_name: cvx-red-3
              registration_state: Registration error
    ```
    """

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

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

        role: Literal["Master", "Standby", "Disconnected"] = "Master"
        peer_status: list[CVXPeers]

    @AntaTest.anta_test
    def test(self) -> None:
        """Run the main test for VerifyCVXClusterStatus."""
        command_output = self.instance_commands[0].json_output
        self.result.is_success()

        # Validate Server enabled status
        if not command_output.get("enabled"):
            self.result.is_failure("CVX Server status is not enabled")

        # Validate cluster status and mode
        if not (cluster_status := command_output.get("clusterStatus")) or not command_output.get("clusterMode"):
            self.result.is_failure("CVX Server is not a cluster")
            return

        # Check cluster role
        if (cluster_role := cluster_status.get("role")) != self.inputs.role:
            self.result.is_failure(f"CVX Role is not valid: {cluster_role}")
            return

        # Validate peer status
        peer_cluster = cluster_status.get("peerStatus", {})

        # Check peer count
        if (num_of_peers := len(peer_cluster)) != (expected_num_of_peers := len(self.inputs.peer_status)):
            self.result.is_failure(f"Unexpected number of peers {num_of_peers} vs {expected_num_of_peers}")

        # Check each peer
        for peer in self.inputs.peer_status:
            # Retrieve the peer status from the peer cluster
            if (eos_peer_status := get_value(peer_cluster, peer.peer_name, separator="..")) is None:
                self.result.is_failure(f"{peer.peer_name} is not present")
                continue

            # Validate the registration state of the peer
            if (peer_reg_state := eos_peer_status.get("registrationState")) != peer.registration_state:
                self.result.is_failure(f"{peer.peer_name} registration state is not complete: {peer_reg_state}")

VerifyManagementCVX

Verifies the management CVX global status.

Expected Results
  • Success: The test will pass if the management CVX global status matches the expected status.
  • Failure: The test will fail if the management CVX global status does not match the expected status.
Examples
anta.tests.cvx:
  - VerifyManagementCVX:
      enabled: true

Inputs

Name Type Description Default
enabled bool
Whether management CVX must be enabled (True) or disabled (False).
-
Source code in anta/tests/cvx.py
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class VerifyManagementCVX(AntaTest):
    """Verifies the management CVX global status.

    Expected Results
    ----------------
    * Success: The test will pass if the management CVX global status matches the expected status.
    * Failure: The test will fail if the management CVX global status does not match the expected status.


    Examples
    --------
    ```yaml
    anta.tests.cvx:
      - VerifyManagementCVX:
          enabled: true
    ```
    """

    categories: ClassVar[list[str]] = ["cvx"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show management cvx", revision=3)]

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

        enabled: bool
        """Whether management CVX must be enabled (True) or disabled (False)."""

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyManagementCVX."""
        command_output = self.instance_commands[0].json_output
        self.result.is_success()
        if (cluster_state := get_value(command_output, "clusterStatus.enabled")) != self.inputs.enabled:
            self.result.is_failure(f"Management CVX status is not valid: {cluster_state}")

VerifyMcsClientMounts

Verify if all MCS client mounts are in mountStateMountComplete.

Expected Results
  • Success: The test will pass if the MCS mount status on MCS Clients are mountStateMountComplete.
  • Failure: The test will fail even if one switch’s MCS client mount status is not mountStateMountComplete.
Examples
anta.tests.cvx:
- VerifyMcsClientMounts:
Source code in anta/tests/cvx.py
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
class VerifyMcsClientMounts(AntaTest):
    """Verify if all MCS client mounts are in mountStateMountComplete.

    Expected Results
    ----------------
    * Success: The test will pass if the MCS mount status on MCS Clients are mountStateMountComplete.
    * Failure: The test will fail even if one switch's MCS client mount status is not  mountStateMountComplete.

    Examples
    --------
    ```yaml
    anta.tests.cvx:
    - VerifyMcsClientMounts:
    ```
    """

    categories: ClassVar[list[str]] = ["cvx"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show management cvx mounts", revision=1)]

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyMcsClientMounts."""
        command_output = self.instance_commands[0].json_output
        self.result.is_success()
        mount_states = command_output["mountStates"]
        mcs_mount_state_detected = False
        for mount_state in mount_states:
            if not mount_state["type"].startswith("Mcs"):
                continue
            mcs_mount_state_detected = True
            if (state := mount_state["state"]) != "mountStateMountComplete":
                self.result.is_failure(f"MCS Client mount states are not valid: {state}")

        if not mcs_mount_state_detected:
            self.result.is_failure("MCS Client mount states are not present")

VerifyMcsServerMounts

Verify if all MCS server mounts are in a MountComplete state.

Expected Results
  • Success: The test will pass if all the MCS mount status on MCS server are mountStateMountComplete.
  • Failure: The test will fail even if any MCS server mount status is not mountStateMountComplete.
Examples
anta.tests.cvx:

- VerifyMcsServerMounts:
    connections_count: 100

mcs_path_types class-attribute

mcs_path_types: list[str] = [
    "Mcs::ApiConfigRedundancyStatus",
    "Mcs::ActiveFlows",
    "Mcs::Client::Status",
]

The list of expected MCS path types to verify.

Inputs

Name Type Description Default
connections_count int
The expected number of active CVX Connections with mountStateMountComplete
-

validate_mount_states

validate_mount_states(
    mount: dict[str, Any], hostname: str
) -> None

Validate the mount states of a given mount.

Source code in anta/tests/cvx.py
124
125
126
127
128
129
130
131
132
133
134
135
def validate_mount_states(self, mount: dict[str, Any], hostname: str) -> None:
    """Validate the mount states of a given mount."""
    mount_states = mount["mountStates"][0]

    if (num_path_states := len(mount_states["pathStates"])) != (expected_num := len(self.mcs_path_types)):
        self.result.is_failure(f"Incorrect number of mount path states for {hostname} - Expected: {expected_num}, Actual: {num_path_states}")

    for path in mount_states["pathStates"]:
        if (path_type := path.get("type")) not in self.mcs_path_types:
            self.result.is_failure(f"Unexpected MCS path type for {hostname}: '{path_type}'.")
        if (path_state := path.get("state")) != "mountStateMountComplete":
            self.result.is_failure(f"MCS server mount state for path '{path_type}' is not valid is for {hostname}: '{path_state}'.")
Source code in anta/tests/cvx.py
 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
140
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 VerifyMcsServerMounts(AntaTest):
    """Verify if all MCS server mounts are in a MountComplete state.

    Expected Results
    ----------------
    * Success: The test will pass if all the MCS mount status on MCS server are mountStateMountComplete.
    * Failure: The test will fail even if any MCS server mount status is not mountStateMountComplete.

    Examples
    --------
    ```yaml
    anta.tests.cvx:

    - VerifyMcsServerMounts:
        connections_count: 100
    ```
    """

    categories: ClassVar[list[str]] = ["cvx"]
    commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show cvx mounts", revision=1)]

    mcs_path_types: ClassVar[list[str]] = ["Mcs::ApiConfigRedundancyStatus", "Mcs::ActiveFlows", "Mcs::Client::Status"]
    """The list of expected MCS path types to verify."""

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

        connections_count: int
        """The expected number of active CVX Connections with mountStateMountComplete"""

    def validate_mount_states(self, mount: dict[str, Any], hostname: str) -> None:
        """Validate the mount states of a given mount."""
        mount_states = mount["mountStates"][0]

        if (num_path_states := len(mount_states["pathStates"])) != (expected_num := len(self.mcs_path_types)):
            self.result.is_failure(f"Incorrect number of mount path states for {hostname} - Expected: {expected_num}, Actual: {num_path_states}")

        for path in mount_states["pathStates"]:
            if (path_type := path.get("type")) not in self.mcs_path_types:
                self.result.is_failure(f"Unexpected MCS path type for {hostname}: '{path_type}'.")
            if (path_state := path.get("state")) != "mountStateMountComplete":
                self.result.is_failure(f"MCS server mount state for path '{path_type}' is not valid is for {hostname}: '{path_state}'.")

    @AntaTest.anta_test
    def test(self) -> None:
        """Main test function for VerifyMcsServerMounts."""
        command_output = self.instance_commands[0].json_output
        self.result.is_success()
        active_count = 0

        if not (connections := command_output.get("connections")):
            self.result.is_failure("CVX connections are not available.")
            return

        for connection in connections:
            mounts = connection.get("mounts", [])
            hostname = connection["hostname"]

            mcs_mounts = [mount for mount in mounts if mount["service"] == "Mcs"]

            if not mounts:
                self.result.is_failure(f"No mount status for {hostname}")
                continue

            if not mcs_mounts:
                self.result.is_failure(f"MCS mount state not detected for {hostname}")
            else:
                for mount in mcs_mounts:
                    self.validate_mount_states(mount, hostname)
                    active_count += 1

        if active_count != self.inputs.connections_count:
            self.result.is_failure(f"Incorrect CVX successful connections count. Expected: {self.inputs.connections_count}, Actual : {active_count}")