From 01c2d471bff832b376c323da4a3e1b9e0c4c496d Mon Sep 17 00:00:00 2001 From: Bhavana Kalivemula Date: Thu, 5 Mar 2026 17:09:31 +0530 Subject: [PATCH] link failover operations added --- ...-circuit-link-failover-all-tests-detail.md | 16 ++ ...ircuit-link-failover-single-test-detail.md | 16 ++ .../_start-circuit-link-failover-test.md | 16 ++ .../_stop-circuit-link-failover-test.md | 16 ++ .../network/express-route-circuit/readme.md | 17 ++ Commands/network/readme.md | 3 + .../2025-07-01.json | 1 + .../2025-07-01.xml | 144 ++++++++++++++++ .../2025-07-01.json | 1 + .../2025-07-01.xml | 156 ++++++++++++++++++ .../2025-07-01.json | 1 + .../2025-07-01.xml | 82 +++++++++ .../2025-07-01.json | 1 + .../2025-07-01.xml | 98 +++++++++++ 14 files changed, 568 insertions(+) create mode 100644 Commands/network/express-route-circuit/_get-circuit-link-failover-all-tests-detail.md create mode 100644 Commands/network/express-route-circuit/_get-circuit-link-failover-single-test-detail.md create mode 100644 Commands/network/express-route-circuit/_start-circuit-link-failover-test.md create mode 100644 Commands/network/express-route-circuit/_stop-circuit-link-failover-test.md create mode 100644 Commands/network/express-route-circuit/readme.md create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.json create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.xml create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.json create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.xml create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.json create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.xml create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.json create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.xml diff --git a/Commands/network/express-route-circuit/_get-circuit-link-failover-all-tests-detail.md b/Commands/network/express-route-circuit/_get-circuit-link-failover-all-tests-detail.md new file mode 100644 index 000000000..1238422d9 --- /dev/null +++ b/Commands/network/express-route-circuit/_get-circuit-link-failover-all-tests-detail.md @@ -0,0 +1,16 @@ +# [Command] _network express-route-circuit get-circuit-link-failover-all-tests-detail_ + +This operation retrieves the details of all the failover tests performed on the ExpressRoute circuit for different peering locations + +## Versions + +### [2025-07-01](/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.xml) **Stable** + + + +#### examples + +- ExpressRouteCircuitLinkFailoverAllTestsDetails + ```bash + network express-route-circuit get-circuit-link-failover-all-tests-detail --resource-group rg1 --express-route-circuit-name erckt --failover-test-type LinkFailover --fetch-latest True + ``` diff --git a/Commands/network/express-route-circuit/_get-circuit-link-failover-single-test-detail.md b/Commands/network/express-route-circuit/_get-circuit-link-failover-single-test-detail.md new file mode 100644 index 000000000..8665e2245 --- /dev/null +++ b/Commands/network/express-route-circuit/_get-circuit-link-failover-single-test-detail.md @@ -0,0 +1,16 @@ +# [Command] _network express-route-circuit get-circuit-link-failover-single-test-detail_ + +This operation retrieves the details of a particular failover test performed on the circuit based on the test Guid + +## Versions + +### [2025-07-01](/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.xml) **Stable** + + + +#### examples + +- ExpressRouteCircuitLinkFailoverSingleTestDetails + ```bash + network express-route-circuit get-circuit-link-failover-single-test-detail --resource-group rg1 --express-route-circuit-name erckt --failover-test-id fe458ae8-d2ae-4520-a104-44bc233bde7e --link-type Primary --circuit-maintenance-category BgpDisconnect + ``` diff --git a/Commands/network/express-route-circuit/_start-circuit-link-failover-test.md b/Commands/network/express-route-circuit/_start-circuit-link-failover-test.md new file mode 100644 index 000000000..b2014ff0d --- /dev/null +++ b/Commands/network/express-route-circuit/_start-circuit-link-failover-test.md @@ -0,0 +1,16 @@ +# [Command] _network express-route-circuit start-circuit-link-failover-test_ + +This operation starts failover simulation on the circuit for the specified link type + +## Versions + +### [2025-07-01](/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.xml) **Stable** + + + +#### examples + +- ExpressRouteCircuitStartLinkFailoverSimulation + ```bash + network express-route-circuit start-circuit-link-failover-test --resource-group rg1 --express-route-circuit-name erckt --link-type Primary --circuit-maintenance-category BgpDisconnect + ``` diff --git a/Commands/network/express-route-circuit/_stop-circuit-link-failover-test.md b/Commands/network/express-route-circuit/_stop-circuit-link-failover-test.md new file mode 100644 index 000000000..875bca107 --- /dev/null +++ b/Commands/network/express-route-circuit/_stop-circuit-link-failover-test.md @@ -0,0 +1,16 @@ +# [Command] _network express-route-circuit stop-circuit-link-failover-test_ + +This operation stops an ongoing failover simulation on the circuit for the specified link type + +## Versions + +### [2025-07-01](/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.xml) **Stable** + + + +#### examples + +- ExpressRouteCircuitStopLinkFailoverSimulation + ```bash + network express-route-circuit stop-circuit-link-failover-test --resource-group rg1 --express-route-circuit-name erckt --circuit-test-category BgpDisconnect --link-type Primary --was-simulation-successful True --is-verified True + ``` diff --git a/Commands/network/express-route-circuit/readme.md b/Commands/network/express-route-circuit/readme.md new file mode 100644 index 000000000..e28b34372 --- /dev/null +++ b/Commands/network/express-route-circuit/readme.md @@ -0,0 +1,17 @@ +# [Group] _network express-route-circuit_ + +Manage Express Route Circuit + +## Commands + +- [get-circuit-link-failover-all-tests-detail](/Commands/network/express-route-circuit/_get-circuit-link-failover-all-tests-detail.md) +: This operation retrieves the details of all the failover tests performed on the ExpressRoute circuit for different peering locations + +- [get-circuit-link-failover-single-test-detail](/Commands/network/express-route-circuit/_get-circuit-link-failover-single-test-detail.md) +: This operation retrieves the details of a particular failover test performed on the circuit based on the test Guid + +- [start-circuit-link-failover-test](/Commands/network/express-route-circuit/_start-circuit-link-failover-test.md) +: This operation starts failover simulation on the circuit for the specified link type + +- [stop-circuit-link-failover-test](/Commands/network/express-route-circuit/_stop-circuit-link-failover-test.md) +: This operation stops an ongoing failover simulation on the circuit for the specified link type diff --git a/Commands/network/readme.md b/Commands/network/readme.md index b9f02872e..477cdcd13 100644 --- a/Commands/network/readme.md +++ b/Commands/network/readme.md @@ -37,6 +37,9 @@ Manage Azure Network resources. - [express-route](/Commands/network/express-route/readme.md) : Manage dedicated private network fiber connections to Azure. +- [express-route-circuit](/Commands/network/express-route-circuit/readme.md) +: Manage Express Route Circuit + - [express-route-cross-connection](/Commands/network/express-route-cross-connection/readme.md) : Manage express route cross connection diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.json b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.json new file mode 100644 index 000000000..3de685908 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.json @@ -0,0 +1 @@ +{"plane": "mgmt-plane", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/getcircuitlinkfailoveralltestsdetails", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L2dldENpcmN1aXRMaW5rRmFpbG92ZXJBbGxUZXN0c0RldGFpbHM=/V/MjAyNS0wNy0wMQ=="}], "commandGroups": [{"name": "network express-route-circuit", "commands": [{"name": "get-circuit-link-failover-all-tests-detail", "version": "2025-07-01", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/getcircuitlinkfailoveralltestsdetails", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L2dldENpcmN1aXRMaW5rRmFpbG92ZXJBbGxUZXN0c0RldGFpbHM=/V/MjAyNS0wNy0wMQ=="}], "argGroups": [{"name": "", "args": [{"type": "string", "var": "$Path.expressRouteCircuitName", "options": ["express-route-circuit-name"], "required": true, "idPart": "name", "help": {"short": "The name of the express route circuit."}, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "ResourceGroupName", "var": "$Path.resourceGroupName", "options": ["g", "resource-group"], "required": true, "idPart": "resource_group"}, {"type": "SubscriptionId", "var": "$Path.subscriptionId", "options": ["subscription"], "required": true, "idPart": "subscription"}, {"type": "string", "var": "$Query.failoverTestType", "options": ["failover-test-type"], "required": true, "help": {"short": "The type of failover test"}, "enum": {"items": [{"name": "All", "value": "All"}, {"name": "LinkFailover", "value": "LinkFailover"}, {"name": "MultiSiteFailover", "value": "MultiSiteFailover"}, {"name": "SingleSiteFailover", "value": "SingleSiteFailover"}]}}, {"type": "boolean", "var": "$Query.fetchLatest", "options": ["fetch-latest"], "required": true, "help": {"short": "Fetch only the latest tests for each peering location"}}]}], "operations": [{"longRunning": {"finalStateVia": "location"}, "operationId": "ExpressRouteCircuits_GetCircuitLinkFailoverAllTestsDetails", "http": {"path": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/expressRouteCircuits/{expressRouteCircuitName}/getCircuitLinkFailoverAllTestsDetails", "request": {"method": "post", "path": {"params": [{"type": "string", "name": "expressRouteCircuitName", "arg": "$Path.expressRouteCircuitName", "required": true, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "string", "name": "resourceGroupName", "arg": "$Path.resourceGroupName", "required": true}, {"type": "string", "name": "subscriptionId", "arg": "$Path.subscriptionId", "required": true}]}, "query": {"params": [{"type": "string", "name": "failoverTestType", "arg": "$Query.failoverTestType", "required": true, "enum": {"items": [{"value": "All"}, {"value": "LinkFailover"}, {"value": "MultiSiteFailover"}, {"value": "SingleSiteFailover"}]}}, {"type": "boolean", "name": "fetchLatest", "arg": "$Query.fetchLatest", "required": true}], "consts": [{"readOnly": true, "const": true, "default": {"value": "2025-07-01"}, "type": "string", "name": "api-version", "required": true}]}}, "responses": [{"statusCode": [200], "body": {"json": {"var": "$Instance", "schema": {"type": "array", "item": {"type": "object", "props": [{"readOnly": true, "type": "array", "name": "bgpStatus", "item": {"type": "object", "props": [{"readOnly": true, "type": "string", "name": "bgpStatusType", "enum": {"items": [{"value": "IPv4"}, {"value": "IPv6"}]}}, {"readOnly": true, "type": "string", "name": "checkTime"}, {"type": "string", "name": "link", "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}, {"readOnly": true, "type": "string", "name": "status", "enum": {"items": [{"value": "Connected"}, {"value": "Disconnected"}, {"value": "Undefined"}]}}]}}, {"readOnly": true, "type": "string", "name": "circuitTestCategory", "enum": {"items": [{"value": "ASPathPrepend"}, {"value": "BgpDisconnect"}]}}, {"readOnly": true, "type": "string", "name": "endTime"}, {"readOnly": true, "type": "array", "name": "issues", "item": {"type": "string"}}, {"readOnly": true, "type": "string", "name": "linkType", "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}, {"readOnly": true, "type": "string", "name": "startTime"}, {"readOnly": true, "type": "string", "name": "status", "enum": {"items": [{"value": "Completed"}, {"value": "Expired"}, {"value": "Invalid"}, {"value": "NotStarted"}, {"value": "Running"}, {"value": "StartFailed"}, {"value": "Starting"}, {"value": "StopFailed"}, {"value": "Stopping"}]}}, {"readOnly": true, "type": "string", "name": "testGuid"}, {"readOnly": true, "type": "string", "name": "testType", "enum": {"items": [{"value": "All"}, {"value": "LinkFailover"}, {"value": "MultiSiteFailover"}, {"value": "SingleSiteFailover"}]}}, {"readOnly": true, "type": "boolean", "name": "wasSimulationSuccessful"}]}}}}}, {"statusCode": [202], "header": {"items": [{"name": "location"}]}}, {"isError": true, "body": {"json": {"schema": {"type": "@ODataV4Format"}}}}]}}], "outputs": [{"type": "array", "ref": "$Instance"}]}]}]} \ No newline at end of file diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.xml b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.xml new file mode 100644 index 000000000..6d3944924 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJhbGx0ZXN0c2RldGFpbHM=/2025-07-01.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + +
+
+ +
+
+
diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.json b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.json new file mode 100644 index 000000000..6038881aa --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.json @@ -0,0 +1 @@ +{"plane": "mgmt-plane", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/getcircuitlinkfailoversingletestdetails", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L2dldENpcmN1aXRMaW5rRmFpbG92ZXJTaW5nbGVUZXN0RGV0YWlscw==/V/MjAyNS0wNy0wMQ=="}], "commandGroups": [{"name": "network express-route-circuit", "commands": [{"name": "get-circuit-link-failover-single-test-detail", "version": "2025-07-01", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/getcircuitlinkfailoversingletestdetails", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L2dldENpcmN1aXRMaW5rRmFpbG92ZXJTaW5nbGVUZXN0RGV0YWlscw==/V/MjAyNS0wNy0wMQ=="}], "argGroups": [{"name": "", "args": [{"type": "string", "var": "$Path.expressRouteCircuitName", "options": ["express-route-circuit-name"], "required": true, "idPart": "name", "help": {"short": "The name of the express route circuit."}, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "ResourceGroupName", "var": "$Path.resourceGroupName", "options": ["g", "resource-group"], "required": true, "idPart": "resource_group"}, {"type": "SubscriptionId", "var": "$Path.subscriptionId", "options": ["subscription"], "required": true, "idPart": "subscription"}, {"type": "string", "var": "$Query.circuitMaintenanceCategory", "options": ["circuit-maintenance-category"], "required": true, "help": {"short": "The type of maintenance test category"}, "enum": {"items": [{"name": "ASPathPrepend", "value": "ASPathPrepend"}, {"name": "BgpDisconnect", "value": "BgpDisconnect"}]}}, {"type": "string", "var": "$Query.failoverTestId", "options": ["failover-test-id"], "required": true, "help": {"short": "The unique Guid value which identifies the test"}}, {"type": "string", "var": "$Query.linkType", "options": ["link-type"], "required": true, "help": {"short": "The type of link on which failover test was performed"}, "enum": {"items": [{"name": "Primary", "value": "Primary"}, {"name": "Secondary", "value": "Secondary"}]}}]}], "operations": [{"longRunning": {"finalStateVia": "location"}, "operationId": "ExpressRouteCircuits_GetCircuitLinkFailoverSingleTestDetails", "http": {"path": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/expressRouteCircuits/{expressRouteCircuitName}/getCircuitLinkFailoverSingleTestDetails", "request": {"method": "post", "path": {"params": [{"type": "string", "name": "expressRouteCircuitName", "arg": "$Path.expressRouteCircuitName", "required": true, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "string", "name": "resourceGroupName", "arg": "$Path.resourceGroupName", "required": true}, {"type": "string", "name": "subscriptionId", "arg": "$Path.subscriptionId", "required": true}]}, "query": {"params": [{"type": "string", "name": "circuitMaintenanceCategory", "arg": "$Query.circuitMaintenanceCategory", "required": true, "enum": {"items": [{"value": "ASPathPrepend"}, {"value": "BgpDisconnect"}]}}, {"type": "string", "name": "failoverTestId", "arg": "$Query.failoverTestId", "required": true}, {"type": "string", "name": "linkType", "arg": "$Query.linkType", "required": true, "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}], "consts": [{"readOnly": true, "const": true, "default": {"value": "2025-07-01"}, "type": "string", "name": "api-version", "required": true}]}}, "responses": [{"statusCode": [200], "body": {"json": {"var": "$Instance", "schema": {"type": "array", "item": {"type": "object", "props": [{"readOnly": true, "type": "array", "name": "bgpStatus", "item": {"type": "object", "props": [{"readOnly": true, "type": "string", "name": "bgpStatusType", "enum": {"items": [{"value": "IPv4"}, {"value": "IPv6"}]}}, {"readOnly": true, "type": "string", "name": "checkTime"}, {"type": "string", "name": "link", "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}, {"readOnly": true, "type": "string", "name": "status", "enum": {"items": [{"value": "Connected"}, {"value": "Disconnected"}, {"value": "Undefined"}]}}]}}, {"readOnly": true, "type": "string", "name": "circuitTestCategory", "enum": {"items": [{"value": "ASPathPrepend"}, {"value": "BgpDisconnect"}]}}, {"readOnly": true, "type": "string", "name": "endTime"}, {"readOnly": true, "type": "boolean", "name": "isSimulationVerified"}, {"readOnly": true, "type": "string", "name": "linkType", "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}, {"readOnly": true, "type": "@ExpressRouteLinkFailoverRouteList_read", "name": "nonRedundantRoutes"}, {"readOnly": true, "type": "object", "name": "redundantRoutes", "props": [{"type": "array", "name": "beforeSimulation", "item": {"type": "object", "props": [{"type": "string", "name": "nextHop"}, {"type": "string", "name": "primaryASPath"}, {"type": "string", "name": "route"}, {"type": "string", "name": "secondaryASPath"}], "cls": "ExpressRouteLinkFailoverRoute_read"}}, {"type": "array<@ExpressRouteLinkFailoverRoute_read>", "name": "duringSimulation", "item": {"type": "@ExpressRouteLinkFailoverRoute_read"}}], "cls": "ExpressRouteLinkFailoverRouteList_read"}, {"readOnly": true, "type": "string", "name": "startTime"}, {"readOnly": true, "type": "string", "name": "status", "enum": {"items": [{"value": "Completed"}, {"value": "Expired"}, {"value": "Invalid"}, {"value": "NotStarted"}, {"value": "Running"}, {"value": "StartFailed"}, {"value": "Starting"}, {"value": "StopFailed"}, {"value": "Stopping"}]}}, {"readOnly": true, "type": "boolean", "name": "wasSimulationSuccessful"}]}}}}}, {"statusCode": [202], "header": {"items": [{"name": "location"}]}}, {"isError": true, "body": {"json": {"schema": {"type": "@ODataV4Format"}}}}]}}], "outputs": [{"type": "array", "ref": "$Instance", "clientFlatten": true}]}]}]} \ No newline at end of file diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.xml b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.xml new file mode 100644 index 000000000..c66eb69e2 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L2dldGNpcmN1aXRsaW5rZmFpbG92ZXJzaW5nbGV0ZXN0ZGV0YWlscw==/2025-07-01.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + +
+
+ +
+
+
diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.json b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.json new file mode 100644 index 000000000..3b49eaee6 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.json @@ -0,0 +1 @@ +{"plane": "mgmt-plane", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/startcircuitlinkfailovertest", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L3N0YXJ0Q2lyY3VpdExpbmtGYWlsb3ZlclRlc3Q=/V/MjAyNS0wNy0wMQ=="}], "commandGroups": [{"name": "network express-route-circuit", "commands": [{"name": "start-circuit-link-failover-test", "version": "2025-07-01", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/startcircuitlinkfailovertest", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L3N0YXJ0Q2lyY3VpdExpbmtGYWlsb3ZlclRlc3Q=/V/MjAyNS0wNy0wMQ=="}], "argGroups": [{"name": "", "args": [{"type": "string", "var": "$Path.expressRouteCircuitName", "options": ["express-route-circuit-name"], "required": true, "idPart": "name", "help": {"short": "The name of the express route circuit."}, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "ResourceGroupName", "var": "$Path.resourceGroupName", "options": ["g", "resource-group"], "required": true, "idPart": "resource_group"}, {"type": "SubscriptionId", "var": "$Path.subscriptionId", "options": ["subscription"], "required": true, "idPart": "subscription"}, {"type": "string", "var": "$Query.circuitMaintenanceCategory", "options": ["circuit-maintenance-category"], "required": true, "help": {"short": "The type of maintenance that can occur during an ExpressRoute Circuit failover test"}, "enum": {"items": [{"name": "ASPathPrepend", "value": "ASPathPrepend"}, {"name": "BgpDisconnect", "value": "BgpDisconnect"}]}}, {"type": "string", "var": "$Query.linkType", "options": ["link-type"], "required": true, "help": {"short": "The type of link on which failover test was performed"}, "enum": {"items": [{"name": "Primary", "value": "Primary"}, {"name": "Secondary", "value": "Secondary"}]}}]}], "operations": [{"longRunning": {"finalStateVia": "location"}, "operationId": "ExpressRouteCircuits_StartCircuitLinkFailoverTest", "http": {"path": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/expressRouteCircuits/{expressRouteCircuitName}/startCircuitLinkFailoverTest", "request": {"method": "post", "path": {"params": [{"type": "string", "name": "expressRouteCircuitName", "arg": "$Path.expressRouteCircuitName", "required": true, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "string", "name": "resourceGroupName", "arg": "$Path.resourceGroupName", "required": true}, {"type": "string", "name": "subscriptionId", "arg": "$Path.subscriptionId", "required": true}]}, "query": {"params": [{"type": "string", "name": "circuitMaintenanceCategory", "arg": "$Query.circuitMaintenanceCategory", "required": true, "enum": {"items": [{"value": "ASPathPrepend"}, {"value": "BgpDisconnect"}]}}, {"type": "string", "name": "linkType", "arg": "$Query.linkType", "required": true, "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}], "consts": [{"readOnly": true, "const": true, "default": {"value": "2025-07-01"}, "type": "string", "name": "api-version", "required": true}]}}, "responses": [{"statusCode": [200], "body": {"json": {"var": "$Instance", "schema": {"type": "string"}}}}, {"statusCode": [202], "header": {"items": [{"name": "location"}]}}, {"isError": true, "body": {"json": {"schema": {"type": "@ODataV4Format"}}}}]}}], "outputs": [{"type": "string", "ref": "$Instance"}]}]}]} \ No newline at end of file diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.xml b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.xml new file mode 100644 index 000000000..0b8c364e5 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0YXJ0Y2lyY3VpdGxpbmtmYWlsb3ZlcnRlc3Q=/2025-07-01.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + +
+
+ +
+
+
diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.json b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.json new file mode 100644 index 000000000..5c0a99960 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.json @@ -0,0 +1 @@ +{"plane": "mgmt-plane", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/stopcircuitlinkfailovertest", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L3N0b3BDaXJjdWl0TGlua0ZhaWxvdmVyVGVzdA==/V/MjAyNS0wNy0wMQ=="}], "commandGroups": [{"name": "network express-route-circuit", "commands": [{"name": "stop-circuit-link-failover-test", "version": "2025-07-01", "resources": [{"id": "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/expressroutecircuits/{}/stopcircuitlinkfailovertest", "version": "2025-07-01", "swagger": "mgmt-plane/network/ResourceProviders/Microsoft.Network/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy97cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9leHByZXNzUm91dGVDaXJjdWl0cy97ZXhwcmVzc1JvdXRlQ2lyY3VpdE5hbWV9L3N0b3BDaXJjdWl0TGlua0ZhaWxvdmVyVGVzdA==/V/MjAyNS0wNy0wMQ=="}], "argGroups": [{"name": "", "args": [{"type": "string", "var": "$Path.expressRouteCircuitName", "options": ["express-route-circuit-name"], "required": true, "idPart": "name", "help": {"short": "The name of the express route circuit."}, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "ResourceGroupName", "var": "$Path.resourceGroupName", "options": ["g", "resource-group"], "required": true, "idPart": "resource_group"}, {"type": "SubscriptionId", "var": "$Path.subscriptionId", "options": ["subscription"], "required": true, "idPart": "subscription"}]}, {"name": "StopParameters", "args": [{"type": "string", "var": "$stopParameters.circuitTestCategory", "options": ["circuit-test-category"], "required": true, "group": "StopParameters", "help": {"short": "The type of maintenance test category"}, "enum": {"items": [{"name": "ASPathPrepend", "value": "ASPathPrepend"}, {"name": "BgpDisconnect", "value": "BgpDisconnect"}]}}, {"type": "boolean", "var": "$stopParameters.isVerified", "options": ["is-verified"], "required": true, "group": "StopParameters", "help": {"short": "Whether the customer was able to establish connectivity through this failover link or not"}}, {"type": "string", "var": "$stopParameters.linkType", "options": ["link-type"], "required": true, "group": "StopParameters", "help": {"short": "The type of link on which failover test was performed"}, "enum": {"items": [{"name": "Primary", "value": "Primary"}, {"name": "Secondary", "value": "Secondary"}]}}, {"type": "boolean", "var": "$stopParameters.wasSimulationSuccessful", "options": ["was-simulation-successful"], "required": true, "group": "StopParameters", "help": {"short": "Whether the failover simulation was successful or not"}}]}], "operations": [{"longRunning": {"finalStateVia": "location"}, "operationId": "ExpressRouteCircuits_StopCircuitLinkFailoverTest", "http": {"path": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/expressRouteCircuits/{expressRouteCircuitName}/stopCircuitLinkFailoverTest", "request": {"method": "post", "path": {"params": [{"type": "string", "name": "expressRouteCircuitName", "arg": "$Path.expressRouteCircuitName", "required": true, "format": {"pattern": "^[A-Za-z0-9_]+"}}, {"type": "string", "name": "resourceGroupName", "arg": "$Path.resourceGroupName", "required": true}, {"type": "string", "name": "subscriptionId", "arg": "$Path.subscriptionId", "required": true}]}, "query": {"consts": [{"readOnly": true, "const": true, "default": {"value": "2025-07-01"}, "type": "string", "name": "api-version", "required": true}]}, "body": {"json": {"schema": {"type": "object", "name": "stopParameters", "required": true, "props": [{"type": "string", "name": "circuitTestCategory", "arg": "$stopParameters.circuitTestCategory", "required": true, "enum": {"items": [{"value": "ASPathPrepend"}, {"value": "BgpDisconnect"}]}}, {"type": "boolean", "name": "isVerified", "arg": "$stopParameters.isVerified", "required": true}, {"type": "string", "name": "linkType", "arg": "$stopParameters.linkType", "required": true, "enum": {"items": [{"value": "Primary"}, {"value": "Secondary"}]}}, {"type": "boolean", "name": "wasSimulationSuccessful", "arg": "$stopParameters.wasSimulationSuccessful", "required": true}], "clientFlatten": true}}}}, "responses": [{"statusCode": [200], "body": {"json": {"var": "$Instance", "schema": {"type": "string"}}}}, {"statusCode": [202], "header": {"items": [{"name": "location"}]}}, {"isError": true, "body": {"json": {"schema": {"type": "@ODataV4Format"}}}}]}}], "outputs": [{"type": "string", "ref": "$Instance"}]}]}]} \ No newline at end of file diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.xml b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.xml new file mode 100644 index 000000000..d3d486248 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcmVzb3VyY2Vncm91cHMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5uZXR3b3JrL2V4cHJlc3Nyb3V0ZWNpcmN1aXRzL3t9L3N0b3BjaXJjdWl0bGlua2ZhaWxvdmVydGVzdA==/2025-07-01.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + +
+
+ +
+
+