From 6488f61fdbc84753ab0ce4f52c586c5eb17b3884 Mon Sep 17 00:00:00 2001 From: Szymon Basan <116343782+sbasan@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:14:20 +0200 Subject: [PATCH] dev-uxmt: merge main (0.33.8) (#728) * Revert "Dev/rebase migration" (#513) * Fix find_template_values when vipValue not present (#520) * clear cookies on login, bump minor (#532) * [Fix] validation software timeout (#534) * clear cookies on login, bump minor * fix validation value --------- Co-authored-by: sbasan * fix log message level for request exceptions * bump patch version * disable relogin flag during logout (#537) * fix typo (#542) * update deprecated github actions (#544) * update deprecated github actions * fix type error * Simplify conditional logic. Add comments. Create new field in cisco vpn feature template model. (new in 20.14) * Transfer to cisco-open repository (#1) * use new uri, add missing copyright, bump version, regenerate ENDPOINTS.md * regenerate endpoints after rebase * define codeowners * .github codeowners * usernames in codeowners * remove pydantic v1 models (#10) * remove pydantic v1 models * fix problems * bump minor version * Fix DeviceData types (#13) * Fix DeviceData types * Bump sdk version * Update README.md * Update README.md * Update README.md * Update README.md * Add default None values to the Tier model (#16) * Fix: admintech wait (#17) * version check and model update for user * admin tech - wait for file ready * get token * correct logic * Add default None values to the Tier model (#16) --------- Co-authored-by: Nikhil Co-authored-by: PrzeG <86780353+PrzeG@users.noreply.github.com> * fix admintech, generate endpoints md for new release (#18) * generate endpoints md * fix admintech api and unittests * Update README.md * Update versions_utils.py ``` -------------------------------------------------- nExpress_mtt.test_nExpress_mtt_verify_provider_software_upgrade_data -------------------------------------------------- verify_provider_software_upgrade_vmanage(PROVIDER) [PASS] "All VManages updated correctly." verify_provider_software_upgrade_vbond(PROVIDER) [PASS] "All VBonds updated correctly." verify_set_default_partition_for_vbond(PROVIDER) [PASS] "Successfully set the default version for partition." ``` * Update versions_utils.py * Update versions_utils.py * Update versions_utils.py * Release 0.33.3 * server_info * monitoring * monitoring * tests * fix tags field for DeviceDetailsResponse * unit-test * enhance modesl for configuration_settings * don't use Union * allow centralized cli policy creation * fix for groupId for get_list_of_installed_devices * Release/0.33.4 * url_monitoring initial commit * GET Monitoring Security Policy Device List (#45) * GET Monitoring Security Policy Device List * Update security_policy.py * Update security_policy.py * Update test_monitoring_security_policy.py * Add files via upload * Delete endpoints/endpoints_container.py * Delete endpoints/monitoring/security_policy.py * Delete models/security_policy.py * Delete tests/test_monitoring_security_policy.py * Add files via upload * Add files via upload * Update security_policy.py * Delete catalystwan/models/security_policy.py * Update endpoints_container.py * Update endpoints_container.py * Update security_policy.py * Update security_policy.py * Update test_monitoring_security_policy.py * Update security_policy.py * Update security_policy.py * Adding api support for Lxc virutal image Upgrade,Activate and Delete action * Ran black and flake8 on change files * Fixing poetry check error from pre-commit * Fixing errors from pre-commit * Release/0.33.5 * fix pre-commit for python 3.12 (#614) * Update README.md * Update README.md * allow disabling of response validation against pydantic model * rename property, remove print from tests * unit tests added for url_monitoring * updated the imports * updated import sort * Fix sequence creation when payload is None. Use Field instead of conint * Revert breaking change * Fix value for field examples * include original cause and info from server in ManagerHTTPError * fix: request and response must be provided as kwargs * Bump version to 0.33.6 * introduce find method for DataSequence (#627) * api and endpoints containers as cached properties (#629) * hotfix ManagerErrorInfo model * Fix find_template_values to return device variables in correct structure * Delete if condition with pass * Fix Issue646 Not content in response * restore tenant model validate during login * bump release version * alarms-20.15 * 0.33.8 * Validate XSRF token returned by server In same case this token can be login page and raise incorrect error in future login flow. * Add copy and deepcopy * Remove 2023 license * merge and fix confilcts --------- Co-authored-by: PrzeG <86780353+PrzeG@users.noreply.github.com> Co-authored-by: cicharka <93913624+cicharka@users.noreply.github.com> Co-authored-by: JimOverholt <115191247+JimOverholt@users.noreply.github.com> Co-authored-by: Jakub Krajewski Co-authored-by: Nikhil Co-authored-by: Piotr Smialkowski Co-authored-by: Jim Overholt Co-authored-by: acichon Co-authored-by: nikhilkp93 <137326448+nikhilkp93@users.noreply.github.com> Co-authored-by: Renuka Mohan Channapatna (rchannap) <17580723+renukavinay@users.noreply.github.com> Co-authored-by: Robert Mooy Co-authored-by: Surendran Palanimuthu Co-authored-by: renukavinay Co-authored-by: Jakub Krajewski <95274389+jpkrajewski@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- CONTRIBUTING.md | 12 +- ENDPOINTS.md | 287 +++--- README.md | 2 + catalystwan/abstractions.py | 2 +- catalystwan/api/alarms_api.py | 7 +- catalystwan/api/api_container.py | 2 + .../api/configuration_groups/parcel.py | 3 +- catalystwan/api/versions_utils.py | 78 +- catalystwan/api/virtual_image_action_api.py | 200 +++++ catalystwan/endpoints/__init__.py | 4 +- .../endpoints/configuration_device_actions.py | 73 +- .../endpoints/monitoring/security_policy.py | 12 + catalystwan/endpoints/url_monitoring.py | 26 + catalystwan/exceptions.py | 2 +- catalystwan/integration_tests/__init__.py | 0 .../test_config_migration.py | 28 - .../configuration/feature_profile/parcel.py | 1 - .../sdwan/policy_object/__init__.py | 9 + .../sdwan/policy_object/policy/app_probe.py | 1 + .../policy_object/policy/application_list.py | 1 + .../sdwan/policy_object/policy/as_path.py | 1 + .../sdwan/policy_object/policy/color_list.py | 3 +- .../sdwan/policy_object/policy/data_prefix.py | 8 +- .../policy/expanded_community_list.py | 2 +- .../policy/extended_community.py | 2 +- .../policy_object/policy/fowarding_class.py | 3 +- .../policy_object/policy/ipv6_data_prefix.py | 1 + .../policy_object/policy/ipv6_prefix_list.py | 1 + .../sdwan/policy_object/policy/mirror.py | 1 + .../sdwan/policy_object/policy/policer.py | 7 +- .../policy/prefered_group_color.py | 1 + .../sdwan/policy_object/policy/prefix_list.py | 1 + .../sdwan/policy_object/policy/sla_class.py | 1 + .../policy/standard_community.py | 1 + .../sdwan/policy_object/policy/tloc_list.py | 8 +- .../sdwan/policy_object/security/aip.py | 3 +- .../sdwan/policy_object/security/amp.py | 3 +- .../security/application_list.py | 1 + .../policy_object/security/data_prefix.py | 1 + .../sdwan/policy_object/security/fqdn.py | 1 + .../security/geolocation_list.py | 3 +- .../security/intrusion_prevention.py | 3 +- .../policy_object/security/ips_signature.py | 1 + .../policy_object/security/local_domain.py | 1 + .../policy_object/security/protocol_list.py | 1 + .../policy_object/security/security_port.py | 1 + .../security/ssl_decryption_profile.py | 3 +- .../sdwan/policy_object/security/url.py | 5 +- .../sdwan/policy_object/security/zone.py | 3 +- .../sdwan/sig_security/sig_security.py | 4 +- .../feature_profile/sdwan/system/aaa.py | 8 +- .../models/monitoring/security_policy.py | 16 + catalystwan/models/policy/centralized.py | 20 +- .../policy/definition/access_control_list.py | 4 +- .../models/policy/definition/cflowd.py | 6 +- .../models/policy/definition/device_access.py | 4 +- catalystwan/models/policy/policy.py | 3 +- catalystwan/models/url_monitoring.py | 28 + catalystwan/session.py | 31 +- catalystwan/tests/__init__.py | 0 .../test_converter_chooser.py | 26 - catalystwan/tests/templates/__init__.py | 0 .../tests/templates/definitions/__init__.py | 0 .../templates/definitions/basic/__init__.py | 0 .../templates/test_find_template_values.py | 192 ++++ .../tests/test_monitoring_security_policy.py | 65 ++ catalystwan/tests/test_response.py | 2 - catalystwan/tests/test_typed_list.py | 26 +- catalystwan/tests/test_url_monitoring.py | 79 ++ catalystwan/tests/test_vmanage_auth.py | 38 +- catalystwan/typed_list.py | 12 +- .../creators/config_pusher.py | 12 +- catalystwan/utils/timezone.py | 840 +++++++++--------- catalystwan/vmanage_auth.py | 5 +- diagram.png | Bin 142336 -> 0 bytes endpoints-md.py | 2 +- examples/parcel_configuration_guide.py | 2 +- examples/policies_configuration_guide.py | 14 +- pyproject.toml | 2 +- 80 files changed, 1547 insertions(+), 717 deletions(-) create mode 100644 catalystwan/api/virtual_image_action_api.py create mode 100644 catalystwan/endpoints/monitoring/security_policy.py create mode 100644 catalystwan/endpoints/url_monitoring.py create mode 100644 catalystwan/integration_tests/__init__.py delete mode 100644 catalystwan/integration_tests/test_config_migration.py create mode 100644 catalystwan/models/monitoring/security_policy.py create mode 100644 catalystwan/models/url_monitoring.py create mode 100644 catalystwan/tests/__init__.py delete mode 100644 catalystwan/tests/config_migration/test_converter_chooser.py create mode 100644 catalystwan/tests/templates/__init__.py create mode 100644 catalystwan/tests/templates/definitions/__init__.py create mode 100644 catalystwan/tests/templates/definitions/basic/__init__.py create mode 100644 catalystwan/tests/templates/test_find_template_values.py create mode 100644 catalystwan/tests/test_monitoring_security_policy.py create mode 100644 catalystwan/tests/test_url_monitoring.py delete mode 100644 diagram.png diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 75845255..db8c8e7b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: hooks: - id: flake8 additional_dependencies: [ - "flake8-quotes==3.3.2" + "flake8-quotes==3.4.0" ] fail_fast: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ba7bdcd..528ff290 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -89,6 +89,7 @@ Start reading our code, and you'll get the hang of it. Example: ```python + # to keep example brief we define models and endpoints in single file - however it is suggested to use separate files from pydantic import BaseModel, Field from typing import List from catalystwan.endpoints import APIEndpoints, delete, versions, view @@ -112,17 +113,20 @@ Start reading our code, and you'll get the hang of it. Please note that when using `@request` decorator method must have no body. Request will be built automatically and return value based on defined type will be provided. - API endpoints Definitions can be found in: `catalystwan/endpoints` directory. + API endpoints definitions can be found in: `catalystwan/endpoints` directory. - The organization of items **strictly** follows an OpenAPI spec: https://developer.cisco.com/docs/sdwan/#!sd-wan-vmanage-v20-9 + The organization of items should follow OpenAPI spec: https://developer.cisco.com/docs/sdwan/#!sd-wan-vmanage-v20-9 + + For example with given tag `Configuration - Feature Profile (SDWAN)` items should be placed in: + - `catalystwan/endpoints/configuration/feature_profile/sdwan/...` for APIEndpoints sub-classes + - `catalystwan/models/configuration/feature_profile/sdwan/...` for pydantic models defining payload, return type and possibly query params. Auto generated python methods names can be found in: https://ghe-msite.cisco.com/sbasan/openapi-generator-vmanage - If common data-model is being reused by more than one `APIEndpoints` class it should be moved to `catalystwan/model` folder with appropriate module name. Dedicated pre-commit step will automatically check corectness and add documentation for endpoints with `@request` (or `@get`, `@post`, `@put`, `@delete`) decorator. - Custom payload types are allowed (eg. for sending various types of files) please check example: [**SoftwarePackageUpdatePayload**](catalystwan/utils/upgrades_helper.py#L68) + Custom payload types are allowed (eg. for sending various types of files) please check example: [**SoftwarePackageUploadPayload**](catalystwan/utils/upgrades_helper.py#L77) 1. Check that endpoints you want to utilize in your API already defined in `catalystwan/endpoints`. 2. If endpoint not present, create new file with endpoint including data-model and methods with `@request`, `@view` and `@versions` decorators when needed. diff --git a/ENDPOINTS.md b/ENDPOINTS.md index f583e05e..00edf9b5 100644 --- a/ENDPOINTS.md +++ b/ENDPOINTS.md @@ -1,6 +1,6 @@ **THIS FILE WAS AUTO-GENERATED DO NOT EDIT** -Generated for: catalystwan-0.33.7.dev6 +Generated for: catalystwan-0.33.8.dev0 All URIs are relative to */dataservice* HTTP request | Supported Versions | Method | Payload Type | Return Type | Tenancy Mode @@ -57,189 +57,189 @@ GET /disasterrecovery/status||[**ConfigurationDisasterRecovery.get_dr_status**]( POST /disasterrecovery/pause||[**ConfigurationDisasterRecovery.pause_dr**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L239)||[**DisasterRecoveryPauseResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L59)| POST /disasterrecovery/register||[**ConfigurationDisasterRecovery.register**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L255)|[**DisasterRecoveryRegisterPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L89)|[**RegisterDisasterRecoveryTaskId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L18)| POST /disasterrecovery/unpause||[**ConfigurationDisasterRecovery.unpause_dr**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L267)||[**UnpauseDisasterRecoveryTaskId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/disaster_recovery.py#L30)| -GET /v1/feature-profile/sdwan/cli||[**CliFeatureProfile.get_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L21)|Optional[[**GetFeatureProfilesParams**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L115)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -POST /v1/feature-profile/sdwan/cli||[**CliFeatureProfile.create_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L26)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +GET /v1/feature-profile/sdwan/cli||[**CliFeatureProfile.get_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L21)|Optional[[**GetFeatureProfilesParams**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L116)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +POST /v1/feature-profile/sdwan/cli||[**CliFeatureProfile.create_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L26)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/cli/{profile_id}||[**CliFeatureProfile.delete_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L31)||None| -GET /v1/feature-profile/sdwan/cli/{profile_id}/config||[**CliFeatureProfile.get_all**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L36)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/cli/{profile_id}/config/{parcel_id}||[**CliFeatureProfile.get_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L41)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -POST /v1/feature-profile/sdwan/cli/{profile_id}/config||[**CliFeatureProfile.create**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L46)|[**ConfigParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/cli/config.py#L10)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| +GET /v1/feature-profile/sdwan/cli/{profile_id}/config||[**CliFeatureProfile.get_all**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L36)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/cli/{profile_id}/config/{parcel_id}||[**CliFeatureProfile.get_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L41)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +POST /v1/feature-profile/sdwan/cli/{profile_id}/config||[**CliFeatureProfile.create**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L46)|[**ConfigParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/cli/config.py#L10)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| PUT /v1/feature-profile/sdwan/cli/{profile_id}/config/{parcel_id}||[**CliFeatureProfile.update**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L51)|[**ConfigParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/cli/config.py#L10)|None| DELETE /v1/feature-profile/sdwan/cli/{profile_id}/config/{parcel_id}||[**CliFeatureProfile.delete**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py#L56)||None| GET /v1/feature-profile/sdwan/sig-security/sig/schema|>=20.12|[**SIGSecurity.get_sig_security_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L27)||None| -GET /v1/feature-profile/sdwan/sig-security|>=20.12|[**SIGSecurity.get_sig_security_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L32)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -POST /v1/feature-profile/sdwan/sig-security|>=20.12|[**SIGSecurity.create_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L39)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| -GET /v1/feature-profile/sdwan/sig-security/{profile_id}|>=20.12|[**SIGSecurity.get_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L46)||[**FeatureProfileDetail**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L69)| -PUT /v1/feature-profile/sdwan/sig-security/{profile_id}|>=20.12|[**SIGSecurity.edit_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L53)|[**FeatureProfileEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L95)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +GET /v1/feature-profile/sdwan/sig-security|>=20.12|[**SIGSecurity.get_sig_security_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L32)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +POST /v1/feature-profile/sdwan/sig-security|>=20.12|[**SIGSecurity.create_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L39)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| +GET /v1/feature-profile/sdwan/sig-security/{profile_id}|>=20.12|[**SIGSecurity.get_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L46)||[**FeatureProfileDetail**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L70)| +PUT /v1/feature-profile/sdwan/sig-security/{profile_id}|>=20.12|[**SIGSecurity.edit_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L53)|[**FeatureProfileEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L96)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/sig-security/{profile_id}|>=20.12|[**SIGSecurity.delete_sig_security_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L60)||None| -GET /v1/feature-profile/sdwan/sig-security/{profile_id}/sig|>=20.12|[**SIGSecurity.get_sig_security_parcels**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L65)||[**ParcelSequence**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L167)| -POST /v1/feature-profile/sdwan/sig-security/{profile_id}/sig|>=20.12|[**SIGSecurity.create_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L70)|[**SIGParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py#L359)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| -GET /v1/feature-profile/sdwan/sig-security/{profile_id}/sig/{parcel_id}|>=20.12|[**SIGSecurity.get_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L75)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -PUT /v1/feature-profile/sdwan/sig-security/{profile_id}/sig/{parcel_id}|>=20.12|[**SIGSecurity.edit_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L80)|[**SIGParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py#L359)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| +GET /v1/feature-profile/sdwan/sig-security/{profile_id}/sig|>=20.12|[**SIGSecurity.get_sig_security_parcels**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L65)||[**ParcelSequence**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L166)| +POST /v1/feature-profile/sdwan/sig-security/{profile_id}/sig|>=20.12|[**SIGSecurity.create_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L70)|[**SIGParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py#L359)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| +GET /v1/feature-profile/sdwan/sig-security/{profile_id}/sig/{parcel_id}|>=20.12|[**SIGSecurity.get_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L75)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +PUT /v1/feature-profile/sdwan/sig-security/{profile_id}/sig/{parcel_id}|>=20.12|[**SIGSecurity.edit_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L80)|[**SIGParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py#L359)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| DELETE /v1/feature-profile/sdwan/sig-security/{profile_id}/sig/{parcel_id}|>=20.12|[**SIGSecurity.delete_sig_security_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py#L85)||None| GET /v1/feature-profile/sdwan/system/{parcel_type}/schema|>=20.9|[**SystemFeatureProfile.get_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L33)||None| -GET /v1/feature-profile/sdwan/system|>=20.9|[**SystemFeatureProfile.get_sdwan_system_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L38)|Optional[[**GetFeatureProfilesParams**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L115)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -POST /v1/feature-profile/sdwan/system|>=20.9|[**SystemFeatureProfile.create_sdwan_system_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L45)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +GET /v1/feature-profile/sdwan/system|>=20.9|[**SystemFeatureProfile.get_sdwan_system_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L38)|Optional[[**GetFeatureProfilesParams**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L116)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +POST /v1/feature-profile/sdwan/system|>=20.9|[**SystemFeatureProfile.create_sdwan_system_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L45)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/system/{profile_id}|>=20.9|[**SystemFeatureProfile.delete_sdwan_system_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L52)||None| -POST /v1/feature-profile/sdwan/system/{profile_id}/aaa|>=20.9|[**SystemFeatureProfile.create_aaa_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L57)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -PUT /v1/feature-profile/sdwan/system/{profile_id}/aaa/{parcel_id}|>=20.9|[**SystemFeatureProfile.edit_aaa_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L62)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -GET /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}|>=20.9|[**SystemFeatureProfile.get_all**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L67)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L72)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/aaa|>=20.9|[**SystemFeatureProfile.get_all_aaa**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L77)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/aaa/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_aaa**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L82)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/banner|>=20.9|[**SystemFeatureProfile.get_all_banner**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L87)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/banner/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_banner**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L92)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/basic|>=20.9|[**SystemFeatureProfile.get_all_basic**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L97)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/basic/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_basic**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L102)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/bfd|>=20.9|[**SystemFeatureProfile.get_all_bfd**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L107)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/bfd/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_bfd**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L112)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/global|>=20.9|[**SystemFeatureProfile.get_all_global**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L117)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/global/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_global**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L122)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/logging|>=20.9|[**SystemFeatureProfile.get_all_logging**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L127)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/logging/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_logging**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L132)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/mrf|>=20.9|[**SystemFeatureProfile.get_all_mrf**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L137)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/mrf/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_mrf**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L142)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/ntp|>=20.9|[**SystemFeatureProfile.get_all_ntp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L147)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/ntp/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_ntp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L152)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/omp|>=20.9|[**SystemFeatureProfile.get_all_omp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L157)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/omp/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_omp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L162)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/security|>=20.9|[**SystemFeatureProfile.get_all_security**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L167)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/security/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_security**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L172)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -GET /v1/feature-profile/sdwan/system/{profile_id}/snmp|>=20.9|[**SystemFeatureProfile.get_all_snmp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L177)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/system/{profile_id}/snmp/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_snmp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L182)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -PUT /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**SystemFeatureProfile.update**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L187)|[**AAAParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py#L262), [**BFDParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py#L22), [**LoggingParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py#L74), [**BannerParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/banner.py#L12), [**BasicParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/basic.py#L116), [**DeviceAccessIPv4Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py#L141), [**DeviceAccessIPv6Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py#L141), [**GlobalParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py#L140), [**NtpParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py#L90), [**MRFParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py#L38), [**OMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/omp.py#L34), [**SecurityParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/security.py#L143), [**SNMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py#L137)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| +POST /v1/feature-profile/sdwan/system/{profile_id}/aaa|>=20.9|[**SystemFeatureProfile.create_aaa_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L57)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +PUT /v1/feature-profile/sdwan/system/{profile_id}/aaa/{parcel_id}|>=20.9|[**SystemFeatureProfile.edit_aaa_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L62)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +GET /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}|>=20.9|[**SystemFeatureProfile.get_all**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L67)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L72)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/aaa|>=20.9|[**SystemFeatureProfile.get_all_aaa**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L77)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/aaa/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_aaa**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L82)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/banner|>=20.9|[**SystemFeatureProfile.get_all_banner**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L87)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/banner/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_banner**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L92)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/basic|>=20.9|[**SystemFeatureProfile.get_all_basic**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L97)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/basic/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_basic**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L102)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/bfd|>=20.9|[**SystemFeatureProfile.get_all_bfd**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L107)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/bfd/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_bfd**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L112)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/global|>=20.9|[**SystemFeatureProfile.get_all_global**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L117)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/global/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_global**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L122)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/logging|>=20.9|[**SystemFeatureProfile.get_all_logging**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L127)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/logging/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_logging**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L132)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/mrf|>=20.9|[**SystemFeatureProfile.get_all_mrf**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L137)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/mrf/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_mrf**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L142)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/ntp|>=20.9|[**SystemFeatureProfile.get_all_ntp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L147)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/ntp/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_ntp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L152)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/omp|>=20.9|[**SystemFeatureProfile.get_all_omp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L157)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/omp/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_omp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L162)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/security|>=20.9|[**SystemFeatureProfile.get_all_security**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L167)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/security/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_security**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L172)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +GET /v1/feature-profile/sdwan/system/{profile_id}/snmp|>=20.9|[**SystemFeatureProfile.get_all_snmp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L177)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/system/{profile_id}/snmp/{parcel_id}|>=20.9|[**SystemFeatureProfile.get_by_id_snmp**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L182)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +PUT /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**SystemFeatureProfile.update**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L187)|[**AAAParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py#L264), [**BFDParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py#L22), [**LoggingParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py#L74), [**BannerParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/banner.py#L12), [**BasicParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/basic.py#L116), [**DeviceAccessIPv4Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py#L141), [**DeviceAccessIPv6Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py#L141), [**GlobalParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py#L140), [**NtpParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py#L90), [**MRFParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py#L38), [**OMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/omp.py#L34), [**SecurityParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/security.py#L143), [**SNMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py#L137)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| DELETE /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**SystemFeatureProfile.delete**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L192)||None| -POST /v1/feature-profile/sdwan/system/{system_id}/bfd|>=20.9|[**SystemFeatureProfile.create_bfd_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L197)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -POST /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}|>=20.9|[**SystemFeatureProfile.create**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L202)|[**AAAParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py#L262), [**BFDParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py#L22), [**LoggingParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py#L74), [**BannerParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/banner.py#L12), [**BasicParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/basic.py#L116), [**DeviceAccessIPv4Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py#L141), [**DeviceAccessIPv6Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py#L141), [**GlobalParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py#L140), [**NtpParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py#L90), [**MRFParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py#L38), [**OMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/omp.py#L34), [**SecurityParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/security.py#L143), [**SNMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py#L137)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -POST /v1/feature-profile/sdwan/topology|>=20.12|[**TopologyFeatureProfile.create_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L23)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| -GET /v1/feature-profile/sdwan/topology|>=20.12|[**TopologyFeatureProfile.get_topology_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L28)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -GET /v1/feature-profile/sdwan/topology/{profile_id}|>=20.12|[**TopologyFeatureProfile.get_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L33)||[**FeatureProfileDetail**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L69)| -PUT /v1/feature-profile/sdwan/topology/{profile_id}|>=20.12|[**TopologyFeatureProfile.edit_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L38)|[**FeatureProfileEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L95)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +POST /v1/feature-profile/sdwan/system/{system_id}/bfd|>=20.9|[**SystemFeatureProfile.create_bfd_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L197)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +POST /v1/feature-profile/sdwan/system/{profile_id}/{parcel_type}|>=20.9|[**SystemFeatureProfile.create**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py#L202)|[**AAAParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py#L264), [**BFDParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py#L22), [**LoggingParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py#L74), [**BannerParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/banner.py#L12), [**BasicParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/basic.py#L116), [**DeviceAccessIPv4Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py#L141), [**DeviceAccessIPv6Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py#L141), [**GlobalParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py#L140), [**NtpParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py#L90), [**MRFParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py#L38), [**OMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/omp.py#L34), [**SecurityParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/security.py#L143), [**SNMPParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py#L137)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +POST /v1/feature-profile/sdwan/topology|>=20.12|[**TopologyFeatureProfile.create_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L23)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| +GET /v1/feature-profile/sdwan/topology|>=20.12|[**TopologyFeatureProfile.get_topology_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L28)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +GET /v1/feature-profile/sdwan/topology/{profile_id}|>=20.12|[**TopologyFeatureProfile.get_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L33)||[**FeatureProfileDetail**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L70)| +PUT /v1/feature-profile/sdwan/topology/{profile_id}|>=20.12|[**TopologyFeatureProfile.edit_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L38)|[**FeatureProfileEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L96)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/topology/{profile_id}|>=20.12|[**TopologyFeatureProfile.delete_topology_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L45)||None| -POST /v1/feature-profile/sdwan/topology/{profile_id}/{parcel_type}|>=20.12|[**TopologyFeatureProfile.create_any_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L54)|[**MeshParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py#L12), [**HubSpokeParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py#L43), [**CustomControlParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py#L288)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| +POST /v1/feature-profile/sdwan/topology/{profile_id}/{parcel_type}|>=20.12|[**TopologyFeatureProfile.create_any_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L54)|[**MeshParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py#L12), [**HubSpokeParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py#L43), [**CustomControlParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py#L288)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| DELETE /v1/feature-profile/sdwan/topology/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**TopologyFeatureProfile.delete_any_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L61)||None| -GET /v1/feature-profile/sdwan/topology/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**TopologyFeatureProfile.get_any_parcel_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L66)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| +GET /v1/feature-profile/sdwan/topology/{profile_id}/{parcel_type}/{parcel_id}|>=20.9|[**TopologyFeatureProfile.get_any_parcel_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L66)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| GET /v1/feature-profile/sdwan/topology/mesh/schema|>=20.9|[**TopologyFeatureProfile.get_mesh_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L74)||None| GET /v1/feature-profile/sdwan/topology/hubspoke/schema|>=20.9|[**TopologyFeatureProfile.get_hubspoke_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L82)||None| GET /v1/feature-profile/sdwan/topology/custom-control/schema|>=20.9|[**TopologyFeatureProfile.get_custom_control_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py#L90)||None| -POST /v1/feature-profile/sdwan/transport|>=20.12|[**TransportFeatureProfile.create_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L33)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| -GET /v1/feature-profile/sdwan/transport|>=20.12|[**TransportFeatureProfile.get_transport_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L40)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -GET /v1/feature-profile/sdwan/transport/{profile_id}|>=20.12|[**TransportFeatureProfile.get_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L45)||[**FeatureProfileDetail**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L69)| -PUT /v1/feature-profile/sdwan/transport/{profile_id}|>=20.12|[**TransportFeatureProfile.edit_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L50)|[**FeatureProfileEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L95)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +POST /v1/feature-profile/sdwan/transport|>=20.12|[**TransportFeatureProfile.create_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L33)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| +GET /v1/feature-profile/sdwan/transport|>=20.12|[**TransportFeatureProfile.get_transport_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L40)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +GET /v1/feature-profile/sdwan/transport/{profile_id}|>=20.12|[**TransportFeatureProfile.get_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L45)||[**FeatureProfileDetail**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L70)| +PUT /v1/feature-profile/sdwan/transport/{profile_id}|>=20.12|[**TransportFeatureProfile.edit_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L50)|[**FeatureProfileEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L96)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/transport/{profile_id}|>=20.12|[**TransportFeatureProfile.delete_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L57)||None| -POST /v1/feature-profile/sdwan/transport/{profile_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.create_transport_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L62)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| -POST /v1/feature-profile/sdwan/transport/{profile_id}/wan/vpn/{vpn_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.create_transport_vpn_sub_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L69)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| -POST /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn/{vpn_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.create_management_vpn_sub_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L76)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| -GET /v1/feature-profile/sdwan/transport/{profile_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.get_transport_parcels**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L83)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)]| -GET /v1/feature-profile/sdwan/transport/{profile_id}/{parcel_type}/{parcel_id}|>=20.12|[**TransportFeatureProfile.get_transport_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L88)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L137)| -POST /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn|>=20.12|[**TransportFeatureProfile.create_management_vpn_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L96)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| -PUT /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn/{parcel_id}|>=20.12|[**TransportFeatureProfile.edit_management_vpn_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L111)|[**ManagementVpnParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py#L166)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| +POST /v1/feature-profile/sdwan/transport/{profile_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.create_transport_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L62)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| +POST /v1/feature-profile/sdwan/transport/{profile_id}/wan/vpn/{vpn_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.create_transport_vpn_sub_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L69)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| +POST /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn/{vpn_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.create_management_vpn_sub_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L76)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| +GET /v1/feature-profile/sdwan/transport/{profile_id}/{parcel_type}|>=20.12|[**TransportFeatureProfile.get_transport_parcels**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L83)||DataSequence[[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)]| +GET /v1/feature-profile/sdwan/transport/{profile_id}/{parcel_type}/{parcel_id}|>=20.12|[**TransportFeatureProfile.get_transport_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L88)||[**Parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L136)| +POST /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn|>=20.12|[**TransportFeatureProfile.create_management_vpn_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L96)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| +PUT /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn/{parcel_id}|>=20.12|[**TransportFeatureProfile.edit_management_vpn_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L111)|[**ManagementVpnParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py#L166)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| DELETE /v1/feature-profile/sdwan/transport/{profile_id}/management/vpn/{parcel_id}|>=20.12|[**TransportFeatureProfile.delete_management_vpn_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L118)||None| -GET /v1/feature-profile/sdwan/transport|>=20.9|[**TransportFeatureProfile.get_sdwan_transport_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L123)|Optional[[**GetFeatureProfilesParams**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L115)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| +GET /v1/feature-profile/sdwan/transport|>=20.9|[**TransportFeatureProfile.get_sdwan_transport_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L123)|Optional[[**GetFeatureProfilesParams**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L116)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| GET /v1/feature-profile/sdwan/transport/cellular-controller/schema|>=20.9|[**TransportFeatureProfile.get_sdwan_transport_cellular_controller_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L130)||None| -POST /v1/feature-profile/sdwan/transport|>=20.9|[**TransportFeatureProfile.create_sdwan_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L135)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +POST /v1/feature-profile/sdwan/transport|>=20.9|[**TransportFeatureProfile.create_sdwan_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L135)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/transport/{transport_id}|>=20.9|[**TransportFeatureProfile.delete_sdwan_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L142)||None| -POST /v1/feature-profile/sdwan/transport/{transport_id}/cellular-controller|>=20.9|[**TransportFeatureProfile.create_cellular_controller_profile_parcel_for_transport**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L147)|[**CellularControllerParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py#L38)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -POST /v1/feature-profile/sdwan/transport/{profile_id}/cellular-controller/{cellular_controler_id}/{parcel_type}|>=20.9|[**TransportFeatureProfile.associate_with_cellular_controller**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L158)|[**ParcelAssociationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L180)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -POST /v1/feature-profile/sdwan/transport/{profile_id}/wan/vpn/{vpn_id}/{parcel_type}|>=20.9|[**TransportFeatureProfile.associate_with_vpn**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L169)|[**ParcelAssociationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L180)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L174)| +POST /v1/feature-profile/sdwan/transport/{transport_id}/cellular-controller|>=20.9|[**TransportFeatureProfile.create_cellular_controller_profile_parcel_for_transport**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L147)|[**CellularControllerParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py#L38)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +POST /v1/feature-profile/sdwan/transport/{profile_id}/cellular-controller/{cellular_controler_id}/{parcel_type}|>=20.9|[**TransportFeatureProfile.associate_with_cellular_controller**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L158)|[**ParcelAssociationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L179)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +POST /v1/feature-profile/sdwan/transport/{profile_id}/wan/vpn/{vpn_id}/{parcel_type}|>=20.9|[**TransportFeatureProfile.associate_with_vpn**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py#L169)|[**ParcelAssociationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L179)|[**ParcelCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L173)| GET /v1/network-hierarchy|>=20.10|[**NetworkHierarchy.list_nodes**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/network_hierarchy.py#L10)||DataSequence[[**NodeInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/network_hierarchy.py#L78)]| POST /template/policy/definition/acl||[**ConfigurationPolicyAclDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L23)|[**AclPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list.py#L147)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/acl/{id}||[**ConfigurationPolicyAclDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L27)||None| -PUT /template/policy/definition/acl/{id}||[**ConfigurationPolicyAclDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L35)|[**AclPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list.py#L168)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/acl||[**ConfigurationPolicyAclDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/acl/{id}||[**ConfigurationPolicyAclDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L35)|[**AclPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list.py#L168)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/acl||[**ConfigurationPolicyAclDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/acl/{id}||[**ConfigurationPolicyAclDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L43)||[**AclPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list.py#L172)| -POST /template/policy/definition/acl/preview||[**ConfigurationPolicyAclDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L47)|[**AclPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list.py#L147)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/acl/preview/{id}||[**ConfigurationPolicyAclDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/acl/preview||[**ConfigurationPolicyAclDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L47)|[**AclPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list.py#L147)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/acl/preview/{id}||[**ConfigurationPolicyAclDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/aclv6||[**ConfigurationPolicyAclIPv6Definition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L23)|[**AclIPv6Policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list_ipv6.py#L147)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/aclv6/{id}||[**ConfigurationPolicyAclIPv6Definition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L27)||None| -PUT /template/policy/definition/aclv6/{id}||[**ConfigurationPolicyAclIPv6Definition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L35)|[**AclIPv6PolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list_ipv6.py#L168)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/aclv6||[**ConfigurationPolicyAclIPv6Definition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/aclv6/{id}||[**ConfigurationPolicyAclIPv6Definition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L35)|[**AclIPv6PolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list_ipv6.py#L168)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/aclv6||[**ConfigurationPolicyAclIPv6Definition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/aclv6/{id}||[**ConfigurationPolicyAclIPv6Definition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L43)||[**AclIPv6PolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list_ipv6.py#L172)| -POST /template/policy/definition/aclv6/preview||[**ConfigurationPolicyAclIPv6Definition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L47)|[**AclIPv6Policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list_ipv6.py#L147)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/aclv6/preview/{id}||[**ConfigurationPolicyAclIPv6Definition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/aclv6/preview||[**ConfigurationPolicyAclIPv6Definition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L47)|[**AclIPv6Policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/access_control_list_ipv6.py#L147)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/aclv6/preview/{id}||[**ConfigurationPolicyAclIPv6Definition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/control||[**ConfigurationPolicyControlDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L23)|[**ControlPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/control.py#L315)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/control/{id}||[**ConfigurationPolicyControlDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L27)||None| -PUT /template/policy/definition/control/{id}||[**ConfigurationPolicyControlDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L35)|[**ControlPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/control.py#L348)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/control||[**ConfigurationPolicyControlDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/control/{id}||[**ConfigurationPolicyControlDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L35)|[**ControlPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/control.py#L348)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/control||[**ConfigurationPolicyControlDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/control/{id}||[**ConfigurationPolicyControlDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L43)||[**ControlPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/control.py#L352)| -POST /template/policy/definition/control/preview||[**ConfigurationPolicyControlDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L47)|[**ControlPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/control.py#L315)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/control/preview/{id}||[**ConfigurationPolicyControlDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/control/preview||[**ConfigurationPolicyControlDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L47)|[**ControlPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/control.py#L315)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/control/preview/{id}||[**ConfigurationPolicyControlDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/control.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/deviceaccesspolicy||[**ConfigurationPolicyDeviceAccessDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L23)|[**DeviceAccessPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access.py#L85)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/deviceaccesspolicy/{id}||[**ConfigurationPolicyDeviceAccessDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L27)||None| -PUT /template/policy/definition/deviceaccesspolicy/{id}||[**ConfigurationPolicyDeviceAccessDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L35)|[**DeviceAccessPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access.py#L111)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/deviceaccesspolicy||[**ConfigurationPolicyDeviceAccessDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/deviceaccesspolicy/{id}||[**ConfigurationPolicyDeviceAccessDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L35)|[**DeviceAccessPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access.py#L111)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/deviceaccesspolicy||[**ConfigurationPolicyDeviceAccessDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/deviceaccesspolicy/{id}||[**ConfigurationPolicyDeviceAccessDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L43)||[**DeviceAccessPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access.py#L115)| -POST /template/policy/definition/deviceaccesspolicy/preview||[**ConfigurationPolicyDeviceAccessDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L47)|[**DeviceAccessPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access.py#L85)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/deviceaccesspolicy/preview/{id}||[**ConfigurationPolicyDeviceAccessDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/deviceaccesspolicy/preview||[**ConfigurationPolicyDeviceAccessDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L47)|[**DeviceAccessPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access.py#L85)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/deviceaccesspolicy/preview/{id}||[**ConfigurationPolicyDeviceAccessDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/deviceaccesspolicyv6||[**ConfigurationPolicyDeviceAccessIPv6Definition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L23)|[**DeviceAccessIPv6Policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access_ipv6.py#L85)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/deviceaccesspolicyv6/{id}||[**ConfigurationPolicyDeviceAccessIPv6Definition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L27)||None| -PUT /template/policy/definition/deviceaccesspolicyv6/{id}||[**ConfigurationPolicyDeviceAccessIPv6Definition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L35)|[**DeviceAccessIPv6PolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access_ipv6.py#L111)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/deviceaccesspolicyv6||[**ConfigurationPolicyDeviceAccessIPv6Definition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L41)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/deviceaccesspolicyv6/{id}||[**ConfigurationPolicyDeviceAccessIPv6Definition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L35)|[**DeviceAccessIPv6PolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access_ipv6.py#L111)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/deviceaccesspolicyv6||[**ConfigurationPolicyDeviceAccessIPv6Definition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L41)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/deviceaccesspolicyv6/{id}||[**ConfigurationPolicyDeviceAccessIPv6Definition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L45)||[**DeviceAccessIPv6PolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access_ipv6.py#L115)| -POST /template/policy/definition/deviceaccesspolicyv6/preview||[**ConfigurationPolicyDeviceAccessIPv6Definition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L49)|[**DeviceAccessIPv6Policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access_ipv6.py#L85)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/deviceaccesspolicyv6/preview/{id}||[**ConfigurationPolicyDeviceAccessIPv6Definition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L53)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/deviceaccesspolicyv6/preview||[**ConfigurationPolicyDeviceAccessIPv6Definition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L49)|[**DeviceAccessIPv6Policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/device_access_ipv6.py#L85)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/deviceaccesspolicyv6/preview/{id}||[**ConfigurationPolicyDeviceAccessIPv6Definition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py#L53)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/hubandspoke||[**ConfigurationPolicyHubAndSpokeDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L23)|[**HubAndSpokePolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/hub_and_spoke.py#L50)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/hubandspoke/{id}||[**ConfigurationPolicyHubAndSpokeDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L27)||None| -PUT /template/policy/definition/hubandspoke/{id}||[**ConfigurationPolicyHubAndSpokeDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L35)|[**HubAndSpokePolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/hub_and_spoke.py#L80)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/hubandspoke||[**ConfigurationPolicyHubAndSpokeDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/hubandspoke/{id}||[**ConfigurationPolicyHubAndSpokeDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L35)|[**HubAndSpokePolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/hub_and_spoke.py#L80)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/hubandspoke||[**ConfigurationPolicyHubAndSpokeDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/hubandspoke/{id}||[**ConfigurationPolicyHubAndSpokeDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L43)||[**HubAndSpokePolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/hub_and_spoke.py#L84)| -POST /template/policy/definition/hubandspoke/preview||[**ConfigurationPolicyHubAndSpokeDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L47)|[**HubAndSpokePolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/hub_and_spoke.py#L50)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/hubandspoke/preview/{id}||[**ConfigurationPolicyHubAndSpokeDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/hubandspoke/preview||[**ConfigurationPolicyHubAndSpokeDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L47)|[**HubAndSpokePolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/hub_and_spoke.py#L50)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/hubandspoke/preview/{id}||[**ConfigurationPolicyHubAndSpokeDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/mesh||[**ConfigurationPolicyMeshDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L19)|[**MeshPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/mesh.py#L27)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/mesh/{id}||[**ConfigurationPolicyMeshDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L23)||None| -PUT /template/policy/definition/mesh/{id}||[**ConfigurationPolicyMeshDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L31)|[**MeshPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/mesh.py#L42)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/mesh||[**ConfigurationPolicyMeshDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L35)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/mesh/{id}||[**ConfigurationPolicyMeshDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L31)|[**MeshPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/mesh.py#L42)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/mesh||[**ConfigurationPolicyMeshDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L35)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/mesh/{id}||[**ConfigurationPolicyMeshDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L39)||[**MeshPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/mesh.py#L46)| -POST /template/policy/definition/mesh/preview||[**ConfigurationPolicyMeshDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L43)|[**MeshPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/mesh.py#L27)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/mesh/preview/{id}||[**ConfigurationPolicyMeshDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L47)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/mesh/preview||[**ConfigurationPolicyMeshDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L43)|[**MeshPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/mesh.py#L27)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/mesh/preview/{id}||[**ConfigurationPolicyMeshDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/mesh.py#L47)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/qosmap||[**ConfigurationPolicyQoSMapDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L19)|[**QoSMapPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/qos_map.py#L71)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/qosmap/{id}||[**ConfigurationPolicyQoSMapDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L23)||None| -PUT /template/policy/definition/qosmap/{id}||[**ConfigurationPolicyQoSMapDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L31)|[**QoSMapPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/qos_map.py#L106)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/qosmap||[**ConfigurationPolicyQoSMapDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L35)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/qosmap/{id}||[**ConfigurationPolicyQoSMapDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L31)|[**QoSMapPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/qos_map.py#L106)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/qosmap||[**ConfigurationPolicyQoSMapDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L35)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/qosmap/{id}||[**ConfigurationPolicyQoSMapDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L39)||[**QoSMapPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/qos_map.py#L110)| -POST /template/policy/definition/qosmap/preview||[**ConfigurationPolicyQoSMapDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L43)|[**QoSMapPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/qos_map.py#L71)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/qosmap/preview/{id}||[**ConfigurationPolicyQoSMapDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L47)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/qosmap/preview||[**ConfigurationPolicyQoSMapDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L43)|[**QoSMapPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/qos_map.py#L71)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/qosmap/preview/{id}||[**ConfigurationPolicyQoSMapDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/qos_map.py#L47)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/rewriterule||[**ConfigurationPolicyRewriteRuleDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L23)|[**RewritePolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rewrite.py#L33)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/rewriterule/{id}||[**ConfigurationPolicyRewriteRuleDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L27)||None| -PUT /template/policy/definition/rewriterule/{id}||[**ConfigurationPolicyRewriteRuleDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L35)|[**RewritePolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rewrite.py#L42)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/rewriterule||[**ConfigurationPolicyRewriteRuleDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/rewriterule/{id}||[**ConfigurationPolicyRewriteRuleDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L35)|[**RewritePolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rewrite.py#L42)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/rewriterule||[**ConfigurationPolicyRewriteRuleDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/rewriterule/{id}||[**ConfigurationPolicyRewriteRuleDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L43)||[**RewritePolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rewrite.py#L46)| -POST /template/policy/definition/rewriterule/preview||[**ConfigurationPolicyRewriteRuleDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L47)|[**RewritePolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rewrite.py#L33)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/rewriterule/preview/{id}||[**ConfigurationPolicyRewriteRuleDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/rewriterule/preview||[**ConfigurationPolicyRewriteRuleDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L47)|[**RewritePolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rewrite.py#L33)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/rewriterule/preview/{id}||[**ConfigurationPolicyRewriteRuleDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rewrite.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/ruleset||[**ConfigurationPolicyRuleSetDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L19)|[**RuleSet**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rule_set.py#L159)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/ruleset/{id}||[**ConfigurationPolicyRuleSetDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L23)||None| -PUT /template/policy/definition/ruleset/{id}||[**ConfigurationPolicyRuleSetDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L31)|[**RuleSetEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rule_set.py#L264)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/ruleset||[**ConfigurationPolicyRuleSetDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L35)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/ruleset/{id}||[**ConfigurationPolicyRuleSetDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L31)|[**RuleSetEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rule_set.py#L264)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/ruleset||[**ConfigurationPolicyRuleSetDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L35)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/ruleset/{id}||[**ConfigurationPolicyRuleSetDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L39)||[**RuleSetGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rule_set.py#L268)| -POST /template/policy/definition/ruleset/preview||[**ConfigurationPolicyRuleSetDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L43)|[**RuleSet**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rule_set.py#L159)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/ruleset/preview/{id}||[**ConfigurationPolicyRuleSetDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L47)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/ruleset/preview||[**ConfigurationPolicyRuleSetDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L43)|[**RuleSet**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/rule_set.py#L159)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/ruleset/preview/{id}||[**ConfigurationPolicyRuleSetDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/rule_set.py#L47)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/securitygroup||[**ConfigurationPolicySecurityGroupDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L23)|[**SecurityGroup**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/security_group.py#L59)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/securitygroup/{id}||[**ConfigurationPolicySecurityGroupDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L27)||None| -PUT /template/policy/definition/securitygroup/{id}||[**ConfigurationPolicySecurityGroupDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L35)|[**SecurityGroupEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/security_group.py#L76)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/securitygroup||[**ConfigurationPolicySecurityGroupDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/securitygroup/{id}||[**ConfigurationPolicySecurityGroupDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L35)|[**SecurityGroupEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/security_group.py#L76)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/securitygroup||[**ConfigurationPolicySecurityGroupDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/securitygroup/{id}||[**ConfigurationPolicySecurityGroupDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L43)||[**SecurityGroupGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/security_group.py#L80)| -POST /template/policy/definition/securitygroup/preview||[**ConfigurationPolicySecurityGroupDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L47)|[**SecurityGroup**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/security_group.py#L59)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/securitygroup/preview/{id}||[**ConfigurationPolicySecurityGroupDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/securitygroup/preview||[**ConfigurationPolicySecurityGroupDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L47)|[**SecurityGroup**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/security_group.py#L59)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/securitygroup/preview/{id}||[**ConfigurationPolicySecurityGroupDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/security_group.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/data||[**ConfigurationPolicyDataDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L24)|[**TrafficDataPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/traffic_data.py#L367)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/data/{id}||[**ConfigurationPolicyDataDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L28)||None| -PUT /template/policy/definition/data/{id}||[**ConfigurationPolicyDataDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L36)|[**TrafficDataPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/traffic_data.py#L388)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/data||[**ConfigurationPolicyDataDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L40)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/data/{id}||[**ConfigurationPolicyDataDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L36)|[**TrafficDataPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/traffic_data.py#L388)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/data||[**ConfigurationPolicyDataDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L40)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/data/{id}||[**ConfigurationPolicyDataDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L44)||[**TrafficDataPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/traffic_data.py#L392)| -POST /template/policy/definition/data/preview||[**ConfigurationPolicyDataDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L48)|[**TrafficDataPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/traffic_data.py#L367)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/data/preview/{id}||[**ConfigurationPolicyDataDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L52)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/data/preview||[**ConfigurationPolicyDataDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L48)|[**TrafficDataPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/traffic_data.py#L367)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/data/preview/{id}||[**ConfigurationPolicyDataDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/traffic_data.py#L52)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/vpnmembershipgroup||[**ConfigurationPolicyVPNMembershipGroupDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L23)|[**VPNMembershipPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/vpn_membership.py#L26)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/vpnmembershipgroup/{id}||[**ConfigurationPolicyVPNMembershipGroupDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L27)||None| -PUT /template/policy/definition/vpnmembershipgroup/{id}||[**ConfigurationPolicyVPNMembershipGroupDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L35)|[**VPNMembershipPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/vpn_membership.py#L37)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/vpnmembershipgroup||[**ConfigurationPolicyVPNMembershipGroupDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/vpnmembershipgroup/{id}||[**ConfigurationPolicyVPNMembershipGroupDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L35)|[**VPNMembershipPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/vpn_membership.py#L37)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/vpnmembershipgroup||[**ConfigurationPolicyVPNMembershipGroupDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/vpnmembershipgroup/{id}||[**ConfigurationPolicyVPNMembershipGroupDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L43)||[**VPNMembershipPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/vpn_membership.py#L41)| -POST /template/policy/definition/vpnmembershipgroup/preview||[**ConfigurationPolicyVPNMembershipGroupDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L47)|[**VPNMembershipPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/vpn_membership.py#L26)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/vpnmembershipgroup/preview/{id}||[**ConfigurationPolicyVPNMembershipGroupDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/vpnmembershipgroup/preview||[**ConfigurationPolicyVPNMembershipGroupDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L47)|[**VPNMembershipPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/vpn_membership.py#L26)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/vpnmembershipgroup/preview/{id}||[**ConfigurationPolicyVPNMembershipGroupDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/definition/zonebasedfw||[**ConfigurationPolicyZoneBasedFirewallDefinition.create_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L23)|[**ZoneBasedFWPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/zone_based_firewall.py#L223)|[**PolicyDefinitionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1163)| DELETE /template/policy/definition/zonebasedfw/{id}||[**ConfigurationPolicyZoneBasedFirewallDefinition.delete_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L27)||None| -PUT /template/policy/definition/zonebasedfw/{id}||[**ConfigurationPolicyZoneBasedFirewallDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L35)|[**ZoneBasedFWPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/zone_based_firewall.py#L274)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1250)| -GET /template/policy/definition/zonebasedfw||[**ConfigurationPolicyZoneBasedFirewallDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1237)]| +PUT /template/policy/definition/zonebasedfw/{id}||[**ConfigurationPolicyZoneBasedFirewallDefinition.edit_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L35)|[**ZoneBasedFWPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/zone_based_firewall.py#L274)|[**PolicyDefinitionEditResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1251)| +GET /template/policy/definition/zonebasedfw||[**ConfigurationPolicyZoneBasedFirewallDefinition.get_definitions**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L39)||DataSequence[[**PolicyDefinitionInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1238)]| GET /template/policy/definition/zonebasedfw/{id}||[**ConfigurationPolicyZoneBasedFirewallDefinition.get_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L43)||[**ZoneBasedFWPolicyGetResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/zone_based_firewall.py#L278)| -POST /template/policy/definition/zonebasedfw/preview||[**ConfigurationPolicyZoneBasedFirewallDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L47)|[**ZoneBasedFWPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/zone_based_firewall.py#L223)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| -GET /template/policy/definition/zonebasedfw/preview/{id}||[**ConfigurationPolicyZoneBasedFirewallDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1256)| +POST /template/policy/definition/zonebasedfw/preview||[**ConfigurationPolicyZoneBasedFirewallDefinition.preview_policy_definition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L47)|[**ZoneBasedFWPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/definition/zone_based_firewall.py#L223)|[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| +GET /template/policy/definition/zonebasedfw/preview/{id}||[**ConfigurationPolicyZoneBasedFirewallDefinition.preview_policy_definition_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py#L51)||[**PolicyDefinitionPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_definition.py#L1257)| POST /template/policy/list/app||[**ConfigurationPolicyApplicationList.create_policy_list**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/list/app.py#L14)|[**AppList**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/list/app.py#L21)|[**PolicyListId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy_list.py#L30)| DELETE /template/policy/list/app/{id}||[**ConfigurationPolicyApplicationList.delete_policy_list**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/list/app.py#L18)||None| DELETE /template/policy/list/app||[**ConfigurationPolicyApplicationList.delete_policy_lists_with_info_tag**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/list/app.py#L22)||None| @@ -523,16 +523,16 @@ GET /template/policy/vedge||[**ConfigurationVEdgeTemplatePolicy.generate_policy_ GET /template/policy/vedge/devices/{id}||[**ConfigurationVEdgeTemplatePolicy.get_device_list_by_policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vedge_template.py#L38)||DataSequence[[**LocalizedPolicyDeviceInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/localized.py#L146)]| GET /template/policy/vedge/devices||[**ConfigurationVEdgeTemplatePolicy.get_vedge_policy_device_list**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vedge_template.py#L42)||DataSequence[[**LocalizedPolicyDeviceInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/localized.py#L146)]| GET /template/policy/vedge/definition/{id}||[**ConfigurationVEdgeTemplatePolicy.get_vedge_template**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vedge_template.py#L46)||[**LocalizedPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/localized.py#L80)| -GET /template/policy/assembly/vedge/{id}||[**ConfigurationVEdgeTemplatePolicy.preview_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vedge_template.py#L50)||[**PolicyPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy.py#L100)| +GET /template/policy/assembly/vedge/{id}||[**ConfigurationVEdgeTemplatePolicy.preview_by_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vedge_template.py#L50)||[**PolicyPreview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy.py#L101)| POST /template/policy/vsmart/activate/{id}||[**ConfigurationVSmartTemplatePolicy.activate_policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L33)|None|[**ActivateDeactivateTaskId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L28)| GET /template/policy/vsmart/connectivity/status||[**ConfigurationVSmartTemplatePolicy.check_vsmart_connectivity_status**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L43)||DataSequence[[**VSmartConnectivityStatus**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L15)]| -POST /template/policy/vsmart||[**ConfigurationVSmartTemplatePolicy.create_vsmart_template**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L47)|[**CentralizedPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L203)|[**PolicyId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy.py#L12)| +POST /template/policy/vsmart||[**ConfigurationVSmartTemplatePolicy.create_vsmart_template**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L47)|[**CentralizedPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L204)|[**PolicyId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/policy.py#L12)| POST /template/policy/vsmart/deactivate/{id}||[**ConfigurationVSmartTemplatePolicy.deactivate_policy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L51)|None|[**ActivateDeactivateTaskId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L28)| DELETE /template/policy/vsmart/{id}||[**ConfigurationVSmartTemplatePolicy.delete_vsmart_template**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L57)||None| PUT /template/policy/vsmart/central/{id}||[**ConfigurationVSmartTemplatePolicy.edit_template_without_lock_checks**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L61)|[**CentralizedPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L249)|None| PUT /template/policy/vsmart/{id}||[**ConfigurationVSmartTemplatePolicy.edit_vsmart_template**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L65)|[**CentralizedPolicyEditPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L249)|None| GET /template/policy/vsmart||[**ConfigurationVSmartTemplatePolicy.generate_vsmart_policy_template_list**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L69)||DataSequence[[**CentralizedPolicyInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L253)]| -GET /template/policy/vsmart/definition/{id}||[**ConfigurationVSmartTemplatePolicy.get_template_by_policy_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L73)||[**CentralizedPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L203)| +GET /template/policy/vsmart/definition/{id}||[**ConfigurationVSmartTemplatePolicy.get_template_by_policy_id**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy/vsmart_template.py#L73)||[**CentralizedPolicy**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/policy/centralized.py#L204)| POST /v1/policy-group|>=20.12|[**PolicyGroupEndpoints.create_policy_group**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy_group.py#L12)|[**PolicyGroup**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/policy_group.py#L22)|[**PolicyGroupId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/policy_group.py#L43)| GET /v1/policy-group|>=20.12|[**PolicyGroupEndpoints.get_all**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy_group.py#L17)||DataSequence[[**PolicyGroupId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/policy_group.py#L43)]| DELETE /v1/policy-group/{group_id}|>=20.12|[**PolicyGroupEndpoints.delete**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/policy_group.py#L22)||None| @@ -550,30 +550,33 @@ GET /v1/topology-group|>=20.12|[**TopologyGroupEndpoints.get_all**](https://gith DELETE /v1/topology-group/{group_id}|>=20.12|[**TopologyGroupEndpoints.delete**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration/topology_group.py#L22)||None| GET /device/action/status/{task_id}||[**ConfigurationDashboardStatus.find_status**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_dashboard_status.py#L121)||[**TaskData**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_dashboard_status.py#L100)| GET /device/action/status/tasks||[**ConfigurationDashboardStatus.find_running_tasks**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_dashboard_status.py#L125)||[**TasksData**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_dashboard_status.py#L113)| -GET /device/action/install/devices/{device_type}||[**ConfigurationDeviceActions.get_list_of_installed_devices**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L182)||DataSequence[[**InstalledDeviceData**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L118)]| -GET /device/action/ztp/upgrade/setting||[**ConfigurationDeviceActions.get_ztp_upgrade_config_setting**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L216)||DataSequence[[**ZTPUpgradeSettings**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L33)]| -POST /device/action/changepartition||[**ConfigurationDeviceActions.process_mark_change_partition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L232)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L61)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L25)| -POST /device/action/defaultpartition||[**ConfigurationDeviceActions.process_mark_default_partition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L240)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L61)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L25)| -POST /device/action/install||[**ConfigurationDeviceActions.process_install_operation**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L248)|[**InstallActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L109)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L25)| -POST /device/action/removepartition||[**ConfigurationDeviceActions.process_remove_partition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L280)|[**RemovePartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L69)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L25)| +GET /device/action/install/devices/{device_type}||[**ConfigurationDeviceActions.get_list_of_installed_devices**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L246)||DataSequence[[**InstalledDeviceData**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L182)]| +GET /device/action/ztp/upgrade/setting||[**ConfigurationDeviceActions.get_ztp_upgrade_config_setting**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L280)||DataSequence[[**ZTPUpgradeSettings**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L34)]| +POST /device/action/changepartition||[**ConfigurationDeviceActions.process_mark_change_partition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L296)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L92)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| +POST /device/action/defaultpartition||[**ConfigurationDeviceActions.process_mark_default_partition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L304)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L92)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| +POST /device/action/install||[**ConfigurationDeviceActions.process_install_operation**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L312)|[**InstallActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L173)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| +POST /device/action/lxcactivate||[**ConfigurationDeviceActions.process_lxc_activate**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L316)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L92)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| +POST /device/action/lxcdelete||[**ConfigurationDeviceActions.process_lxc_delete**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L321)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L92)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| +POST /device/action/lxcupgrade||[**ConfigurationDeviceActions.process_lxc_upgrade**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L338)|[**PartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L92)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| +POST /device/action/removepartition||[**ConfigurationDeviceActions.process_remove_partition**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L347)|[**RemovePartitionActionPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L133)|[**ActionId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_actions.py#L26)| POST /template/device/config/config/||[**ConfigurationDeviceTemplate.get_device_configuration_preview**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_template.py#L22)|[**FeatureToCLIPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_device_template.py#L12)|str|PROVIDER GET /v1/feature-profile/sdwan/system/aaa/schema|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_system_aaa_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L38)||None| GET /v1/feature-profile/sdwan/transport/cellular-controller/schema|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_transport_cellular_controller_parcel_schema**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L43)||None| -GET /v1/feature-profile/sdwan/transport|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_transport_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L48)|Optional[[**GetFeatureProfilesPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L32)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -POST /v1/feature-profile/sdwan/transport|>=20.9|[**ConfigurationFeatureProfile.create_sdwan_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L55)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +GET /v1/feature-profile/sdwan/transport|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_transport_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L48)|Optional[[**GetFeatureProfilesPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L32)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +POST /v1/feature-profile/sdwan/transport|>=20.9|[**ConfigurationFeatureProfile.create_sdwan_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L55)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/transport/{transport_id}|>=20.9|[**ConfigurationFeatureProfile.delete_sdwan_transport_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L62)||None| -GET /v1/feature-profile/sdwan/system|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_system_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L67)|Optional[[**GetFeatureProfilesPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L32)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -POST /v1/feature-profile/sdwan/system|>=20.9|[**ConfigurationFeatureProfile.create_sdwan_system_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L74)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| +GET /v1/feature-profile/sdwan/system|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_system_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L67)|Optional[[**GetFeatureProfilesPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L32)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +POST /v1/feature-profile/sdwan/system|>=20.9|[**ConfigurationFeatureProfile.create_sdwan_system_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L74)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| DELETE /v1/feature-profile/sdwan/system/{system_id}|>=20.9|[**ConfigurationFeatureProfile.delete_sdwan_system_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L81)||None| -POST /v1/feature-profile/sdwan/system/{system_id}/aaa|>=20.9|[**ConfigurationFeatureProfile.create_aaa_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L86)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -POST /v1/feature-profile/sdwan/transport/{transport_id}/cellular-controller|>=20.9|[**ConfigurationFeatureProfile.create_cellular_controller_profile_parcel_for_transport**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L91)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| -GET /v1/feature-profile/sdwan|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L98)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| -POST /v1/feature-profile/sd-routing/cli|>=20.12|[**SDRoutingConfigurationFeatureProfile.create_cli_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L105)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L89)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L100)| -POST /v1/feature-profile/sd-routing/cli/{cli_fp_id}/full-config|>=20.12|[**SDRoutingConfigurationFeatureProfile.create_cli_full_config_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L110)|[**FullConfigParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/feature_profile_parcel.py#L12)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L185)| +POST /v1/feature-profile/sdwan/system/{system_id}/aaa|>=20.9|[**ConfigurationFeatureProfile.create_aaa_profile_parcel_for_system**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L86)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +POST /v1/feature-profile/sdwan/transport/{transport_id}/cellular-controller|>=20.9|[**ConfigurationFeatureProfile.create_cellular_controller_profile_parcel_for_transport**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L91)|[**_ParcelBase**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/api/configuration_groups/parcel.py#L23)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| +GET /v1/feature-profile/sdwan|>=20.9|[**ConfigurationFeatureProfile.get_sdwan_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L98)||DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| +POST /v1/feature-profile/sd-routing/cli|>=20.12|[**SDRoutingConfigurationFeatureProfile.create_cli_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L105)|[**FeatureProfileCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L90)|[**FeatureProfileCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L101)| +POST /v1/feature-profile/sd-routing/cli/{cli_fp_id}/full-config|>=20.12|[**SDRoutingConfigurationFeatureProfile.create_cli_full_config_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L110)|[**FullConfigParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/feature_profile_parcel.py#L12)|[**ParcelId**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/parcel.py#L184)| DELETE /v1/feature-profile/sd-routing/cli/{cli_fp_id}|>=20.12|[**SDRoutingConfigurationFeatureProfile.delete_cli_feature_profile**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L115)||None| DELETE /v1/feature-profile/sd-routing/cli/{cli_fp_id}/full-config/{parcel_id}|>=20.12|[**SDRoutingConfigurationFeatureProfile.delete_cli_full_config_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L120)||None| PUT /v1/feature-profile/sd-routing/cli/{cli_fp_id}/full-config/{parcel_id}|>=20.12|[**SDRoutingConfigurationFeatureProfile.edit_cli_full_config_parcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L125)|[**FullConfigParcel**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/feature_profile_parcel.py#L12)|None| -GET /v1/feature-profile/sd-routing/cli|>=20.12|[**SDRoutingConfigurationFeatureProfile.get_cli_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L130)|Optional[[**GetFeatureProfilesPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L32)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L56)]| +GET /v1/feature-profile/sd-routing/cli|>=20.12|[**SDRoutingConfigurationFeatureProfile.get_cli_feature_profiles**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L130)|Optional[[**GetFeatureProfilesPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_feature_profile.py#L32)]|DataSequence[[**FeatureProfileInfo**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/models/configuration/feature_profile/common.py#L57)]| PUT /v1/config-group/{config_group_id}/device/associate|>=20.9|[**ConfigurationGroup.associate**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L150)|[**ConfigGroupAssociatePayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L82)|None| POST /v1/config-group|>=20.9|[**ConfigurationGroup.create_config_group**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L155)|[**ConfigGroupCreationPayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L21)|[**ConfigGroupCreationResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L136)| POST /v1/config-group/{config_group_id}/device/variables|>=20.9|[**ConfigurationGroup.create_variables**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L160)|[**ConfigGroupVariablesCreatePayload**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L86)|[**ConfigGroupVariablesCreateResponse**](https://github.com/cisco-open/cisco-catalyst-wan-sdk/blob/main/catalystwan/endpoints/configuration_group.py#L113)| diff --git a/README.md b/README.md index 25e71ca4..b8d5d1d6 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ alarms_from_n_hours = session.api.alarms.get(from_time=n) To get all critical alarms from past `n` hours: ```python +from catalystwan.utils.alarm_status import Severity n = 48 critical_alarms = session.api.alarms.get(from_time=n).filter(severity=Severity.CRITICAL) ``` @@ -196,6 +197,7 @@ critical_alarms = session.api.alarms.get(from_time=n).filter(severity=Severity.C session.api.users.get() # Create user +from catalystwan.endpoints.administration_user_and_group import User new_user = User(username="new_user", password="new_user", group=["netadmin"], description="new user") session.api.users.create(new_user) diff --git a/catalystwan/abstractions.py b/catalystwan/abstractions.py index aa8680e1..027d0297 100644 --- a/catalystwan/abstractions.py +++ b/catalystwan/abstractions.py @@ -54,5 +54,5 @@ def session_type(self) -> Optional[SessionType]: ... @property - def validate_response(self) -> bool: + def validate_responses(self) -> bool: ... diff --git a/catalystwan/api/alarms_api.py b/catalystwan/api/alarms_api.py index d461c22c..bd4cf93a 100644 --- a/catalystwan/api/alarms_api.py +++ b/catalystwan/api/alarms_api.py @@ -53,7 +53,12 @@ def get(self, from_time: Optional[int] = None) -> DataSequence[AlarmData]: >>> alarms = AlarmsAPI(session).get() >>> critical_alarms = alarms.filter(severity=Severity.CRITICAL) """ - query: Dict[str, Any] = {"query": {"condition": "AND", "rules": []}} + query: Dict[str, Any] = { + "query": { + "condition": "AND", + "rules": [{"field": "active", "type": "boolean", "value": ["true"], "operator": "equal"}], + } + } if from_time: query["query"]["rules"].append( { diff --git a/catalystwan/api/api_container.py b/catalystwan/api/api_container.py index cbe722b5..c85cd4d2 100644 --- a/catalystwan/api/api_container.py +++ b/catalystwan/api/api_container.py @@ -33,6 +33,7 @@ from catalystwan.api.tenant_management_api import TenantManagementAPI from catalystwan.api.tenant_migration_api import TenantMigrationAPI from catalystwan.api.versions_utils import RepositoryAPI +from catalystwan.api.virtual_image_action_api import LxcActionAPI if TYPE_CHECKING: from catalystwan.session import ManagerSession @@ -59,6 +60,7 @@ def __init__(self, session: ManagerSession): self.repository = RepositoryAPI(session) self.resource_pool = ResourcePoolAPI(session) self.software = SoftwareActionAPI(session) + self.lxcsoftware = LxcActionAPI(session) self.partition = PartitionManagerAPI(session) self.users = UsersAPI(session) self.cluster_management = ClusterManagementAPI(session) diff --git a/catalystwan/api/configuration_groups/parcel.py b/catalystwan/api/configuration_groups/parcel.py index fbcded41..6e9df287 100644 --- a/catalystwan/api/configuration_groups/parcel.py +++ b/catalystwan/api/configuration_groups/parcel.py @@ -37,6 +37,7 @@ class _ParcelBase(BaseModel): validation_alias="description", description="Set the parcel description", ) + data: Optional[Any] = None _parcel_data_key: str = PrivateAttr(default="data") @model_serializer(mode="wrap") @@ -86,7 +87,7 @@ class OptionType(str, Enum): class ParcelAttribute(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) + model_config = ConfigDict(extra="forbid") option_type: OptionType = Field(serialization_alias="optionType", validation_alias="optionType") diff --git a/catalystwan/api/versions_utils.py b/catalystwan/api/versions_utils.py index e4107dec..eeb57099 100644 --- a/catalystwan/api/versions_utils.py +++ b/catalystwan/api/versions_utils.py @@ -9,7 +9,12 @@ from pydantic import BaseModel, ConfigDict, Field from catalystwan.endpoints.configuration.software_actions import SoftwareImageDetails -from catalystwan.endpoints.configuration_device_actions import PartitionDevice +from catalystwan.endpoints.configuration_device_actions import ( + InstallLxcImage, + LxcActivateDevice, + LxcUpgradeDevice, + PartitionDevice, +) from catalystwan.endpoints.configuration_device_inventory import DeviceDetailsResponse from catalystwan.exceptions import ImageNotInRepositoryError from catalystwan.typed_list import DataSequence @@ -67,6 +72,18 @@ def get_all_software_images(self) -> DataSequence[SoftwareImageDetails]: software_images = self.session.endpoints.configuration_software_actions.get_list_of_all_images() return software_images + def get_all_virtual_images(self) -> DataSequence[SoftwareImageDetails]: + """ + Get all info about all software images stored in Vmanage repository + + Returns: + list: software images list + """ + software_images = self.session.endpoints.configuration_software_actions.get_list_of_all_images( + "imageType=virtualmachine" + ) + return software_images + def get_devices_versions_repository(self) -> Dict[str, DeviceSoftwareRepository]: """ Create DeviceSoftwareRepository dataclass, @@ -209,6 +226,54 @@ def _validate_devices_required_fields(self, devices: DataSequence[DeviceDetailsR f"device.device_ip (current value: {device.device_ip})" ) + def get_lxcactivate_device_list( + self, + version_to_set_up: str, + devices: DataSequence[DeviceDetailsResponse], + ) -> DataSequence[LxcActivateDevice]: + self._validate_devices_required_fields(devices) + install_image_payload = [ + InstallLxcImage( + network_function_type="app-hosting", + version_name=version_to_set_up, + version_type_name="UTD-Snort-Feature", + ) + ] + devices_payload = DataSequence( + LxcActivateDevice, + [ + LxcActivateDevice( + device_id=str(device.uuid), + device_ip=str(device.local_system_ip), + install_images=install_image_payload, + ) + for device in devices + ], # type: ignore + ) + + return devices_payload + + def get_lxcupgrade_device_list( + self, + version_to_set_up: str, + devices: DataSequence[DeviceDetailsResponse], + ) -> DataSequence[LxcUpgradeDevice]: + self._validate_devices_required_fields(devices) + install_image_payload = [InstallLxcImage(version_name=version_to_set_up)] + devices_payload = DataSequence( + LxcUpgradeDevice, + [ + LxcUpgradeDevice( + device_id=str(device.uuid), + device_ip=str(device.local_system_ip), + install_images=install_image_payload, + ) + for device in devices + ], # type: ignore + ) + + return devices_payload + def _get_device_list_in( self, version_to_set_up: str, devices: DataSequence[DeviceDetailsResponse], version_type: str ) -> DataSequence[PartitionDevice]: @@ -227,8 +292,10 @@ def _get_device_list_in( self._validate_devices_required_fields(devices) devices_payload = DataSequence( PartitionDevice, - [PartitionDevice(device_id=device.uuid, device_ip=device.device_ip) for device in devices], # type: ignore + [PartitionDevice(device_id=str(device.uuid), device_ip=str(device.local_system_ip)) for device in devices], + # type: ignore ) + all_dev_versions = self.repository.get_devices_versions_repository() for device in devices_payload: device_versions = getattr(all_dev_versions[device.device_id], version_type) @@ -295,9 +362,10 @@ def _get_devices_chosen_version( devices_payload = DataSequence( PartitionDevice, - [PartitionDevice( - device_id=device.uuid, device_ip=device.local_system_ip # type: ignore - ) for device in devices], # type: ignore + [ + PartitionDevice(device_id=device.uuid, device_ip=device.local_system_ip) # type: ignore + for device in devices + ], # type: ignore ) all_dev_versions = self.repository.get_devices_versions_repository() for device in devices_payload: diff --git a/catalystwan/api/virtual_image_action_api.py b/catalystwan/api/virtual_image_action_api.py new file mode 100644 index 00000000..3a6a52d8 --- /dev/null +++ b/catalystwan/api/virtual_image_action_api.py @@ -0,0 +1,200 @@ +# Copyright 2023 Cisco Systems, Inc. and its affiliates + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Optional, cast + +from catalystwan.api.task_status_api import Task +from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI +from catalystwan.endpoints.configuration_device_actions import ( + LxcImageActivatePayload, + LxcImageDeletePayload, + LxcImageUpgradePayload, + LxcInstallInput, +) +from catalystwan.endpoints.configuration_device_inventory import DeviceDetailsResponse +from catalystwan.exceptions import EmptyVersionPayloadError, ImageNotInRepositoryError # type: ignore +from catalystwan.typed_list import DataSequence +from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity + +logger = logging.getLogger(__name__) + + +if TYPE_CHECKING: + from catalystwan.session import ManagerSession + + +class LxcActionAPI: + """ + API methods for virtual software actions. All methods + are executable on all device categories. + + Usage example: + # Create session + session = create_manager_session(...) + + # Prepare specific device for Lxc image actions + all_dev = session.api.devices.get() + dev = all_dev.filter(hostname="pm1044") + ver = "1.0.0_SV3.1.67.0_XE17.14" + + # Upgrade + del_id = session.api.lxcsoftware.lxcdelete(dev,ver) + up_id = session.api.lxcsoftware.lxcupgrade(dev,ver) + act_id = session.api.lxcsoftware.lxcactivate(dev,ver) + + # Check upgrade status + TaskAPI(session, software_action_id).wait_for_completed() + """ + + def __init__(self, session: ManagerSession) -> None: + self.session = session + self.repository = RepositoryAPI(self.session) + self.device_versions = DeviceVersions(self.session) + + def lxcactivate( + self, + devices: DataSequence[DeviceDetailsResponse], + version_to_activate: str, + ) -> Task: + """ + Requires that selected devices have already version_to_activate installed(upgraded) + + Args: + devices (List[DeviceDetailsResponse]): For those devices software will be activated + version_to_activate (Optional[str]): version to be set as current version + + Notice: Have to pass one of those arguments (version_to_activate, image) + + Raises: + EmptyVersionPayloadError: If selected version_to_activate or image not detected in available files + + Returns: + str: Activate software action id + """ + validate_personality_homogeneity(devices) + version = cast(str, version_to_activate) + + if not version: + raise ImageNotInRepositoryError( + "Based on provided arguments, virtual software version to activate on device(s) cannot be detected." + ) + + payload_devices = self.device_versions.get_lxcactivate_device_list(version, devices) + for device in payload_devices: + if not device.install_images[0].version_name: + raise EmptyVersionPayloadError("lxc activate payload contains entry with empty version field.") + + device_type = get_install_specification(devices.first()).device_type.value + install_input = LxcInstallInput(v_edge_vpn="0", version_type="vmanage") + partition_payload = LxcImageActivatePayload( + action="lxc_activate", + devices=[dev for dev in payload_devices], + device_type=device_type, + input=install_input, + ) + + partition_action = self.session.endpoints.configuration_device_actions.process_lxc_activate( + payload=partition_payload + ) + + return Task(self.session, partition_action.id) + + def lxcupgrade( + self, + devices: DataSequence[DeviceDetailsResponse], + version_to_upgrade: Optional[str] = "", + image: Optional[str] = "", + ) -> Task: + """ + Requires that selected devices have already version_to_upgrade + + Args: + devices (List[DeviceDetailsResponse]): For those devices software will be activated + version_to_upgrade (Optional[str]): version to be set as current version + image (Optional[str]): software image name in available files + + Notice: Have to pass one of those arguments (version_to_activate, image) + + Raises: + EmptyVersionPayloadError: If selected version_to_activate or image not detected in available files + + Returns: + str: Activate software action id + """ + validate_personality_homogeneity(devices) + if image and not version_to_upgrade: + version = cast(str, self.repository.get_image_version(image)) + elif version_to_upgrade and not image: + version = cast(str, version_to_upgrade) + else: + raise ValueError("You can not provide software_image and image version at the same time!") + + if not version: + raise ImageNotInRepositoryError( + "Based on provided arguments, virtual software version to activate on device(s) cannot be detected." + ) + + payload_devices = self.device_versions.get_lxcupgrade_device_list(version, devices) + for device in payload_devices: + if not device.install_images[0].version_name: + raise EmptyVersionPayloadError("lxc upgrade payload contains entry with empty version field.") + + device_type = get_install_specification(devices.first()).device_type.value + install_input = LxcInstallInput(v_edge_vpn="0", version_type="vmanage") + partition_payload = LxcImageUpgradePayload( + action="lxc_upgrade", devices=[dev for dev in payload_devices], device_type=device_type, input=install_input + ) + + partition_action = self.session.endpoints.configuration_device_actions.process_lxc_upgrade( + payload=partition_payload + ) + + return Task(self.session, partition_action.id) + + def lxcdelete( + self, + devices: DataSequence[DeviceDetailsResponse], + version_to_delete: str, + ) -> Task: + """ + Requires that selected devices have already version_to_delete + + Args: + devices (List[DeviceDetailsResponse]): For those devices lxc software will be deleted + version_to_delete (Optional[str]): version to delete + + Notice: Have to pass one of those arguments (version_to_delete) + + Raises: + EmptyVersionPayloadError: If selected version_to_activate or image not detected in available files + + Returns: + str: Delete software action id + """ + validate_personality_homogeneity(devices) + version = cast(str, version_to_delete) + + if not version: + raise ImageNotInRepositoryError( + "Based on provided arguments, virtual software version to delete on device(s) cannot be detected." + ) + + payload_devices = self.device_versions.get_lxcupgrade_device_list(version, devices) + for device in payload_devices: + if not device.install_images[0].version_name: + raise EmptyVersionPayloadError("lxc device payload contains entry with empty version field.") + + device_type = get_install_specification(devices.first()).device_type.value + partition_payload = LxcImageDeletePayload( + action="lxc_delete", + devices=[dev for dev in payload_devices], + device_type=device_type, + ) + + partition_action = self.session.endpoints.configuration_device_actions.process_lxc_delete( + payload=partition_payload + ) + + return Task(self.session, partition_action.id) diff --git a/catalystwan/endpoints/__init__.py b/catalystwan/endpoints/__init__.py index 47c23581..63765729 100644 --- a/catalystwan/endpoints/__init__.py +++ b/catalystwan/endpoints/__init__.py @@ -569,11 +569,11 @@ def wrapper(*args, **kwargs): return response.dataseq( cls=self.return_spec.payload_type, sourcekey=self.resp_json_key, - validate=_self._client.validate_response, + validate=_self._client.validate_responses, ) else: return response.dataobj( - self.return_spec.payload_type, self.resp_json_key, validate=_self._client.validate_response + self.return_spec.payload_type, self.resp_json_key, validate=_self._client.validate_responses ) elif issubclass(self.return_spec.payload_type, str): return response.text diff --git a/catalystwan/endpoints/configuration_device_actions.py b/catalystwan/endpoints/configuration_device_actions.py index e5aeb336..6342cf9c 100644 --- a/catalystwan/endpoints/configuration_device_actions.py +++ b/catalystwan/endpoints/configuration_device_actions.py @@ -20,6 +20,7 @@ def convert_to_list(element: Union[str, List[str]]) -> List[str]: VersionType = Literal["vmanage", "remote"] PartitionActionType = Literal["removepartition", "defaultpartition", "changepartition"] +LxcActionType = Literal["lxc_activate", "lxc_upgrade", "lxc_delete"] class ActionId(BaseModel): @@ -50,6 +51,36 @@ class PartitionDevice(BaseModel): VersionList = Annotated[Union[str, List[str]], BeforeValidator(convert_to_list)] +class InstallLxcImage(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + network_function_type: str = Field( + default="app-hosting", serialization_alias="networkFunctionType", validation_alias="networkFunctionType" + ) + version_name: str = Field(serialization_alias="versionName", validation_alias="versionName") + version_type_name: str = Field( + default="UTD-Snort-Feature", serialization_alias="versionTypeName", validation_alias="versionTypeName" + ) + + +class LxcActivateDevice(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + device_id: str = Field(serialization_alias="deviceId", validation_alias="deviceId") + device_ip: str = Field(serialization_alias="deviceIP", validation_alias="deviceIP") + install_images: List[InstallLxcImage] = Field(serialization_alias="installImages", validation_alias="installImages") + vedge_vpn: str = Field(default="0", serialization_alias="vEdgeVPN", validation_alias="vEdgeVPN") + version_type: str = Field(default="vmanage", serialization_alias="versionType", validation_alias="versionType") + + +class LxcUpgradeDevice(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + device_id: str = Field(serialization_alias="deviceId", validation_alias="deviceId") + device_ip: str = Field(serialization_alias="deviceIP", validation_alias="deviceIP") + install_images: List[InstallLxcImage] = Field(serialization_alias="installImages", validation_alias="installImages") + + class RemovePartitionDevice(BaseModel): model_config = ConfigDict(populate_by_name=True) @@ -66,6 +97,39 @@ class PartitionActionPayload(BaseModel): devices: List[PartitionDevice] +class LxcInstallInput(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + v_edge_vpn: str = Field(serialization_alias="vEdgeVPN", validation_alias="vEdgeVPN") + version_type: VersionType = Field(serialization_alias="versionType", validation_alias="versionType") + + +class LxcImageActivatePayload(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + action: LxcActionType + device_type: str = Field(serialization_alias="deviceType", validation_alias="deviceType") + devices: List[LxcActivateDevice] + input: LxcInstallInput + + +class LxcImageUpgradePayload(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + action: LxcActionType + device_type: str = Field(serialization_alias="deviceType", validation_alias="deviceType") + devices: List[LxcUpgradeDevice] + input: LxcInstallInput + + +class LxcImageDeletePayload(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + action: LxcActionType + device_type: str = Field(serialization_alias="deviceType", validation_alias="deviceType") + devices: List[LxcUpgradeDevice] + + class RemovePartitionActionPayload(BaseModel): model_config = ConfigDict(populate_by_name=True) @@ -249,11 +313,13 @@ def process_delete_amp_api_key(self): def process_install_operation(self, payload: InstallActionPayload) -> ActionId: ... - def process_lxc_activate(self): + @post("/device/action/lxcactivate") + def process_lxc_activate(self, payload: PartitionActionPayload) -> ActionId: # POST /device/action/lxcactivate ... - def process_lxc_delete(self): + @post("/device/action/lxcdelete") + def process_lxc_delete(self, payload: PartitionActionPayload) -> ActionId: # POST /device/action/lxcdelete ... @@ -269,7 +335,8 @@ def process_lxc_reset(self): # POST /device/action/lxcreset ... - def process_lxc_upgrade(self): + @post("/device/action/lxcupgrade") + def process_lxc_upgrade(self, payload: PartitionActionPayload) -> ActionId: # POST /device/action/lxcupgrade ... diff --git a/catalystwan/endpoints/monitoring/security_policy.py b/catalystwan/endpoints/monitoring/security_policy.py new file mode 100644 index 00000000..9f529101 --- /dev/null +++ b/catalystwan/endpoints/monitoring/security_policy.py @@ -0,0 +1,12 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates + +# mypy: disable-error-code="empty-body" + +from catalystwan.endpoints import APIEndpoints, get +from catalystwan.models.monitoring.security_policy import SecurityPolicyDeviceList + + +class MonitoringSecurityPolicy(APIEndpoints): + @get("/security/policy/devicelist", "data") + def get_device_list(self) -> SecurityPolicyDeviceList: + ... diff --git a/catalystwan/endpoints/url_monitoring.py b/catalystwan/endpoints/url_monitoring.py new file mode 100644 index 00000000..b3766815 --- /dev/null +++ b/catalystwan/endpoints/url_monitoring.py @@ -0,0 +1,26 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates + +# mypy: disable-error-code="empty-body" + + +from catalystwan.endpoints import APIEndpoints, delete, get, post, put +from catalystwan.models.url_monitoring import DeleteUrlMonitorRequest, UrlMonitoringConfig, UrlMonitoringInfo +from catalystwan.typed_list import DataSequence + + +class UrlMonitoring(APIEndpoints): + @get("/url/monitor") + def get_url_monitor(self) -> DataSequence[UrlMonitoringInfo]: + ... + + @post("/url/monitor") + def add_url_monitor(self, payload: UrlMonitoringConfig) -> None: + ... + + @put("/url/monitor") + def update_url_monitor(self, payload: UrlMonitoringConfig) -> None: + ... + + @delete("/url/monitor") + def delete_url_monitor(self, params: DeleteUrlMonitorRequest) -> None: + ... diff --git a/catalystwan/exceptions.py b/catalystwan/exceptions.py index 00b07d1a..9f15aa1a 100644 --- a/catalystwan/exceptions.py +++ b/catalystwan/exceptions.py @@ -32,7 +32,7 @@ def __init__(self, *args, error_info: ManagerErrorInfo, **kwargs): _args = (str(_args[0]) + "\n" + info_str,) + _args[1:] super().__init__(*_args, **kwargs) - def __str__(self): + def details(self): error_info_str = str(self.info) if self.info else "No error information" request_str = ( f"Request: Method: {self.request.method}, URL: {self.request.url}," diff --git a/catalystwan/integration_tests/__init__.py b/catalystwan/integration_tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/catalystwan/integration_tests/test_config_migration.py b/catalystwan/integration_tests/test_config_migration.py deleted file mode 100644 index 4deac363..00000000 --- a/catalystwan/integration_tests/test_config_migration.py +++ /dev/null @@ -1,28 +0,0 @@ -import os -import unittest -from typing import cast - -from catalystwan.session import create_manager_session -from catalystwan.workflows.config_migration import collect_ux1_config, transform - - -class TestConfigMigration(unittest.TestCase): - def setUp(self) -> None: - self.session = create_manager_session( - url=cast(str, os.environ.get("TEST_VMANAGE_URL")), - port=cast(int, int(os.environ.get("TEST_VMANAGE_PORT"))), # type: ignore - username=cast(str, os.environ.get("TEST_VMANAGE_USERNAME")), - password=cast(str, os.environ.get("TEST_VMANAGE_PASSWORD")), - ) - - def test_config_migration(self): - ux1_config = collect_ux1_config(self.session) - ux2_config = transform(ux1_config) - # push_ux2_config(self.session, ux2_config) - # This section will include the Feature profiles creation - # and pushing the configuration to the vManage - assert ux2_config - - def tearDown(self) -> None: - # This section will include the Feature profiles deletion - self.session.close() diff --git a/catalystwan/models/configuration/feature_profile/parcel.py b/catalystwan/models/configuration/feature_profile/parcel.py index 50b654ea..572f1ef1 100644 --- a/catalystwan/models/configuration/feature_profile/parcel.py +++ b/catalystwan/models/configuration/feature_profile/parcel.py @@ -80,7 +80,6 @@ "security-port", "security-protocolname", "security-urllist", - "security-urllist", "security-zone", "security", "sig", diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py index 176bf44a..80c74a32 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py @@ -66,7 +66,16 @@ PolicerParcel, PreferredColorGroupParcel, PrefixListParcel, + SLAClassParcel, + TlocParcel, + StandardCommunityParcel, + LocalDomainParcel, + FQDNDomainParcel, + IPSSignatureParcel, + SecurityPortParcel, ProtocolListParcel, + GeoLocationListParcel, + SecurityZoneListParcel, SecurityApplicationListParcel, SecurityDataPrefixParcel, SecurityPortParcel, diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py index 1f358e9a..50da5623 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py @@ -28,6 +28,7 @@ class AppProbeEntry(BaseModel): class AppProbeParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["app-probe"] = Field(default="app-probe", exclude=True) entries: List[AppProbeEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py index 355f5316..f828ec30 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py @@ -18,6 +18,7 @@ class ApplicationFamilyListEntry(BaseModel): class ApplicationListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["app-list"] = Field(default="app-list", exclude=True) entries: List[Union[ApplicationListEntry, ApplicationFamilyListEntry]] = Field( default=[], validation_alias=AliasPath("data", "entries") diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py index dd631e39..aff86429 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py @@ -13,6 +13,7 @@ class AsPathEntry(BaseModel): class AsPathParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["as-path"] = Field(default="as-path", exclude=True) as_path_list_num: Global[int] = Field(validation_alias=AliasPath("data", "asPathListNum")) entries: List[AsPathEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py index ae0e7bbd..d0a10eb8 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py @@ -2,7 +2,7 @@ from typing import List, Literal -from pydantic import AliasPath, BaseModel, Field +from pydantic import AliasPath, BaseModel, ConfigDict, Field from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global from catalystwan.models.common import TLOCColor @@ -13,6 +13,7 @@ class ColorEntry(BaseModel): class ColorParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["color"] = Field(default="color", exclude=True) entries: List[ColorEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py index dadc1ce9..2965850f 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py @@ -22,8 +22,14 @@ def from_ipv4_network(ipv4_network: IPv4Network) -> "DataPrefixEntry": class DataPrefixParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["data-prefix"] = Field(default="data-prefix", exclude=True) entries: List[DataPrefixEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries")) def add_data_prefix(self, ipv4_network: IPv4Network): - self.entries.append(DataPrefixEntry.from_ipv4_network(ipv4_network)) + self.entries.append( + DataPrefixEntry( + ipv4_address=as_global(ipv4_network.network_address), + ipv4_prefix_length=as_global(ipv4_network.prefixlen), + ) + ) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py index b8fd657b..3b77fdd5 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py @@ -8,8 +8,8 @@ class ExpandedCommunityParcel(_ParcelBase): - type_: Literal["expanded-community"] = Field(default="expanded-community", exclude=True) model_config = ConfigDict(populate_by_name=True) + type_: Literal["expanded-community"] = Field(default="expanded-community", exclude=True) expanded_community_list: Global[List[str]] = Field( default=Global[List[str]](value=list()), validation_alias=AliasPath("data", "expandedCommunityList"), diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py index 856d8bcd..7d9bde21 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py @@ -18,8 +18,8 @@ def from_string(cls, entry: str): class ExtendedCommunityParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["ext-community"] = Field(default="ext-community", exclude=True) - entries: List[ExtendedCommunityEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) def add_site_of_origin_community(self, ip_address: IPv4Address, port: int): diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py index 428a1806..12d7b66e 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py @@ -2,7 +2,7 @@ from typing import List, Literal -from pydantic import AliasPath, BaseModel, Field, field_validator +from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global @@ -18,6 +18,7 @@ def check_burst(cls, queue: Global): class FowardingClassParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["class"] = Field(default="class", exclude=True) entries: List[FowardingClassQueueEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py index be4cc0e8..3a1e2f7f 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py @@ -15,6 +15,7 @@ class IPv6DataPrefixEntry(BaseModel): class IPv6DataPrefixParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["data-ipv6-prefix"] = Field(default="data-ipv6-prefix", exclude=True) entries: List[IPv6DataPrefixEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py index 43a9eb31..11c2298f 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py @@ -23,6 +23,7 @@ class IPv6PrefixListEntry(BaseModel): class IPv6PrefixListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["ipv6-prefix"] = Field(default="ipv6-prefix", exclude=True) entries: List[IPv6PrefixListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py index e9f514a2..cfa57cd0 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py @@ -15,6 +15,7 @@ class MirrorEntry(BaseModel): class MirrorParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["mirror"] = Field(default="mirror", exclude=True) entries: List[MirrorEntry] = Field( default=[], validation_alias=AliasPath("data", "entries"), min_length=1, max_length=1 diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policer.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policer.py index 00339ff3..0c8df036 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policer.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policer.py @@ -5,11 +5,7 @@ from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global - -PolicerExceedAction = Literal[ - "drop", - "remark", -] +from catalystwan.models.policy.list.policer import PolicerExceedAction class PolicerEntry(BaseModel): @@ -32,6 +28,7 @@ def check_rate(cls, rate_str: Global): class PolicerParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["policer"] = Field(default="policer", exclude=True) entries: List[PolicerEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py index 4bfa14bf..29b7797b 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py @@ -44,6 +44,7 @@ def check_passwords_match(self) -> "PreferredColorGroupEntry": class PreferredColorGroupParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["preferred-color-group"] = Field(default="preferred-color-group", exclude=True) entries: List[PreferredColorGroupEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py index 14fd01df..a0c32de4 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py @@ -15,6 +15,7 @@ class PrefixListEntry(BaseModel): class PrefixListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["prefix"] = Field(default="prefix", exclude=True) entries: List[PrefixListEntry] = Field(default_factory=list, validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py index b8e2c984..b0913a65 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py @@ -110,6 +110,7 @@ class SLAClassListEntry(BaseModel): class SLAClassParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["sla-class"] = Field(default="sla-class", exclude=True) entries: List[SLAClassListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py index 62a35c9f..7d5ac497 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py @@ -16,6 +16,7 @@ class StandardCommunityEntry(BaseModel): class StandardCommunityParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["standard-community"] = Field(default="standard-community", exclude=True) entries: List[StandardCommunityEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py index b608e815..6eaa6756 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py @@ -6,12 +6,7 @@ from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global -from catalystwan.models.common import TLOCColor - -EncapType = Literal[ - "ipsec", - "gre", -] +from catalystwan.models.common import EncapType, TLOCColor class TlocEntry(BaseModel): @@ -32,6 +27,7 @@ def ensure_correct_preference_value(cls, v: Global): class TlocParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["tloc"] = Field(default="tloc", exclude=True) entries: List[TlocEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py index fd8d5893..e9a603cd 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py @@ -4,7 +4,7 @@ from typing import Literal, Optional from uuid import UUID -from pydantic import AliasPath, Field +from pydantic import AliasPath, ConfigDict, Field from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase from catalystwan.models.configuration.feature_profile.common import RefIdItem @@ -13,6 +13,7 @@ class AdvancedInspectionProfileParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["unified/advanced-inspection-profile"] = Field( default="unified/advanced-inspection-profile", exclude=True ) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py index b3fc6d56..ea49f9a2 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py @@ -2,7 +2,7 @@ from typing import List, Literal, Optional -from pydantic import AliasPath, Field +from pydantic import AliasPath, ConfigDict, Field from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global @@ -17,6 +17,7 @@ class AdvancedMalwareProtectionParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["unified/advanced-malware-protection"] = Field( default="unified/advanced-malware-protection", exclude=True ) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py index 49eee2a0..571e36de 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py @@ -18,6 +18,7 @@ class SecurityApplicationFamilyListEntry(BaseModel): class SecurityApplicationListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-localapp"] = Field(default="security-localapp", exclude=True) entries: List[Union[SecurityApplicationFamilyListEntry, SecurityApplicationListEntry]] = Field( default=[], validation_alias=AliasPath("data", "entries") diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py index 5f5fab00..70e82ad1 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py @@ -14,6 +14,7 @@ class SecurityDataPrefixEntry(BaseModel): class SecurityDataPrefixParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-data-ip-prefix"] = Field(default="security-data-ip-prefix", exclude=True) entries: List[SecurityDataPrefixEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py index aaf0b817..c6901716 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py @@ -15,6 +15,7 @@ class FQDNListEntry(BaseModel): class FQDNDomainParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-fqdn"] = Field(default="security-fqdn", exclude=True) entries: List[FQDNListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py index 95a59fc8..36e0c318 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py @@ -2,7 +2,7 @@ from typing import List, Literal, Optional -from pydantic import AliasPath, BaseModel, Field, model_validator +from pydantic import AliasPath, BaseModel, ConfigDict, Field, model_validator from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global from catalystwan.models.common import check_fields_exclusive @@ -21,6 +21,7 @@ def check_country_xor_continent(self): class GeoLocationListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-geolocation"] = Field(default="security-geolocation", exclude=True) entries: List[GeoLocationListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py index 389dcd47..13cef5ac 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py @@ -3,7 +3,7 @@ from typing import Literal, Optional from uuid import UUID -from pydantic import AliasPath, Field +from pydantic import AliasPath, ConfigDict, Field from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase from catalystwan.models.configuration.feature_profile.common import RefIdItem @@ -14,6 +14,7 @@ class IntrusionPreventionParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["unified/intrusion-prevention"] = Field(default="unified/intrusion-prevention", exclude=True) signature_set: Global[SignatureSet] = Field( default=Global[SignatureSet](value="balanced"), validation_alias=AliasPath("data", "signatureSet") diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py index 9d4f5bd6..2a3d2d02 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py @@ -30,6 +30,7 @@ def check_signature_id(cls, signature_id: Global): class IPSSignatureParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-ipssignature"] = Field(default="security-ipssignature", exclude=True) entries: List[IPSSignatureListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py index 27b2e931..c7c9c134 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py @@ -15,6 +15,7 @@ class LocalDomainListEntry(BaseModel): class LocalDomainParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-localdomain"] = Field(default="security-localdomain", exclude=True) entries: List[LocalDomainListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py index 179034c5..6ec39b4b 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py @@ -13,6 +13,7 @@ class ProtocolListEntry(BaseModel): class ProtocolListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-protocolname"] = Field(default="security-protocolname", exclude=True) entries: List[ProtocolListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py index 3025ba8a..13c2d6fd 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py @@ -29,6 +29,7 @@ def check_port(cls, port: Global[str]): class SecurityPortParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-port"] = Field(default="security-port", exclude=True) entries: List[SecurityPortListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py index 83fdd244..51e38e90 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py @@ -3,7 +3,7 @@ from typing import List, Literal, Optional from uuid import UUID -from pydantic import AliasPath, Field +from pydantic import AliasPath, ConfigDict, Field from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase from catalystwan.models.configuration.feature_profile.common import RefIdItem @@ -98,6 +98,7 @@ class SslDecryptionProfileParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["unified/ssl-decryption-profile"] = Field(default="unified/ssl-decryption-profile", exclude=True) parcel_description: str = Field( default="", diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py index 15ab4c65..c518ce3b 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py @@ -13,6 +13,7 @@ class BaseURLListEntry(BaseModel): class URLParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-urllist"] = Field(default="security-urllist", exclude=True) type: Literal["urlallowed", "urlblocked"] entries: List[BaseURLListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) @@ -22,10 +23,10 @@ def add_url(self, pattern: str): class URLAllowParcel(URLParcel): - type_: Literal["security-urllist"] = Field(default="security-urllist", exclude=True) + model_config = ConfigDict(populate_by_name=True) type: Literal["urlallowed"] = "urlallowed" class URLBlockParcel(URLParcel): - type_: Literal["security-urllist"] = Field(default="security-urllist", exclude=True) + model_config = ConfigDict(populate_by_name=True) type: Literal["urlblocked"] = "urlblocked" diff --git a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py index 5af30f52..9625f2e3 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py @@ -2,7 +2,7 @@ from typing import List, Literal, Optional -from pydantic import AliasPath, BaseModel, Field, field_validator, model_validator +from pydantic import AliasPath, BaseModel, ConfigDict, Field, field_validator, model_validator from catalystwan.api.configuration_groups.parcel import Global, _ParcelBase, as_global from catalystwan.models.common import InterfaceType, check_fields_exclusive @@ -25,6 +25,7 @@ def check_vpn_xor_interface(self): class SecurityZoneListParcel(_ParcelBase): + model_config = ConfigDict(populate_by_name=True) type_: Literal["security-zone"] = Field(default="security-zone", exclude=True) entries: List[SecurityZoneListEntry] = Field(default=[], validation_alias=AliasPath("data", "entries")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py b/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py index 16b15043..4021e463 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py @@ -372,7 +372,7 @@ class SIGParcel(_ParcelBase): validation_alias=AliasPath("data", "interface"), description="Interface name: IPsec when present" ) service: Service = Field(validation_alias=AliasPath("data", "service")) - tracker_src_ip: Union[Global[IPv4Address], Variable] = Field( - validation_alias=AliasPath("data", "trackerSrcIp"), description="Source IP address for Tracker" + tracker_src_ip: Union[Global[IPv4Address], Variable, None] = Field( + default=None, validation_alias=AliasPath("data", "trackerSrcIp"), description="Source IP address for Tracker" ) tracker: List[Tracker] = Field(validation_alias=AliasPath("data", "tracker")) diff --git a/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py b/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py index 303f0856..301b72af 100644 --- a/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +++ b/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py @@ -11,7 +11,9 @@ class PubkeyChainItem(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) + model_config = ConfigDict( + extra="forbid", + ) key_string: Global[str] = Field( validation_alias="keyString", serialization_alias="keyString", @@ -280,9 +282,7 @@ class AAAParcel(_ParcelBase): max_length=4, description="ServerGroups priority order", ) - user: Optional[List[UserItem]] = Field( - default=None, validation_alias=AliasPath("data", "user"), description="Create local login account", min_length=1 - ) + user: Optional[List[UserItem]] = Field(default=None, description="Create local login account", min_length=1) radius: Optional[List[Radius]] = Field( default=None, validation_alias=AliasPath("data", "radius"), description="Configure the Radius serverGroup" ) diff --git a/catalystwan/models/monitoring/security_policy.py b/catalystwan/models/monitoring/security_policy.py new file mode 100644 index 00000000..ea73fc6c --- /dev/null +++ b/catalystwan/models/monitoring/security_policy.py @@ -0,0 +1,16 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates + +from typing import List + +from pydantic import BaseModel + + +class SecurityPolicyDeviceList(BaseModel): + amp_down: List[str] + amp_up: List[str] + ips_down: List[str] + ips_up: List[str] + urlf_down: List[str] + urlf_up: List[str] + zbfw_down: List[str] + zbfw_up: List[str] diff --git a/catalystwan/models/policy/centralized.py b/catalystwan/models/policy/centralized.py index 5066e9f4..63a14992 100644 --- a/catalystwan/models/policy/centralized.py +++ b/catalystwan/models/policy/centralized.py @@ -193,6 +193,7 @@ class VpnMembershipGroupPolicyItem(AssemblyItemBase): class CentralizedPolicyDefinition(PolicyDefinition): + model_config = ConfigDict(populate_by_name=True) region_role_assembly: List = Field( default=[], serialization_alias="regionRoleAssembly", validation_alias="regionRoleAssembly" ) @@ -201,14 +202,14 @@ class CentralizedPolicyDefinition(PolicyDefinition): class CentralizedPolicy(PolicyCreationPayload): - policy_definition: Union[CentralizedPolicyDefinition, str] = Field( - default=CentralizedPolicyDefinition(), - serialization_alias="policyDefinition", - validation_alias="policyDefinition", - ) + model_config = ConfigDict(populate_by_name=True) policy_type: Literal["feature", "cli"] = Field( default="feature", serialization_alias="policyType", validation_alias="policyType" ) + policy_definition: Union[str, CentralizedPolicyDefinition] = Field( + serialization_alias="policyDefinition", + validation_alias="policyDefinition", + ) def add_traffic_data_policy(self, traffic_data_policy_id: UUID) -> TrafficDataPolicyItem: policy_definition = assert_feature_defintion(self.policy_definition) @@ -238,11 +239,10 @@ def try_parse_policy_definition_string(cls, values): # it makes sense to reuse that model for both requests and present parsed data to the user if not isinstance(values, dict): return values - if (policy_definition := values.get("policyDefinition")) and values.get("policyType") != "cli": - if isinstance(policy_definition, str): - values["policyDefinition"] = CentralizedPolicyDefinition.model_validate_json(policy_definition) - else: - values["policyDefinition"] = CentralizedPolicyDefinition() + json_policy_type = values.get("policyType") + json_policy_definition = values.get("policyDefinition") + if json_policy_type == "feature" and isinstance(json_policy_definition, str): + values["policyDefinition"] = CentralizedPolicyDefinition.model_validate_json(json_policy_definition) return values diff --git a/catalystwan/models/policy/definition/access_control_list.py b/catalystwan/models/policy/definition/access_control_list.py index 14954736..1bb60887 100644 --- a/catalystwan/models/policy/definition/access_control_list.py +++ b/catalystwan/models/policy/definition/access_control_list.py @@ -93,8 +93,8 @@ def match_high_plp(self) -> None: def match_protocols(self, protocols: Set[int]) -> None: self._insert_match(ProtocolEntry.from_protocol_set(protocols)) - def match_source_data_prefix_list(self, data_prefix_lists: List[UUID]) -> None: - self._insert_match(SourceDataPrefixListEntry(ref=data_prefix_lists)) + def match_source_data_prefix_list(self, data_prefix_list_id: UUID) -> None: + self._insert_match(SourceDataPrefixListEntry(ref=[data_prefix_list_id])) def match_source_ip(self, networks: List[IPv4Network]) -> None: self._insert_match(SourceIPEntry.from_ipv4_networks(networks)) diff --git a/catalystwan/models/policy/definition/cflowd.py b/catalystwan/models/policy/definition/cflowd.py index 60c263c9..3333d12d 100644 --- a/catalystwan/models/policy/definition/cflowd.py +++ b/catalystwan/models/policy/definition/cflowd.py @@ -4,7 +4,7 @@ from pydantic import BaseModel, ConfigDict, Field -from catalystwan.models.common import InterfaceType, VpnId +from catalystwan.models.common import VpnId from catalystwan.models.policy.policy_definition import ( Optimized, PolicyDefinitionBase, @@ -23,7 +23,9 @@ class Collector(BaseModel): address: str port: int = Field(ge=1024, le=65536) transport: TransportProtocol - sourceInterface: InterfaceType + source_interface: str = Field( + default=None, validation_alias="sourceInterface", serialization_alias="sourceInterface" + ) export_spread: Optional[ExportState] = Field( default=None, validation_alias="exportSpread", serialization_alias="exportSpread" ) diff --git a/catalystwan/models/policy/definition/device_access.py b/catalystwan/models/policy/definition/device_access.py index 63245871..57d3ae11 100644 --- a/catalystwan/models/policy/definition/device_access.py +++ b/catalystwan/models/policy/definition/device_access.py @@ -63,8 +63,8 @@ class DeviceAccessPolicySequence(PolicyDefinitionSequenceBase): def match_device_access_protocol(self, port: DeviceAccessProtocol) -> None: self._insert_match(DestinationPortEntry.from_port_set_and_ranges(ports={port})) - def match_source_data_prefix_list(self, data_prefix_lists: List[UUID]) -> None: - self._insert_match(SourceDataPrefixListEntry(ref=data_prefix_lists)) + def match_source_data_prefix_list(self, data_prefix_list_id: UUID) -> None: + self._insert_match(SourceDataPrefixListEntry(ref=[data_prefix_list_id])) def match_source_ip(self, networks: List[IPv4Network]) -> None: self._insert_match(SourceIPEntry.from_ipv4_networks(networks)) diff --git a/catalystwan/models/policy/policy.py b/catalystwan/models/policy/policy.py index 243ca128..14cd0a03 100644 --- a/catalystwan/models/policy/policy.py +++ b/catalystwan/models/policy/policy.py @@ -77,7 +77,8 @@ class PolicyCreationPayload(BaseModel): ) policy_type: str = Field(serialization_alias="policyType", validation_alias="policyType") policy_definition: Union[PolicyDefinition, str] = Field( - serialization_alias="policyDefinition", validation_alias="policyDefinition" + serialization_alias="policyDefinition", + validation_alias="policyDefinition", ) is_policy_activated: bool = Field( default=False, serialization_alias="isPolicyActivated", validation_alias="isPolicyActivated" diff --git a/catalystwan/models/url_monitoring.py b/catalystwan/models/url_monitoring.py new file mode 100644 index 00000000..c83b3e65 --- /dev/null +++ b/catalystwan/models/url_monitoring.py @@ -0,0 +1,28 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates + +from typing import Optional + +from pydantic import BaseModel, Field + + +class UrlMonitoringInfo(BaseModel): + url: Optional[str] = None + threshold: Optional[int] = None + alarm_raised: Optional[bool] = Field( + default=None, serialization_alias="lastUpdatedBy", validation_alias="lastUpdatedBy" + ) + + +class UrlMonitoringConfig(BaseModel): + url: str = Field(..., examples=["/client/server/ready"], description="URL registered for monitoring requests.") + threshold: int = Field( + ge=10, + le=100, + title="Threshold", + description="vManage alarm is raised after reaching the threshold. " + "Threshold should be within a range of 10 and 100 inclusive.", + ) + + +class DeleteUrlMonitorRequest(BaseModel): + url: str = Field(..., examples=["/client/server/ready"], description="URL registered for monitoring requests.") diff --git a/catalystwan/session.py b/catalystwan/session.py index 5f03770e..b30e7cbd 100644 --- a/catalystwan/session.py +++ b/catalystwan/session.py @@ -156,7 +156,7 @@ def __init__( port: Optional[int] = None, subdomain: Optional[str] = None, auth: Optional[AuthBase] = None, - validate_response: bool = True, + validate_responses: bool = True, ): self.url = url self.port = port @@ -179,7 +179,7 @@ def __init__( self._state: ManagerSessionState = ManagerSessionState.OPERATIVE self.restart_timeout: int = 1200 self.polling_requests_timeout: int = 10 - self._validate_response = validate_response + self._validate_responses = validate_responses @cached_property def api(self) -> APIContainer: @@ -444,11 +444,23 @@ def get_virtual_session_id(self, tenant_id: str) -> str: return response.json()["VSessionId"] def logout(self) -> Optional[ManagerResponse]: + response = None if isinstance((version := self.api_version), NullVersion): self.logger.warning("Cannot perform logout operation without known api_version.") - return None + return response else: - return self.post("/logout") if version >= Version("20.12") else self.get("/logout") + # disable automatic relogin before performing logout request + _relogin = self.enable_relogin + try: + self.enable_relogin = False + if version >= Version("20.12"): + response = self.post("/logout") + else: + response = self.get("/logout") + finally: + # restore original setting after performing logout request + self.enable_relogin = _relogin + return response def close(self) -> None: """Closes the ManagerSession. @@ -461,7 +473,6 @@ def close(self) -> None: using the `with` statement, which ensures that the session is properly closed and resources are cleaned up even in case of exceptions. """ - self.enable_relogin = False self.logout() super().close() @@ -487,12 +498,12 @@ def api_version(self) -> Version: return self._api_version @property - def validate_response(self) -> bool: - return self._validate_response + def validate_responses(self) -> bool: + return self._validate_responses - @validate_response.setter - def validate_response(self, value: bool): - self._validate_response = value + @validate_responses.setter + def validate_responses(self, value: bool): + self._validate_responses = value def __str__(self) -> str: return f"{self.username}@{self.base_url}" diff --git a/catalystwan/tests/__init__.py b/catalystwan/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/catalystwan/tests/config_migration/test_converter_chooser.py b/catalystwan/tests/config_migration/test_converter_chooser.py deleted file mode 100644 index 0e2935d0..00000000 --- a/catalystwan/tests/config_migration/test_converter_chooser.py +++ /dev/null @@ -1,26 +0,0 @@ -import unittest - -from parameterized import parameterized # type: ignore - -from catalystwan.exceptions import CatalystwanException -from catalystwan.utils.config_migration.converters.feature_template import choose_parcel_converter -from catalystwan.utils.config_migration.converters.feature_template.aaa import AAATemplateConverter -from catalystwan.utils.config_migration.converters.feature_template.bfd import BFDTemplateConverter - - -class TestParcelConverterChooser(unittest.TestCase): - @parameterized.expand( - [("cisco_aaa", AAATemplateConverter), ("cedge_aaa", AAATemplateConverter), ("cisco_bfd", BFDTemplateConverter)] - ) - def test_choose_parcel_converter_returns_correct_converter_when_supported(self, template_type, expected): - # Arrange, Act - converter = choose_parcel_converter(template_type) - # Assert - self.assertEqual(converter, expected) - - def test_choose_parcel_converter_throws_exception_when_template_type_not_supported(self): - # Arrange - not_supported_type = "!@#$%^&*()" - # Act, Assert - with self.assertRaises(CatalystwanException, msg=f"Template type {not_supported_type} not supported"): - choose_parcel_converter(not_supported_type) diff --git a/catalystwan/tests/templates/__init__.py b/catalystwan/tests/templates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/catalystwan/tests/templates/definitions/__init__.py b/catalystwan/tests/templates/definitions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/catalystwan/tests/templates/definitions/basic/__init__.py b/catalystwan/tests/templates/definitions/basic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/catalystwan/tests/templates/test_find_template_values.py b/catalystwan/tests/templates/test_find_template_values.py new file mode 100644 index 00000000..50702369 --- /dev/null +++ b/catalystwan/tests/templates/test_find_template_values.py @@ -0,0 +1,192 @@ +from catalystwan.api.templates.device_variable import DeviceVariable +from catalystwan.utils.feature_template.find_template_values import find_template_values + + +def test_find_template_values(): + input_values = { + "vpn-id": {"vipObjectType": "object", "vipType": "constant", "vipValue": 0}, + "name": { + "vipObjectType": "object", + "vipType": "ignore", + "vipVariableName": "vpn_name", + }, + "ecmp-hash-key": { + "layer4": { + "vipObjectType": "object", + "vipType": "ignore", + "vipValue": "false", + "vipVariableName": "vpn_layer4", + } + }, + "nat64-global": {"prefix": {"stateful": {}}}, + "nat64": { + "v4": { + "pool": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["name"], + } + } + }, + "nat": { + "natpool": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["name"], + }, + "port-forward": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["source-port", "translate-port"], + }, + "static": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["source-ip", "translate-ip"], + }, + }, + "route-import": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["protocol"], + }, + "route-export": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["protocol"], + }, + "dns": { + "vipType": "constant", + "vipValue": [ + { + "role": { + "vipType": "constant", + "vipValue": "primary", + "vipObjectType": "object", + }, + "dns-addr": { + "vipType": "variableName", + "vipValue": "", + "vipObjectType": "object", + "vipVariableName": "vpn_dns_primary", + }, + "priority-order": ["dns-addr", "role"], + }, + { + "role": { + "vipType": "constant", + "vipValue": "secondary", + "vipObjectType": "object", + }, + "dns-addr": { + "vipType": "variableName", + "vipValue": "", + "vipObjectType": "object", + "vipVariableName": "vpn_dns_secondary", + }, + "priority-order": ["dns-addr", "role"], + }, + ], + "vipObjectType": "tree", + "vipPrimaryKey": ["dns-addr"], + }, + "host": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["hostname"], + }, + "service": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["svc-type"], + }, + "ip": { + "route": { + "vipType": "constant", + "vipValue": [ + { + "prefix": { + "vipObjectType": "object", + "vipType": "constant", + "vipValue": "0.0.0.0/0", + "vipVariableName": "vpn_ipv4_ip_prefix", + }, + "next-hop": { + "vipType": "constant", + "vipValue": [ + { + "address": { + "vipObjectType": "object", + "vipType": "variableName", + "vipValue": "", + "vipVariableName": "vpn_next_hop_ip_address_0", + }, + "distance": { + "vipObjectType": "object", + "vipType": "ignore", + "vipValue": 1, + "vipVariableName": "vpn_next_hop_ip_distance_0", + }, + "priority-order": ["address", "distance"], + } + ], + "vipObjectType": "tree", + "vipPrimaryKey": ["address"], + }, + "priority-order": ["prefix", "next-hop", "next-hop-with-track"], + } + ], + "vipObjectType": "tree", + "vipPrimaryKey": ["prefix"], + }, + "gre-route": {}, + "ipsec-route": {}, + "service-route": {}, + }, + "ipv6": {}, + "omp": { + "advertise": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["protocol"], + }, + "ipv6-advertise": { + "vipType": "ignore", + "vipValue": [], + "vipObjectType": "tree", + "vipPrimaryKey": ["protocol"], + }, + }, + } + expected_values = { + "vpn-id": 0, + "dns": [ + {"role": "primary", "dns-addr": DeviceVariable(name="vpn_dns_primary")}, + {"role": "secondary", "dns-addr": DeviceVariable(name="vpn_dns_secondary")}, + ], + "ip": { + "route": [ + { + "prefix": "0.0.0.0/0", + "next-hop": [ + { + "address": DeviceVariable(name="vpn_next_hop_ip_address_0"), + } + ], + } + ], + }, + } + # Act + result = find_template_values(input_values) + # Assert + assert expected_values == result diff --git a/catalystwan/tests/test_monitoring_security_policy.py b/catalystwan/tests/test_monitoring_security_policy.py new file mode 100644 index 00000000..8b45e270 --- /dev/null +++ b/catalystwan/tests/test_monitoring_security_policy.py @@ -0,0 +1,65 @@ +# Copyright 2022 Cisco Systems, Inc. and its affiliates + +import unittest +from unittest.mock import MagicMock, patch + +from catalystwan.endpoints.monitoring.security_policy import MonitoringSecurityPolicy +from catalystwan.models.monitoring.security_policy import SecurityPolicyDeviceList + + +class TestMonitoringSecurityPolicy(unittest.TestCase): + def setUp(self) -> None: + self.mock_device_list_data = { + "amp_down": ["2.2.2.2"], + "amp_up": ["3.3.3.3"], + "ips_down": ["2.2.2.2"], + "ips_up": ["1.1.1.1"], + "urlf_down": ["3.3.3.3"], + "urlf_up": ["1.1.1.1", "2.2.2.2"], + "zbfw_down": [], + "zbfw_up": ["1.1.1.1", "2.2.2.2", "3.3.3.3"], + } + + @patch("catalystwan.session.ManagerSession") + def test_get_security_policy_device_list(self, mock_session): + # Arrange + # Create a MagicMock for the response that has a dataobj method + mock_response = MagicMock() + + # Set up the mock response's dataobj method to return a ServerInfoResponse + mock_response.dataobj.return_value = SecurityPolicyDeviceList(**self.mock_device_list_data) + + # Mock the request method of the ManagerSession to return the mock response + mock_session_instance = mock_session.return_value + mock_session_instance.request.return_value = mock_response + + mon_sec_pol_api = MonitoringSecurityPolicy(mock_session_instance) + + # Act + response = mon_sec_pol_api.get_device_list() + + # Assert + self.assertIsInstance(response, SecurityPolicyDeviceList) + self.assertEqual(response.amp_down, self.mock_device_list_data["amp_down"]) + self.assertEqual(response.amp_down, ["2.2.2.2"]) + self.assertEqual(response.amp_up, self.mock_device_list_data["amp_up"]) + self.assertEqual(response.amp_up, ["3.3.3.3"]) + self.assertEqual(response.ips_down, self.mock_device_list_data["ips_down"]) + self.assertEqual(response.ips_down, ["2.2.2.2"]) + self.assertEqual(response.ips_up, self.mock_device_list_data["ips_up"]) + self.assertEqual(response.ips_up, ["1.1.1.1"]) + self.assertEqual(response.urlf_down, self.mock_device_list_data["urlf_down"]) + self.assertEqual(response.urlf_down, ["3.3.3.3"]) + self.assertEqual(response.urlf_up, self.mock_device_list_data["urlf_up"]) + self.assertEqual(response.urlf_up, ["1.1.1.1", "2.2.2.2"]) + self.assertEqual(response.zbfw_down, self.mock_device_list_data["zbfw_down"]) + self.assertEqual(response.zbfw_down, []) + self.assertEqual(response.zbfw_up, self.mock_device_list_data["zbfw_up"]) + self.assertEqual(response.zbfw_up, ["1.1.1.1", "2.2.2.2", "3.3.3.3"]) + + # Ensure the request method was called + mock_session_instance.request.assert_called_once() + + +if __name__ == "__main__": + unittest.main() diff --git a/catalystwan/tests/test_response.py b/catalystwan/tests/test_response.py index 4a2e93be..09f0b059 100644 --- a/catalystwan/tests/test_response.py +++ b/catalystwan/tests/test_response.py @@ -156,7 +156,6 @@ def test_dataobj_optional_validate(self): data = vmng_response.dataobj(DataForValidateTest, sourcekey=None, validate=False) # Assert assert isinstance(data, DataForValidateTest) - print(data) assert data.important == VALIDATE_DATASEQ_TEST_DATA[0]["important"] with self.assertRaises(ValidationError): vmng_response.dataobj(DataForValidateTest, sourcekey=None, validate=True) @@ -168,7 +167,6 @@ def test_dataseq_optional_validate(self): dataseq = vmng_response.dataseq(DataForValidateTest, sourcekey=None, validate=False) # Assert assert isinstance(dataseq, DataSequence) - print(dataseq) for i, data in enumerate(dataseq): assert isinstance(data, DataForValidateTest) assert data.important == VALIDATE_DATASEQ_TEST_DATA[i]["important"] diff --git a/catalystwan/tests/test_typed_list.py b/catalystwan/tests/test_typed_list.py index 9fcba301..ff8f7661 100644 --- a/catalystwan/tests/test_typed_list.py +++ b/catalystwan/tests/test_typed_list.py @@ -1,4 +1,4 @@ -# Copyright 2023 Cisco Systems, Inc. and its affiliates +# Copyright 2024 Cisco Systems, Inc. and its affiliates # type: ignore import copy @@ -397,6 +397,30 @@ def test_find_no_match(self): with self.assertRaises(InvalidOperationError): self.data_sequence.find(username="NonExistingUser") + def test_deepcopy_basemodel(self): + # Arrange + user = User(username="admin") + ds = DataSequence(User, [user]) + # Act + ds_deepcopy = copy.deepcopy(ds) + user_deepcopied = ds_deepcopy[0] + # Assert + self.assertIsNot(ds, ds_deepcopy) + self.assertIsNot(user, user_deepcopied) + self.assertEqual(user.username, user_deepcopied.username) + + def test_deepcopy_dataclass(self): + # Arrange + fu = FakeUser(name="admin", weight=87.5) + ds = DataSequence(FakeUser, [fu]) + # Act + ds_deepcopy = copy.deepcopy(ds) + fd_deepcopied = ds_deepcopy[0] + # Assert + self.assertIsNot(ds, ds_deepcopy) + self.assertIsNot(fu, fd_deepcopied) + self.assertEqual(fu.name, fd_deepcopied.name) + if __name__ == "__main__": unittest.main() diff --git a/catalystwan/tests/test_url_monitoring.py b/catalystwan/tests/test_url_monitoring.py new file mode 100644 index 00000000..408cd9cc --- /dev/null +++ b/catalystwan/tests/test_url_monitoring.py @@ -0,0 +1,79 @@ +import unittest +from unittest.mock import MagicMock, patch + +from catalystwan.endpoints.url_monitoring import UrlMonitoring +from catalystwan.models.url_monitoring import DeleteUrlMonitorRequest, UrlMonitoringConfig + + +class TestUrlMonitoring(unittest.TestCase): + @patch("catalystwan.session.ManagerSession") + def setUp(self, session_mock) -> None: + self.session = session_mock + + self.mock_url_monitor_info_data = {"url": "/client/server/ready", "threshold": 98, "alarm_raised": False} + + self.mock_url_monitor_config_add_data = {"url": "/client/server/ready", "threshold": 98} + self.mock_url_monitor_config_update_data = {"url": "/client/server/ready", "threshold": 90} + self.mock_url_monitor_delete_url = DeleteUrlMonitorRequest(url="/client/server/ready") + + @patch("catalystwan.session.ManagerSession") + def test_add_url_monitor(self, mock_session): + # Arrange + mock_response = MagicMock() + mock_session.get_data.return_value = UrlMonitoringConfig(**self.mock_url_monitor_config_add_data) + # Mock the request method of the ManagerSession to return the mock response + mock_session_instance = mock_session.return_value + mock_session_instance.request.return_value = mock_response + mock_session.post.return_value = mock_response + url_monitor = UrlMonitoring(mock_session_instance) + + # Act + response = url_monitor.add_url_monitor(self.mock_url_monitor_config_add_data) + # Assert + self.assertEqual(response, None) + # Ensure the request method was called + mock_session_instance.request.assert_called_once() + + @patch("catalystwan.session.ManagerSession") + @patch("catalystwan.response.ManagerResponse") + def test_get_url_monitor(self, mock_session, mock_response): + # Arrange + mock_response = MagicMock() + mock_session_instance = mock_session.return_value + mock_session_instance.request.return_value = mock_response + url_monitor = UrlMonitoring(mock_session_instance) + observed_url_monitor = url_monitor.get_url_monitor() + # Assert + self.assertIsNotNone(observed_url_monitor) + + @patch("catalystwan.session.ManagerSession") + def test_update_url_monitor(self, mock_session): + # Arrange + mock_response = MagicMock() + mock_session.get_data.return_value = UrlMonitoringConfig(**self.mock_url_monitor_config_update_data) + # Mock the request method of the ManagerSession to return the mock response + mock_session_instance = mock_session.return_value + mock_session_instance.request.return_value = mock_response + url_monitor = UrlMonitoring(mock_session_instance) + # Act + response = url_monitor.update_url_monitor(self.mock_url_monitor_config_update_data) + # Assert + self.assertEqual(response, None) + # Ensure the request method was called + mock_session_instance.request.assert_called_once() + + @patch("catalystwan.session.ManagerSession") + def test_delete_url_monitor(self, mock_session): + # Arrange + mock_response = MagicMock() + mock_session.get_data.return_value = self.mock_url_monitor_delete_url + # Mock the request method of the ManagerSession to return the mock response + mock_session_instance = mock_session.return_value + mock_session_instance.request.return_value = mock_response + url_monitor = UrlMonitoring(mock_session_instance) + # Act + response = url_monitor.delete_url_monitor(self.mock_url_monitor_delete_url) + # Assert + self.assertEqual(response, None) + # Ensure the request method was called + mock_session_instance.request.assert_called_once() diff --git a/catalystwan/tests/test_vmanage_auth.py b/catalystwan/tests/test_vmanage_auth.py index 0924e888..c788dfdf 100644 --- a/catalystwan/tests/test_vmanage_auth.py +++ b/catalystwan/tests/test_vmanage_auth.py @@ -7,6 +7,7 @@ from requests import Request from catalystwan import USER_AGENT +from catalystwan.exceptions import CatalystwanException from catalystwan.vmanage_auth import UnauthorizedAccessError, vManageAuth @@ -28,7 +29,7 @@ def text(self) -> str: # TODO return self._text -def mocked_requests_method(*args, **kwargs): +def mock_request_j_security_check(*args, **kwargs): url_response = { "https://1.1.1.1:1111/j_security_check": { "admin": MockResponse(200, ""), @@ -44,12 +45,24 @@ def mocked_requests_method(*args, **kwargs): return MockResponse(404, "error") +def mock_valid_token(*args, **kw): + return MockResponse(200, "valid-token") + + +def mock_invalid_token_status(*args, **kw): + return MockResponse(503, "invalid-token") + + +def mock_invalid_token_format(*args, **kw): + return MockResponse(200, "error") + + class TestvManageAuth(TestCase): def setUp(self): self.base_url = "https://1.1.1.1:1111" self.password = str(uuid4()) - @mock.patch("requests.post", side_effect=mocked_requests_method) + @mock.patch("requests.post", side_effect=mock_request_j_security_check) def test_get_cookie(self, mock_post): # Arrange username = "admin" @@ -69,7 +82,7 @@ def test_get_cookie(self, mock_post): headers={"Content-Type": "application/x-www-form-urlencoded", "User-Agent": USER_AGENT}, ) - @mock.patch("requests.post", side_effect=mocked_requests_method) + @mock.patch("requests.post", side_effect=mock_request_j_security_check) def test_get_cookie_invalid_username(self, mock_post): # Arrange username = "invalid_username" @@ -91,16 +104,17 @@ def test_get_cookie_invalid_username(self, mock_post): ) @mock.patch("requests.cookies.RequestsCookieJar") - @mock.patch("requests.get", side_effect=mocked_requests_method) + @mock.patch("requests.get", side_effect=mock_valid_token) def test_fetch_token(self, mock_get, cookies): # Arrange valid_url = "https://1.1.1.1:1111/dataservice/client/token" auth = vManageAuth(self.base_url, "admin", self.password) # Act - auth.fetch_token(cookies) + token = auth.fetch_token(cookies) # Assert + self.assertEqual(token, "valid-token") mock_get.assert_called_with( url=valid_url, verify=False, @@ -108,6 +122,20 @@ def test_fetch_token(self, mock_get, cookies): cookies=cookies, ) + @mock.patch("requests.cookies.RequestsCookieJar") + @mock.patch("requests.get", side_effect=mock_invalid_token_status) + def test_incorrect_xsrf_token_status(self, mock_get, cookies): + auth = vManageAuth("http://invalid.response", "admin", self.password) + with self.assertRaises(CatalystwanException): + auth.fetch_token(cookies) + + @mock.patch("requests.cookies.RequestsCookieJar") + @mock.patch("requests.get", side_effect=mock_invalid_token_format) + def test_incorrect_xsrf_token_format(self, mock_get, cookies): + auth = vManageAuth("http://invalid.response", "admin", self.password) + with self.assertRaises(CatalystwanException): + auth.fetch_token(cookies) + if __name__ == "__main__": unittest.main() diff --git a/catalystwan/typed_list.py b/catalystwan/typed_list.py index ba7792a2..ecd09101 100644 --- a/catalystwan/typed_list.py +++ b/catalystwan/typed_list.py @@ -1,7 +1,8 @@ -# Copyright 2023 Cisco Systems, Inc. and its affiliates +# Copyright 2024 Cisco Systems, Inc. and its affiliates from __future__ import annotations +import copy from typing import Any, Generic, Iterable, MutableSequence, Type, TypeVar, overload from pydantic import BaseModel @@ -186,6 +187,15 @@ def __iadd__(self, __value: Iterable[T]) -> DataSequence[T]: self.data = DataSequence(self._type, self.data + [*__value.__iter__()]).data return self + def __copy__(self) -> DataSequence[T]: + return DataSequence(self._type, self.data) + + def __deepcopy__(self, memo) -> DataSequence[T]: + if issubclass(self._type, BaseModel): + return DataSequence(self._type, [o.model_copy(deep=True) for o in self]) # type: ignore + else: + return DataSequence(self._type, [copy.deepcopy(o, memo) for o in self]) + @overload def single_or_default(self) -> T: ... diff --git a/catalystwan/utils/config_migration/creators/config_pusher.py b/catalystwan/utils/config_migration/creators/config_pusher.py index bee7ea25..2f1d04c9 100644 --- a/catalystwan/utils/config_migration/creators/config_pusher.py +++ b/catalystwan/utils/config_migration/creators/config_pusher.py @@ -70,7 +70,7 @@ def _create_cloud_credentials(self): try: self._session.endpoints.configuration_settings.create_cloud_credentials(cloud_credentials) except ManagerHTTPError as e: - logger.error(f"Error occured during credentials migration: {e.info}") + logger.error(f"Error occured during credentials migration: {e}") def _create_config_groups(self): config_groups = self._ux2_config.config_groups @@ -92,7 +92,7 @@ def _create_config_groups(self): try: cg_id = self._session.endpoints.configuration_group.create_config_group(config_group_payload).id except ManagerHTTPError as e: - logger.error(f"Error occured during config group creation: {e.info}") + logger.error(f"Error occured during config group creation: {e}") self._push_result.report.add_feature_profiles_not_assosiated_with_config_group( feature_profiles=created_profiles ) @@ -126,7 +126,7 @@ def _create_feature_profile_and_parcels(self, feature_profiles_ids: List[UUID]) feature_profiles.append(profile) self._push_result.rollback.add_feature_profile(profile.profile_uuid, profile_type) except ManagerHTTPError as e: - logger.error(f"Error occured during [{fp_name}] feature profile creation: {e.info}") + logger.error(f"Error occured during [{fp_name}] feature profile creation: {e}") except Exception: logger.critical(f"Unexpected error occured during [{fp_name}] feature profile creation", exc_info=True) return feature_profiles @@ -161,7 +161,7 @@ def _create_topology_groups(self, default_policy_object_profile_id: UUID): len(ttps), ) except ManagerHTTPError as e: - logger.error(f"Error occured during topology profile creation: {e.info}") + logger.error(f"Error occured during topology profile creation: {e}") ttgs = self._ux2_config.topology_groups for ttg in ttgs: @@ -177,13 +177,13 @@ def _create_topology_groups(self, default_policy_object_profile_id: UUID): len(ttps), ) except ManagerHTTPError as e: - logger.error(f"Error occured during topology group creation: {e.info}") + logger.error(f"Error occured during topology group creation: {e}") for parcel in self._ux2_config.parcels_with_origin(origins): if isinstance(parcel, (CustomControlParcel, HubSpokeParcel, MeshParcel)): try: profile_api.create_parcel(profile_id, parcel) except ManagerHTTPError as e: - logger.error(f"Error occured during topology profile creation: {e.info}") + logger.error(f"Error occured during topology profile creation: {e}") else: logger.warning(f"Unexpected parcel type {type(parcel)}") diff --git a/catalystwan/utils/timezone.py b/catalystwan/utils/timezone.py index a607a0d7..e210b891 100644 --- a/catalystwan/utils/timezone.py +++ b/catalystwan/utils/timezone.py @@ -1,420 +1,422 @@ -from typing import Literal +# Copyright 2023 Cisco Systems, Inc. and its affiliates -Timezone = Literal[ - "Europe/Andorra", - "Asia/Dubai", - "Asia/Kabul", - "America/Antigua", - "America/Anguilla", - "Europe/Tirane", - "Asia/Yerevan", - "Africa/Luanda", - "Antarctica/McMurdo", - "Antarctica/Rothera", - "Antarctica/Palmer", - "Antarctica/Mawson", - "Antarctica/Davis", - "Antarctica/Casey", - "Antarctica/Vostok", - "Antarctica/DumontDUrville", - "Antarctica/Syowa", - "America/Argentina/Buenos_Aires", - "America/Argentina/Cordoba", - "America/Argentina/Salta", - "America/Argentina/Jujuy", - "America/Argentina/Tucuman", - "America/Argentina/Catamarca", - "America/Argentina/La_Rioja", - "America/Argentina/San_Juan", - "America/Argentina/Mendoza", - "America/Argentina/San_Luis", - "America/Argentina/Rio_Gallegos", - "America/Argentina/Ushuaia", - "Pacific/Pago_Pago", - "Europe/Vienna", - "Australia/Lord_Howe", - "Antarctica/Macquarie", - "Australia/Hobart", - "Australia/Currie", - "Australia/Melbourne", - "Australia/Sydney", - "Australia/Broken_Hill", - "Australia/Brisbane", - "Australia/Lindeman", - "Australia/Adelaide", - "Australia/Darwin", - "Australia/Perth", - "Australia/Eucla", - "America/Aruba", - "Europe/Mariehamn", - "Asia/Baku", - "Europe/Sarajevo", - "America/Barbados", - "Asia/Dhaka", - "Europe/Brussels", - "Africa/Ouagadougou", - "Europe/Sofia", - "Asia/Bahrain", - "Africa/Bujumbura", - "Africa/Porto-Novo", - "America/St_Barthelemy", - "Atlantic/Bermuda", - "Asia/Brunei", - "America/La_Paz", - "America/Kralendijk", - "America/Noronha", - "America/Belem", - "America/Fortaleza", - "America/Recife", - "America/Araguaina", - "America/Maceio", - "America/Bahia", - "America/Sao_Paulo", - "America/Campo_Grande", - "America/Cuiaba", - "America/Santarem", - "America/Porto_Velho", - "America/Boa_Vista", - "America/Manaus", - "America/Eirunepe", - "America/Rio_Branco", - "America/Nassau", - "Asia/Thimphu", - "Africa/Gaborone", - "Europe/Minsk", - "America/Belize", - "America/St_Johns", - "America/Halifax", - "America/Glace_Bay", - "America/Moncton", - "America/Goose_Bay", - "America/Blanc-Sablon", - "America/Toronto", - "America/Nipigon", - "America/Thunder_Bay", - "America/Iqaluit", - "America/Pangnirtung", - "America/Resolute", - "America/Atikokan", - "America/Rankin_Inlet", - "America/Winnipeg", - "America/Rainy_River", - "America/Regina", - "America/Swift_Current", - "America/Edmonton", - "America/Cambridge_Bay", - "America/Yellowknife", - "America/Inuvik", - "America/Creston", - "America/Dawson_Creek", - "America/Vancouver", - "America/Whitehorse", - "America/Dawson", - "Indian/Cocos", - "Africa/Kinshasa", - "Africa/Lubumbashi", - "Africa/Bangui", - "Africa/Brazzaville", - "Europe/Zurich", - "Africa/Abidjan", - "Pacific/Rarotonga", - "America/Santiago", - "Pacific/Easter", - "Africa/Douala", - "Asia/Shanghai", - "Asia/Harbin", - "Asia/Chongqing", - "Asia/Urumqi", - "Asia/Kashgar", - "America/Bogota", - "America/Costa_Rica", - "America/Havana", - "Atlantic/Cape_Verde", - "America/Curacao", - "Indian/Christmas", - "Asia/Nicosia", - "Europe/Prague", - "Europe/Berlin", - "Europe/Busingen", - "Africa/Djibouti", - "Europe/Copenhagen", - "America/Dominica", - "America/Santo_Domingo", - "Africa/Algiers", - "America/Guayaquil", - "Pacific/Galapagos", - "Europe/Tallinn", - "Africa/Cairo", - "Africa/El_Aaiun", - "Africa/Asmara", - "Europe/Madrid", - "Africa/Ceuta", - "Atlantic/Canary", - "Africa/Addis_Ababa", - "Europe/Helsinki", - "Pacific/Fiji", - "Atlantic/Stanley", - "Pacific/Chuuk", - "Pacific/Pohnpei", - "Pacific/Kosrae", - "Atlantic/Faroe", - "Europe/Paris", - "Africa/Libreville", - "Europe/London", - "America/Grenada", - "Asia/Tbilisi", - "America/Cayenne", - "Europe/Guernsey", - "Africa/Accra", - "Europe/Gibraltar", - "America/Godthab", - "America/Danmarkshavn", - "America/Scoresbysund", - "America/Thule", - "Africa/Banjul", - "Africa/Conakry", - "America/Guadeloupe", - "Africa/Malabo", - "Europe/Athens", - "Atlantic/South_Georgia", - "America/Guatemala", - "Pacific/Guam", - "Africa/Bissau", - "America/Guyana", - "Asia/Hong_Kong", - "America/Tegucigalpa", - "Europe/Zagreb", - "America/Port-au-Prince", - "Europe/Budapest", - "Asia/Jakarta", - "Asia/Pontianak", - "Asia/Makassar", - "Asia/Jayapura", - "Europe/Dublin", - "Asia/Jerusalem", - "Europe/Isle_of_Man", - "Asia/Kolkata", - "Indian/Chagos", - "Asia/Baghdad", - "Asia/Tehran", - "Atlantic/Reykjavik", - "Europe/Rome", - "Europe/Jersey", - "America/Jamaica", - "Asia/Amman", - "Asia/Tokyo", - "Africa/Nairobi", - "Asia/Bishkek", - "Asia/Phnom_Penh", - "Pacific/Tarawa", - "Pacific/Enderbury", - "Pacific/Kiritimati", - "Indian/Comoro", - "America/St_Kitts", - "Asia/Pyongyang", - "Asia/Seoul", - "Asia/Kuwait", - "America/Cayman", - "Asia/Almaty", - "Asia/Qyzylorda", - "Asia/Aqtobe", - "Asia/Aqtau", - "Asia/Oral", - "Asia/Vientiane", - "Asia/Beirut", - "America/St_Lucia", - "Europe/Vaduz", - "Asia/Colombo", - "Africa/Monrovia", - "Africa/Maseru", - "Europe/Vilnius", - "Europe/Luxembourg", - "Europe/Riga", - "Africa/Tripoli", - "Africa/Casablanca", - "Europe/Monaco", - "Europe/Chisinau", - "Europe/Podgorica", - "America/Marigot", - "Indian/Antananarivo", - "Pacific/Majuro", - "Pacific/Kwajalein", - "Europe/Skopje", - "Africa/Bamako", - "Asia/Rangoon", - "Asia/Ulaanbaatar", - "Asia/Hovd", - "Asia/Choibalsan", - "Asia/Macau", - "Pacific/Saipan", - "America/Martinique", - "Africa/Nouakchott", - "America/Montserrat", - "Europe/Malta", - "Indian/Mauritius", - "Indian/Maldives", - "Africa/Blantyre", - "America/Mexico_City", - "America/Cancun", - "America/Merida", - "America/Monterrey", - "America/Matamoros", - "America/Mazatlan", - "America/Chihuahua", - "America/Ojinaga", - "America/Hermosillo", - "America/Tijuana", - "America/Santa_Isabel", - "America/Bahia_Banderas", - "Asia/Kuala_Lumpur", - "Asia/Kuching", - "Africa/Maputo", - "Africa/Windhoek", - "Pacific/Noumea", - "Africa/Niamey", - "Pacific/Norfolk", - "Africa/Lagos", - "America/Managua", - "Europe/Amsterdam", - "Europe/Oslo", - "Asia/Kathmandu", - "Pacific/Nauru", - "Pacific/Niue", - "Pacific/Auckland", - "Pacific/Chatham", - "Asia/Muscat", - "America/Panama", - "America/Lima", - "Pacific/Tahiti", - "Pacific/Marquesas", - "Pacific/Gambier", - "Pacific/Port_Moresby", - "Asia/Manila", - "Asia/Karachi", - "Europe/Warsaw", - "America/Miquelon", - "Pacific/Pitcairn", - "America/Puerto_Rico", - "Asia/Gaza", - "Asia/Hebron", - "Europe/Lisbon", - "Atlantic/Madeira", - "Atlantic/Azores", - "Pacific/Palau", - "America/Asuncion", - "Asia/Qatar", - "Indian/Reunion", - "Europe/Bucharest", - "Europe/Belgrade", - "Europe/Kaliningrad", - "Europe/Moscow", - "Europe/Volgograd", - "Europe/Samara", - "Asia/Yekaterinburg", - "Asia/Omsk", - "Asia/Novosibirsk", - "Asia/Novokuznetsk", - "Asia/Krasnoyarsk", - "Asia/Irkutsk", - "Asia/Yakutsk", - "Asia/Khandyga", - "Asia/Vladivostok", - "Asia/Sakhalin", - "Asia/Ust-Nera", - "Asia/Magadan", - "Asia/Kamchatka", - "Asia/Anadyr", - "Africa/Kigali", - "Asia/Riyadh", - "Pacific/Guadalcanal", - "Indian/Mahe", - "Africa/Khartoum", - "Europe/Stockholm", - "Asia/Singapore", - "Atlantic/St_Helena", - "Europe/Ljubljana", - "Arctic/Longyearbyen", - "Europe/Bratislava", - "Africa/Freetown", - "Europe/San_Marino", - "Africa/Dakar", - "Africa/Mogadishu", - "America/Paramaribo", - "Africa/Juba", - "Africa/Sao_Tome", - "America/El_Salvador", - "America/Lower_Princes", - "Asia/Damascus", - "Africa/Mbabane", - "America/Grand_Turk", - "Africa/Ndjamena", - "Indian/Kerguelen", - "Africa/Lome", - "Asia/Bangkok", - "Asia/Dushanbe", - "Pacific/Fakaofo", - "Asia/Dili", - "Asia/Ashgabat", - "Africa/Tunis", - "Pacific/Tongatapu", - "Europe/Istanbul", - "America/Port_of_Spain", - "Pacific/Funafuti", - "Asia/Taipei", - "Africa/Dar_es_Salaam", - "Europe/Kiev", - "Europe/Uzhgorod", - "Europe/Zaporozhye", - "Europe/Simferopol", - "Africa/Kampala", - "Pacific/Johnston", - "Pacific/Midway", - "Pacific/Wake", - "America/New_York", - "America/Detroit", - "America/Kentucky/Louisville", - "America/Kentucky/Monticello", - "America/Indiana/Indianapolis", - "America/Indiana/Vincennes", - "America/Indiana/Winamac", - "America/Indiana/Marengo", - "America/Indiana/Petersburg", - "America/Indiana/Vevay", - "America/Chicago", - "America/Indiana/Tell_City", - "America/Indiana/Knox", - "America/Menominee", - "America/North_Dakota/Center", - "America/North_Dakota/New_Salem", - "America/North_Dakota/Beulah", - "America/Denver", - "America/Boise", - "America/Phoenix", - "America/Los_Angeles", - "America/Anchorage", - "America/Juneau", - "America/Sitka", - "America/Yakutat", - "America/Nome", - "America/Adak", - "America/Metlakatla", - "Pacific/Honolulu", - "America/Montevideo", - "Asia/Samarkand", - "Asia/Tashkent", - "Europe/Vatican", - "America/St_Vincent", - "America/Caracas", - "America/Tortola", - "America/St_Thomas", - "Asia/Ho_Chi_Minh", - "Pacific/Efate", - "Pacific/Wallis", - "Pacific/Apia", - "Asia/Aden", - "Indian/Mayotte", - "Africa/Johannesburg", - "Africa/Lusaka", - "Africa/Harare", - "UTC", -] +from enum import Enum + + +class Timezone(str, Enum): + EUROPE_ANDORRA = "Europe/Andorra" + ASIA_DUBAI = "Asia/Dubai" + ASIA_KABUL_ = "Asia/Kabul" + AMERICA_ANTIGUA_ = "America/Antigua" + AMERICA_ANGUILLA_ = "America/Anguilla" + EUROPE_TIRANE_ = "Europe/Tirane" + ASIA_YEREVAN_ = "Asia/Yerevan" + AFRICA_LUANDA_ = "Africa/Luanda" + ANTARCTICA_MCMURDO = "Antarctica/McMurdo" + ANTARCTICA_ROTHERA = "Antarctica/Rothera" + ANTARCTICA_PALMER = "Antarctica/Palmer" + ANTARCTICA_MAWSON = "Antarctica/Mawson" + ANTARCTICA_DAVIS = "Antarctica/Davis" + ANTARCTICA_CASEY = "Antarctica/Casey" + ANTARCTICA_VOSTOK = "Antarctica/Vostok" + ANTARCTICA_DUMONTDURVILLE = "Antarctica/DumontDUrville" + ANTARCTICA_SYOWA = "Antarctica/Syowa" + AMERICA_ARGENTINA_BUENOS_AIRES = "America/Argentina/Buenos_Aires" + AMERICA_ARGENTINA_CORDOBA = "America/Argentina/Cordoba" + AMERICA_ARGENTINA_SALTA = "America/Argentina/Salta" + AMERICA_ARGENTINA_JUJUY = "America/Argentina/Jujuy" + AMERICA_ARGENTINA_TUCUMAN = "America/Argentina/Tucuman" + AMERICA_ARGENTINA_CATAMARCA = "America/Argentina/Catamarca" + AMERICA_ARGENTINA_LA_RIOJA = "America/Argentina/La_Rioja" + AMERICA_ARGENTINA_SAN_JUAN = "America/Argentina/San_Juan" + AMERICA_ARGENTINA_MENDOZA = "America/Argentina/Mendoza" + AMERICA_ARGENTINA_SAN_LUIS = "America/Argentina/San_Luis" + AMERICA_ARGENTINA_RIO_GALLEGOS = "America/Argentina/Rio_Gallegos" + AMERICA_ARGENTINA_USHUAIA = "America/Argentina/Ushuaia" + PACIFIC_PAGO_PAGO = "Pacific/Pago_Pago" + EUROPE_VIENNA = "Europe/Vienna" + AUSTRALIA_LORD_HOWE = "Australia/Lord_Howe" + ANTARCTICA_MACQUARIE = "Antarctica/Macquarie" + AUSTRALIA_HOBART = "Australia/Hobart" + AUSTRALIA_CURRIE = "Australia/Currie" + AUSTRALIA_MELBOURNE = "Australia/Melbourne" + AUSTRALIA_SYDNEY = "Australia/Sydney" + AUSTRALIA_BROKEN_HILL = "Australia/Broken_Hill" + AUSTRALIA_BRISBANE = "Australia/Brisbane" + AUSTRALIA_LINDEMAN = "Australia/Lindeman" + AUSTRALIA_ADELAIDE = "Australia/Adelaide" + AUSTRALIA_DARWIN = "Australia/Darwin" + AUSTRALIA_PERTH = "Australia/Perth" + AUSTRALIA_EUCLA = "Australia/Eucla" + AMERICA_ARUBA = "America/Aruba" + EUROPE_MARIEHAMN = "Europe/Mariehamn" + ASIA_BAKU = "Asia/Baku" + EUROPE_SARAJEVO = "Europe/Sarajevo" + AMERICA_BARBADOS = "America/Barbados" + ASIA_DHAKA = "Asia/Dhaka" + EUROPE_BRUSSELS = "Europe/Brussels" + AFRICA_OUAGADOUGOU = "Africa/Ouagadougou" + EUROPE_SOFIA = "Europe/Sofia" + ASIA_BAHRAIN = "Asia/Bahrain" + AFRICA_BUJUMBURA = "Africa/Bujumbura" + AFRICA_PORTO_NOVO = "Africa/Porto-Novo" + AMERICA_ST_BARTHELEMY = "America/St_Barthelemy" + ATLANTIC_BERMUDA = "Atlantic/Bermuda" + ASIA_BRUNEI = "Asia/Brunei" + AMERICA_LA_PAZ = "America/La_Paz" + AMERICA_KRALENDIJK = "America/Kralendijk" + AMERICA_NORONHA = "America/Noronha" + AMERICA_BELEM = "America/Belem" + AMERICA_FORTALEZA = "America/Fortaleza" + AMERICA_RECIFE = "America/Recife" + AMERICA_ARAGUAINA = "America/Araguaina" + AMERICA_MACEIO = "America/Maceio" + AMERICA_BAHIA = "America/Bahia" + AMERICA_SAO_PAULO = "America/Sao_Paulo" + AMERICA_CAMPO_GRANDE = "America/Campo_Grande" + AMERICA_CUIABA = "America/Cuiaba" + AMERICA_SANTAREM = "America/Santarem" + AMERICA_PORTO_VELHO = "America/Porto_Velho" + AMERICA_BOA_VISTA = "America/Boa_Vista" + AMERICA_MANAUS = "America/Manaus" + AMERICA_EIRUNEPE = "America/Eirunepe" + AMERICA_RIO_BRANCO = "America/Rio_Branco" + AMERICA_NASSAU = "America/Nassau" + ASIA_THIMPHU = "Asia/Thimphu" + AFRICA_GABORONE = "Africa/Gaborone" + EUROPE_MINSK = "Europe/Minsk" + AMERICA_BELIZE = "America/Belize" + AMERICA_ST_JOHNS = "America/St_Johns" + AMERICA_HALIFAX = "America/Halifax" + AMERICA_GLACE_BAY = "America/Glace_Bay" + AMERICA_MONCTON = "America/Moncton" + AMERICA_GOOSE_BAY = "America/Goose_Bay" + AMERICA_BLANC_SABLON = "America/Blanc-Sablon" + AMERICA_TORONTO = "America/Toronto" + AMERICA_NIPIGON = "America/Nipigon" + AMERICA_THUNDER_BAY = "America/Thunder_Bay" + AMERICA_IQALUIT = "America/Iqaluit" + AMERICA_PANGNIRTUNG = "America/Pangnirtung" + AMERICA_RESOLUTE = "America/Resolute" + AMERICA_ATIKOKAN = "America/Atikokan" + AMERICA_RANKIN_INLET = "America/Rankin_Inlet" + AMERICA_WINNIPEG = "America/Winnipeg" + AMERICA_RAINY_RIVER = "America/Rainy_River" + AMERICA_REGINA = "America/Regina" + AMERICA_SWIFT_CURRENT = "America/Swift_Current" + AMERICA_EDMONTON = "America/Edmonton" + AMERICA_CAMBRIDGE_BAY = "America/Cambridge_Bay" + AMERICA_YELLOWKNIFE = "America/Yellowknife" + AMERICA_INUVIK = "America/Inuvik" + AMERICA_CRESTON = "America/Creston" + AMERICA_DAWSON_CREEK = "America/Dawson_Creek" + AMERICA_VANCOUVER = "America/Vancouver" + AMERICA_WHITEHORSE = "America/Whitehorse" + AMERICA_DAWSON = "America/Dawson" + INDIAN_COCOS = "Indian/Cocos" + AFRICA_KINSHASA = "Africa/Kinshasa" + AFRICA_LUBUMBASHI = "Africa/Lubumbashi" + AFRICA_BANGUI = "Africa/Bangui" + AFRICA_BRAZZAVILLE = "Africa/Brazzaville" + EUROPE_ZURICH = "Europe/Zurich" + AFRICA_ABIDJAN = "Africa/Abidjan" + PACIFIC_RAROTONGA = "Pacific/Rarotonga" + AMERICA_SANTIAGO = "America/Santiago" + PACIFIC_EASTER = "Pacific/Easter" + AFRICA_DOUALA = "Africa/Douala" + ASIA_SHANGHAI = "Asia/Shanghai" + ASIA_HARBIN = "Asia/Harbin" + ASIA_CHONGQING = "Asia/Chongqing" + ASIA_URUMQI = "Asia/Urumqi" + ASIA_KASHGAR = "Asia/Kashgar" + AMERICA_BOGOTA = "America/Bogota" + AMERICA_COSTA_RICA = "America/Costa_Rica" + AMERICA_HAVANA = "America/Havana" + ATLANTIC_CAPE_VERDE = "Atlantic/Cape_Verde" + AMERICA_CURACAO = "America/Curacao" + INDIAN_CHRISTMAS = "Indian/Christmas" + ASIA_NICOSIA = "Asia/Nicosia" + EUROPE_PRAGUE = "Europe/Prague" + EUROPE_BERLIN = "Europe/Berlin" + EUROPE_BUSINGEN = "Europe/Busingen" + AFRICA_DJIBOUTI = "Africa/Djibouti" + EUROPE_COPENHAGEN = "Europe/Copenhagen" + AMERICA_DOMINICA = "America/Dominica" + AMERICA_SANTO_DOMINGO = "America/Santo_Domingo" + AFRICA_ALGIERS = "Africa/Algiers" + AMERICA_GUAYAQUIL = "America/Guayaquil" + PACIFIC_GALAPAGOS = "Pacific/Galapagos" + EUROPE_TALLINN = "Europe/Tallinn" + AFRICA_CAIRO = "Africa/Cairo" + AFRICA_EL_AAIUN = "Africa/El_Aaiun" + AFRICA_ASMARA = "Africa/Asmara" + EUROPE_MADRID = "Europe/Madrid" + AFRICA_CEUTA = "Africa/Ceuta" + ATLANTIC_CANARY = "Atlantic/Canary" + AFRICA_ADDIS_ABABA = "Africa/Addis_Ababa" + EUROPE_HELSINKI = "Europe/Helsinki" + PACIFIC_FIJI = "Pacific/Fiji" + ATLANTIC_STANLEY = "Atlantic/Stanley" + PACIFIC_CHUUK = "Pacific/Chuuk" + PACIFIC_POHNPEI = "Pacific/Pohnpei" + PACIFIC_KOSRAE = "Pacific/Kosrae" + ATLANTIC_FAROE = "Atlantic/Faroe" + EUROPE_PARIS = "Europe/Paris" + AFRICA_LIBREVILLE = "Africa/Libreville" + EUROPE_LONDON = "Europe/London" + AMERICA_GRENADA = "America/Grenada" + ASIA_TBILISI = "Asia/Tbilisi" + AMERICA_CAYENNE = "America/Cayenne" + EUROPE_GUERNSEY = "Europe/Guernsey" + AFRICA_ACCRA = "Africa/Accra" + EUROPE_GIBRALTAR = "Europe/Gibraltar" + AMERICA_GODTHAB = "America/Godthab" + AMERICA_DANMARKSHAVN = "America/Danmarkshavn" + AMERICA_SCORESBYSUND = "America/Scoresbysund" + AMERICA_THULE = "America/Thule" + AFRICA_BANJUL = "Africa/Banjul" + AFRICA_CONAKRY = "Africa/Conakry" + AMERICA_GUADELOUPE = "America/Guadeloupe" + AFRICA_MALABO = "Africa/Malabo" + EUROPE_ATHENS = "Europe/Athens" + ATLANTIC_SOUTH_GEORGIA = "Atlantic/South_Georgia" + AMERICA_GUATEMALA = "America/Guatemala" + PACIFIC_GUAM = "Pacific/Guam" + AFRICA_BISSAU = "Africa/Bissau" + AMERICA_GUYANA = "America/Guyana" + ASIA_HONG_KONG = "Asia/Hong_Kong" + AMERICA_TEGUCIGALPA = "America/Tegucigalpa" + EUROPE_ZAGREB = "Europe/Zagreb" + AMERICA_PORT_AU_PRINCE = "America/Port-au-Prince" + EUROPE_BUDAPEST = "Europe/Budapest" + ASIA_JAKARTA = "Asia/Jakarta" + ASIA_PONTIANAK = "Asia/Pontianak" + ASIA_MAKASSAR = "Asia/Makassar" + ASIA_JAYAPURA = "Asia/Jayapura" + EUROPE_DUBLIN = "Europe/Dublin" + ASIA_JERUSALEM = "Asia/Jerusalem" + EUROPE_ISLE_OF_MAN = "Europe/Isle_of_Man" + ASIA_KOLKATA = "Asia/Kolkata" + INDIAN_CHAGOS = "Indian/Chagos" + ASIA_BAGHDAD = "Asia/Baghdad" + ASIA_TEHRAN = "Asia/Tehran" + ATLANTIC_REYKJAVIK = "Atlantic/Reykjavik" + EUROPE_ROME = "Europe/Rome" + EUROPE_JERSEY = "Europe/Jersey" + AMERICA_JAMAICA = "America/Jamaica" + ASIA_AMMAN = "Asia/Amman" + ASIA_TOKYO = "Asia/Tokyo" + AFRICA_NAIROBI = "Africa/Nairobi" + ASIA_BISHKEK = "Asia/Bishkek" + ASIA_PHNOM_PENH = "Asia/Phnom_Penh" + PACIFIC_TARAWA = "Pacific/Tarawa" + PACIFIC_ENDERBURY = "Pacific/Enderbury" + PACIFIC_KIRITIMATI = "Pacific/Kiritimati" + INDIAN_COMORO = "Indian/Comoro" + AMERICA_ST_KITTS = "America/St_Kitts" + ASIA_PYONGYANG = "Asia/Pyongyang" + ASIA_SEOUL = "Asia/Seoul" + ASIA_KUWAIT = "Asia/Kuwait" + AMERICA_CAYMAN = "America/Cayman" + ASIA_ALMATY = "Asia/Almaty" + ASIA_QYZYLORDA = "Asia/Qyzylorda" + ASIA_AQTOBE = "Asia/Aqtobe" + ASIA_AQTAU = "Asia/Aqtau" + ASIA_ORAL = "Asia/Oral" + ASIA_VIENTIANE = "Asia/Vientiane" + ASIA_BEIRUT = "Asia/Beirut" + AMERICA_ST_LUCIA = "America/St_Lucia" + EUROPE_VADUZ = "Europe/Vaduz" + ASIA_COLOMBO = "Asia/Colombo" + AFRICA_MONROVIA = "Africa/Monrovia" + AFRICA_MASERU = "Africa/Maseru" + EUROPE_VILNIUS = "Europe/Vilnius" + EUROPE_LUXEMBOURG = "Europe/Luxembourg" + EUROPE_RIGA = "Europe/Riga" + AFRICA_TRIPOLI = "Africa/Tripoli" + AFRICA_CASABLANCA = "Africa/Casablanca" + EUROPE_MONACO = "Europe/Monaco" + EUROPE_CHISINAU = "Europe/Chisinau" + EUROPE_PODGORICA = "Europe/Podgorica" + AMERICA_MARIGOT = "America/Marigot" + INDIAN_ANTANANARIVO = "Indian/Antananarivo" + PACIFIC_MAJURO = "Pacific/Majuro" + PACIFIC_KWAJALEIN = "Pacific/Kwajalein" + EUROPE_SKOPJE = "Europe/Skopje" + AFRICA_BAMAKO = "Africa/Bamako" + ASIA_RANGOON = "Asia/Rangoon" + ASIA_ULAANBAATAR = "Asia/Ulaanbaatar" + ASIA_HOVD = "Asia/Hovd" + ASIA_CHOIBALSAN = "Asia/Choibalsan" + ASIA_MACAU = "Asia/Macau" + PACIFIC_SAIPAN = "Pacific/Saipan" + AMERICA_MARTINIQUE = "America/Martinique" + AFRICA_NOUAKCHOTT = "Africa/Nouakchott" + AMERICA_MONTSERRAT = "America/Montserrat" + EUROPE_MALTA = "Europe/Malta" + INDIAN_MAURITIUS = "Indian/Mauritius" + INDIAN_MALDIVES = "Indian/Maldives" + AFRICA_BLANTYRE = "Africa/Blantyre" + AMERICA_MEXICO_CITY = "America/Mexico_City" + AMERICA_CANCUN = "America/Cancun" + AMERICA_MERIDA = "America/Merida" + AMERICA_MONTERREY = "America/Monterrey" + AMERICA_MATAMOROS = "America/Matamoros" + AMERICA_MAZATLAN = "America/Mazatlan" + AMERICA_CHIHUAHUA = "America/Chihuahua" + AMERICA_OJINAGA = "America/Ojinaga" + AMERICA_HERMOSILLO = "America/Hermosillo" + AMERICA_TIJUANA = "America/Tijuana" + AMERICA_SANTA_ISABEL = "America/Santa_Isabel" + AMERICA_BAHIA_BANDERAS = "America/Bahia_Banderas" + ASIA_KUALA_LUMPUR = "Asia/Kuala_Lumpur" + ASIA_KUCHING = "Asia/Kuching" + AFRICA_MAPUTO = "Africa/Maputo" + AFRICA_WINDHOEK = "Africa/Windhoek" + PACIFIC_NOUMEA = "Pacific/Noumea" + AFRICA_NIAMEY = "Africa/Niamey" + PACIFIC_NORFOLK = "Pacific/Norfolk" + AFRICA_LAGOS = "Africa/Lagos" + AMERICA_MANAGUA = "America/Managua" + EUROPE_AMSTERDAM = "Europe/Amsterdam" + EUROPE_OSLO = "Europe/Oslo" + ASIA_KATHMANDU = "Asia/Kathmandu" + PACIFIC_NAURU = "Pacific/Nauru" + PACIFIC_NIUE = "Pacific/Niue" + PACIFIC_AUCKLAND = "Pacific/Auckland" + PACIFIC_CHATHAM = "Pacific/Chatham" + ASIA_MUSCAT = "Asia/Muscat" + AMERICA_PANAMA = "America/Panama" + AMERICA_LIMA = "America/Lima" + PACIFIC_TAHITI = "Pacific/Tahiti" + PACIFIC_MARQUESAS = "Pacific/Marquesas" + PACIFIC_GAMBIER = "Pacific/Gambier" + PACIFIC_PORT_MORESBY = "Pacific/Port_Moresby" + ASIA_MANILA = "Asia/Manila" + ASIA_KARACHI = "Asia/Karachi" + EUROPE_WARSAW = "Europe/Warsaw" + AMERICA_MIQUELON = "America/Miquelon" + PACIFIC_PITCAIRN = "Pacific/Pitcairn" + AMERICA_PUERTO_RICO = "America/Puerto_Rico" + ASIA_GAZA = "Asia/Gaza" + ASIA_HEBRON = "Asia/Hebron" + EUROPE_LISBON = "Europe/Lisbon" + ATLANTIC_MADEIRA = "Atlantic/Madeira" + ATLANTIC_AZORES = "Atlantic/Azores" + PACIFIC_PALAU = "Pacific/Palau" + AMERICA_ASUNCION = "America/Asuncion" + ASIA_QATAR = "Asia/Qatar" + INDIAN_REUNION = "Indian/Reunion" + EUROPE_BUCHAREST = "Europe/Bucharest" + EUROPE_BELGRADE = "Europe/Belgrade" + EUROPE_KALININGRAD = "Europe/Kaliningrad" + EUROPE_MOSCOW = "Europe/Moscow" + EUROPE_VOLGOGRAD = "Europe/Volgograd" + EUROPE_SAMARA = "Europe/Samara" + ASIA_YEKATERINBURG = "Asia/Yekaterinburg" + ASIA_OMSK = "Asia/Omsk" + ASIA_NOVOSIBIRSK = "Asia/Novosibirsk" + ASIA_NOVOKUZNETSK = "Asia/Novokuznetsk" + ASIA_KRASNOYARSK = "Asia/Krasnoyarsk" + ASIA_IRKUTSK = "Asia/Irkutsk" + ASIA_YAKUTSK = "Asia/Yakutsk" + ASIA_KHANDYGA = "Asia/Khandyga" + ASIA_VLADIVOSTOK = "Asia/Vladivostok" + ASIA_SAKHALIN = "Asia/Sakhalin" + ASIA_UST_NERA = "Asia/Ust-Nera" + ASIA_MAGADAN = "Asia/Magadan" + ASIA_KAMCHATKA = "Asia/Kamchatka" + ASIA_ANADYR = "Asia/Anadyr" + AFRICA_KIGALI = "Africa/Kigali" + ASIA_RIYADH = "Asia/Riyadh" + PACIFIC_GUADALCANAL = "Pacific/Guadalcanal" + INDIAN_MAHE = "Indian/Mahe" + AFRICA_KHARTOUM = "Africa/Khartoum" + EUROPE_STOCKHOLM = "Europe/Stockholm" + ASIA_SINGAPORE = "Asia/Singapore" + ATLANTIC_ST_HELENA = "Atlantic/St_Helena" + EUROPE_LJUBLJANA = "Europe/Ljubljana" + ARCTIC_LONGYEARBYEN = "Arctic/Longyearbyen" + EUROPE_BRATISLAVA = "Europe/Bratislava" + AFRICA_FREETOWN = "Africa/Freetown" + EUROPE_SAN_MARINO = "Europe/San_Marino" + AFRICA_DAKAR = "Africa/Dakar" + AFRICA_MOGADISHU = "Africa/Mogadishu" + AMERICA_PARAMARIBO = "America/Paramaribo" + AFRICA_JUBA = "Africa/Juba" + AFRICA_SAO_TOME = "Africa/Sao_Tome" + AMERICA_EL_SALVADOR = "America/El_Salvador" + AMERICA_LOWER_PRINCES = "America/Lower_Princes" + ASIA_DAMASCUS = "Asia/Damascus" + AFRICA_MBABANE = "Africa/Mbabane" + AMERICA_GRAND_TURK = "America/Grand_Turk" + AFRICA_NDJAMENA = "Africa/Ndjamena" + INDIAN_KERGUELEN = "Indian/Kerguelen" + AFRICA_LOME = "Africa/Lome" + ASIA_BANGKOK = "Asia/Bangkok" + ASIA_DUSHANBE = "Asia/Dushanbe" + PACIFIC_FAKAOFO = "Pacific/Fakaofo" + ASIA_DILI = "Asia/Dili" + ASIA_ASHGABAT = "Asia/Ashgabat" + AFRICA_TUNIS = "Africa/Tunis" + PACIFIC_TONGATAPU = "Pacific/Tongatapu" + EUROPE_ISTANBUL = "Europe/Istanbul" + AMERICA_PORT_OF_SPAIN = "America/Port_of_Spain" + PACIFIC_FUNAFUTI = "Pacific/Funafuti" + ASIA_TAIPEI = "Asia/Taipei" + AFRICA_DAR_ES_SALAAM = "Africa/Dar_es_Salaam" + EUROPE_KIEV = "Europe/Kiev" + EUROPE_UZHGOROD = "Europe/Uzhgorod" + EUROPE_ZAPOROZHYE = "Europe/Zaporozhye" + EUROPE_SIMFEROPOL = "Europe/Simferopol" + AFRICA_KAMPALA = "Africa/Kampala" + PACIFIC_JOHNSTON = "Pacific/Johnston" + PACIFIC_MIDWAY = "Pacific/Midway" + PACIFIC_WAKE = "Pacific/Wake" + AMERICA_NEW_YORK = "America/New_York" + AMERICA_DETROIT = "America/Detroit" + AMERICA_KENTUCKY_LOUISVILLE = "America/Kentucky/Louisville" + AMERICA_KENTUCKY_MONTICELLO = "America/Kentucky/Monticello" + AMERICA_INDIANA_INDIANAPOLIS = "America/Indiana/Indianapolis" + AMERICA_INDIANA_VINCENNES = "America/Indiana/Vincennes" + AMERICA_INDIANA_WINAMAC = "America/Indiana/Winamac" + AMERICA_INDIANA_MARENGO = "America/Indiana/Marengo" + AMERICA_INDIANA_PETERSBURG = "America/Indiana/Petersburg" + AMERICA_INDIANA_VEVAY = "America/Indiana/Vevay" + AMERICA_CHICAGO = "America/Chicago" + AMERICA_INDIANA_TELL_CITY = "America/Indiana/Tell_City" + AMERICA_INDIANA_KNOX = "America/Indiana/Knox" + AMERICA_MENOMINEE = "America/Menominee" + AMERICA_NORTH_DAKOTA_CENTER = "America/North_Dakota/Center" + AMERICA_NORTH_DAKOTA_NEW_SALEM = "America/North_Dakota/New_Salem" + AMERICA_NORTH_DAKOTA_BEULAH = "America/North_Dakota/Beulah" + AMERICA_DENVER = "America/Denver" + AMERICA_BOISE = "America/Boise" + AMERICA_PHOENIX = "America/Phoenix" + AMERICA_LOS_ANGELES = "America/Los_Angeles" + AMERICA_ANCHORAGE = "America/Anchorage" + AMERICA_JUNEAU = "America/Juneau" + AMERICA_SITKA = "America/Sitka" + AMERICA_YAKUTAT = "America/Yakutat" + AMERICA_NOME = "America/Nome" + AMERICA_ADAK = "America/Adak" + AMERICA_METLAKATLA = "America/Metlakatla" + PACIFIC_HONOLULU = "Pacific/Honolulu" + AMERICA_MONTEVIDEO = "America/Montevideo" + ASIA_SAMARKAND = "Asia/Samarkand" + ASIA_TASHKENT = "Asia/Tashkent" + EUROPE_VATICAN = "Europe/Vatican" + AMERICA_ST_VINCENT = "America/St_Vincent" + AMERICA_CARACAS = "America/Caracas" + AMERICA_TORTOLA = "America/Tortola" + AMERICA_ST_THOMAS = "America/St_Thomas" + ASIA_HO_CHI_MINH = "Asia/Ho_Chi_Minh" + PACIFIC_EFATE = "Pacific/Efate" + PACIFIC_WALLIS = "Pacific/Wallis" + PACIFIC_APIA = "Pacific/Apia" + ASIA_ADEN = "Asia/Aden" + INDIAN_MAYOTTE = "Indian/Mayotte" + AFRICA_JOHANNESBURG = "Africa/Johannesburg" + AFRICA_LUSAKA = "Africa/Lusaka" + AFRICA_HARARE = "Africa/Harare" + UTC = "UTC" diff --git a/catalystwan/vmanage_auth.py b/catalystwan/vmanage_auth.py index 2b2bf44d..47ce6809 100644 --- a/catalystwan/vmanage_auth.py +++ b/catalystwan/vmanage_auth.py @@ -118,7 +118,10 @@ def fetch_token(self, cookies: RequestsCookieJar) -> str: headers=headers, ) self.logger.debug(self._auth_request_debug(response)) - return response.text + token = response.text + if response.status_code != 200 or "" in token: + raise CatalystwanException("Failed to get XSRF token") + return token def __call__(self, prepared_request: PreparedRequest) -> PreparedRequest: if self.expiration_time is None: diff --git a/diagram.png b/diagram.png deleted file mode 100644 index 48e7b4e17592495bdfb4fbd7d8fe3d7dd1a6c935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142336 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
F^l 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 Rj3p*E|3~9FsroB_{vQdEu)_cV diff --git a/endpoints-md.py b/endpoints-md.py index edb4eda5..f59bcd9c 100644 --- a/endpoints-md.py +++ b/endpoints-md.py @@ -209,7 +209,7 @@ def md(self) -> str: # this instantiates APIEndpoints classes triggering method decorators # endpoints not attached to container will be not documented ! - APIEndpointContainter(MagicMock()) + _ = APIEndpointContainter(MagicMock()) endpoint_registry = EndpointRegistry( meta_lookup=request.request_lookup, diff --git a/examples/parcel_configuration_guide.py b/examples/parcel_configuration_guide.py index 17a9767f..4fb5e388 100644 --- a/examples/parcel_configuration_guide.py +++ b/examples/parcel_configuration_guide.py @@ -9,7 +9,7 @@ from catalystwan.api.feature_profile_api import PolicyObjectFeatureProfileAPI from catalystwan.endpoints.configuration_feature_profile import ConfigurationFeatureProfile -from catalystwan.models.configuration.feature_profile.common import ParcelCreationResponse +from catalystwan.models.configuration.feature_profile.parcel import ParcelCreationResponse from catalystwan.models.configuration.feature_profile.sdwan.policy_object import ( ApplicationListParcel, AppProbeParcel, diff --git a/examples/policies_configuration_guide.py b/examples/policies_configuration_guide.py index 1024215e..33919651 100644 --- a/examples/policies_configuration_guide.py +++ b/examples/policies_configuration_guide.py @@ -1,3 +1,5 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates + """ This example demonstrates usage of PolicyAPI in catalystwan Code below provides same results as obtained after executing workflow manually via WEB-UI according to: @@ -20,7 +22,7 @@ import logging import sys from dataclasses import dataclass -from ipaddress import IPv4Address, IPv4Network, IPv6Interface +from ipaddress import IPv4Address, IPv4Network, IPv6Network from typing import List, Optional, Sequence from uuid import UUID @@ -46,12 +48,12 @@ PrefixList, RegionList, SiteList, + SLAClassList, TLOCList, TrafficDataPolicy, VPNList, VPNMembershipPolicy, ) -from catalystwan.models.policy.lists import SLAClassList logger = logging.getLogger(__name__) @@ -127,8 +129,8 @@ def configure_groups_of_interest(api: PolicyAPI) -> List[ConfigItem]: configured_items.append(ConfigItem(DataPrefixList, data_prefix_list.name, data_prefix_list_id)) data_ipv6_prefix_list = DataIPv6PrefixList(name="MyDataIPv6Prefixes") - data_ipv6_prefix_list.add_prefix(IPv6Interface("2001:db8::1000/124")) - data_ipv6_prefix_list.add_prefix(IPv6Interface("2001:db9::1000/124")) + data_ipv6_prefix_list.add_prefix(IPv6Network("2001:db8::1000/124")) + data_ipv6_prefix_list.add_prefix(IPv6Network("2001:db9::1000/124")) data_ipv6_prefix_list_id = api.lists.create(data_ipv6_prefix_list) configured_items.append(ConfigItem(DataIPv6PrefixList, data_ipv6_prefix_list.name, data_ipv6_prefix_list_id)) @@ -184,7 +186,7 @@ def configure_groups_of_interest(api: PolicyAPI) -> List[ConfigItem]: configured_items.append(ConfigItem(ClassMapList, class_map.name, class_map_id)) app_probe_class = AppProbeClassList(name="MyAppProbeClass") - app_probe_class.assign_forwarding_class("MyClassMap").add_color_mapping("green", 5) + app_probe_class.assign_forwarding_class("MyClassMap").add_color_mapping("3g", 5) app_probe_class_id = api.lists.create(app_probe_class) configured_items.append(ConfigItem(AppProbeClassList, app_probe_class.name, app_probe_class_id)) @@ -365,7 +367,7 @@ def create_traffic_data_policy(api: PolicyAPI, items: List[ConfigItem]) -> Confi seq_2.match_dns_response() seq_2.match_low_plp() seq_2.match_secondary_destination_region() - seq_2.match_source_data_prefix_list([find_id(items, "MyDataPrefixes")]) + seq_2.match_source_data_prefix_list(find_id(items, "MyDataPrefixes")) seq_2.match_traffic_to_core() seq_2.match_destination_data_prefix_list(find_id(items, "MyDataPrefixes")) seq_2.associate_loss_correction_packet_duplication_action() diff --git a/pyproject.toml b/pyproject.toml index dc3be19d..a3c7dbe3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "catalystwan" -version = "0.33.7dev6" +version = "0.33.8dev0" description = "Cisco Catalyst WAN SDK for Python" authors = ["kagorski "] readme = "README.md"