catalystwan 0.31.0.dev2__tar.gz → 0.31.0.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/PKG-INFO +3 -2
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/partition_manager_api.py +5 -3
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/software_action_api.py +101 -40
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/template_api.py +12 -7
- catalystwan-0.31.0.dev3/catalystwan/api/templates/bool_str.py +4 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template.py +1 -1
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template_field.py +5 -6
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_bfd_model.py +5 -5
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_bgp_model.py +29 -70
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_logging_model.py +17 -13
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_ntp_model.py +5 -5
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_omp_model.py +7 -7
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_ospf.py +21 -17
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_ospfv3.py +31 -24
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_secure_internet_gateway.py +2 -3
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_snmp_model.py +5 -5
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_system.py +15 -15
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_vpn_interface_model.py +80 -64
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/omp_vsmart_model.py +7 -7
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/versions_utils.py +80 -20
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/software_actions.py +1 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_dashboard_status.py +3 -3
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_device_actions.py +6 -3
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_generate_payload.py +6 -4
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_serialize_model.py +1 -1
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_partition_manager_api.py +4 -4
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_software_action_api.py +68 -9
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_task_status_api.py +86 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_version_utils.py +101 -3
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/upgrades_helper.py +15 -8
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/pyproject.toml +3 -2
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/setup.py +4 -3
- catalystwan-0.31.0.dev2/catalystwan/utils/pydantic_validators.py +0 -32
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/LICENSE +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/README.md +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/abstractions.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/admin_tech_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/administration.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/alarms_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/api_container.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/basic_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/config_device_inventory_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/config_group_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/configuration_groups/parcel.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/dashboard_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/device_action_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/feature_profile_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/logs_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/monitoring_status_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/mtt_aaa_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/omp_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/packet_capture_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/parcel_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/policy_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/resource_pool_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/speedtest_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/task_status_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/README.md +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/cli_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/device_template/device_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/device_variable.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template_payload.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_aaa_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_banner_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cisco_vpn_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/cli_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/security_vsmart_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/supported.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/models/system_vsmart_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/aaa_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/aaa.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/accounting.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/radius.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/tacacs.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/aaa/feature/user.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/cisco_vpn_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/cisco_vpn.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/dns.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/ipv4route.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/ipv6route.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/cisco_vpn/feature/mapping.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/tenant/tenant.json.j2 +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/payloads/tenant/tenant_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/tenant_backup_restore_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/tenant_management_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/tenant_migration_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/dataclasses.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/administration_user_and_group.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/certificate_management_device.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/certificate_management_vmanage.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/client.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/cluster_management.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/device/software_update.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/disaster_recovery.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/access_control_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/control.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/device_access.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/mesh.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/qos_map.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/rewrite.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/rule_set.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/security_group.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/traffic_data.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/app.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/app_probe.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/as_path.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/class_map.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/color.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/community.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/data_prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/expanded_community.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/fqdn.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/geo_location.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/ips_signature.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/local_app.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/local_domain.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/mirror.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/policer.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/port.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/protocol_name.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/region.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/site.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/sla.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/tloc.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/url_black_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/url_white_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/vpn.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/list/zone.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/security_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/vedge_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration/policy/vsmart_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_device_inventory.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_device_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_feature_profile.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_group.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/configuration_settings.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/endpoints_container.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/misc.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/monitoring_device_details.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/monitoring_status.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/real_time_monitoring/reboot_history.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/sdavc_cloud_connector.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/tenant_backup_restore.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/tenant_management.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/tenant_migration.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/endpoints/troubleshooting_tools/device_connectivity.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/exceptions.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/logging.conf +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/common.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/common.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/config_migration.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/README.md +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/builder.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/common.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/policier.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/ospf.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/ospfv3.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/configuration/profile_type.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/device_inventory.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/feature_profile_parcel.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/misc/application_protocols.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/centralized.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/access_control_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/access_control_list_ipv6.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/control.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/device_access.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/device_access_ipv6.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/hub_and_spoke.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/mesh.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/qos_map.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/rewrite.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/rule_set.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/security_group.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/traffic_data.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/vpn_membership.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/definitions/zone_based_firewall.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/lists.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/lists_entries.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/localized.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/policy.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/policy_definition.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/policy_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/policy/security.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/models/tenant.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/response.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/session.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/Basic_Cisco_VPN_Model.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/banner_1.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/alias.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/basic.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/basic_no_value.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/children.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/children_nested.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/children_nested_datapath.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/basic/data_path.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/cisco_bfd.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/complex_aaa.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/complex_cisco_vpn.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/default_cisco_system.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/iuo.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/omp_1.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/omp_2.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/definitions/omp_3.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_aaa.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_banner.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_bfd.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_system.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/cisco_vpn.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/models/omp_vsmart.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/alias.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/basic.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/children.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/children_nested.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/children_nested_datapath.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/basic/data_path.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cedge_aaa.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_banner.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_bfd.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_system.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/cisco_vpn.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/schemas/omp-vsmart.json +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_chose_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/templates/test_deserialize_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_admin_tech_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_administration.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_alarms_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_cli_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_creation_tools.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_device_action_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_devices_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_endpoints.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_feature_template_field.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_logs_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_monitoring_status_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_mtt_aaa_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_omp_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_packet_capture.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_response.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_session.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_speed_test_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_templates.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_tenant_backup_restore_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_tenant_management_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_tenant_migration_api.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_typed_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_version.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/tests/test_vmanage_auth.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/typed_list.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/__init__.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/alarm_status.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/certificate_status.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/colors.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/config_status.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/creation_tools.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/dashboard.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/device_model.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/dict.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/feature_template.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/operation_status.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/personality.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/pydantic_field.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/reachability.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/session_type.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/template_type.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/timezone.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/utils/validate_status.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/version.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/vmanage_auth.py +0 -0
- {catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/workflows/tenant_migration.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: catalystwan
|
|
3
|
-
Version: 0.31.0.
|
|
3
|
+
Version: 0.31.0.dev3
|
|
4
4
|
Summary: Cisco Catalyst WAN SDK for Python
|
|
5
5
|
Home-page: https://github.com/CiscoDevNet/catalystwan
|
|
6
6
|
Author: kagorski
|
|
@@ -17,11 +17,12 @@ Requires-Dist: ciscoconfparse (==1.9.41)
|
|
|
17
17
|
Requires-Dist: clint (>=0.5.1,<0.6.0)
|
|
18
18
|
Requires-Dist: flake8-quotes (>=3.3.1,<4.0.0)
|
|
19
19
|
Requires-Dist: packaging (>=23.0,<24.0)
|
|
20
|
-
Requires-Dist: pydantic (
|
|
20
|
+
Requires-Dist: pydantic (>=2.5,<3.0)
|
|
21
21
|
Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
|
|
22
22
|
Requires-Dist: requests (>=2.27.1,<3.0.0)
|
|
23
23
|
Requires-Dist: requests-toolbelt (>=1.0.0,<2.0.0)
|
|
24
24
|
Requires-Dist: tenacity (>=8.1.0,<9.0.0)
|
|
25
|
+
Requires-Dist: typing-extensions (>=4.6.1,<5.0.0)
|
|
25
26
|
Project-URL: Repository, https://github.com/CiscoDevNet/catalystwan
|
|
26
27
|
Description-Content-Type: text/markdown
|
|
27
28
|
|
{catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/partition_manager_api.py
RENAMED
|
@@ -5,12 +5,12 @@ from typing import TYPE_CHECKING, List, Optional, cast
|
|
|
5
5
|
|
|
6
6
|
from catalystwan.api.task_status_api import Task
|
|
7
7
|
from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI
|
|
8
|
-
from catalystwan.dataclasses import Device
|
|
9
8
|
from catalystwan.endpoints.configuration_device_actions import (
|
|
10
9
|
PartitionActionPayload,
|
|
11
10
|
RemovePartitionActionPayload,
|
|
12
11
|
RemovePartitionDevice,
|
|
13
12
|
)
|
|
13
|
+
from catalystwan.endpoints.configuration_device_inventory import DeviceDetailsResponse
|
|
14
14
|
from catalystwan.exceptions import EmptyVersionPayloadError
|
|
15
15
|
from catalystwan.typed_list import DataSequence
|
|
16
16
|
from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity
|
|
@@ -48,7 +48,9 @@ class PartitionManagerAPI:
|
|
|
48
48
|
self.repository = RepositoryAPI(self.session)
|
|
49
49
|
self.device_version = DeviceVersions(self.session)
|
|
50
50
|
|
|
51
|
-
def set_default_partition(
|
|
51
|
+
def set_default_partition(
|
|
52
|
+
self, devices: DataSequence[DeviceDetailsResponse], partition: Optional[str] = None
|
|
53
|
+
) -> Task:
|
|
52
54
|
"""
|
|
53
55
|
Set default software versions for devices
|
|
54
56
|
|
|
@@ -82,7 +84,7 @@ class PartitionManagerAPI:
|
|
|
82
84
|
return Task(self.session, partition_action.id)
|
|
83
85
|
|
|
84
86
|
def remove_partition(
|
|
85
|
-
self, devices: DataSequence[
|
|
87
|
+
self, devices: DataSequence[DeviceDetailsResponse], partition: Optional[str] = None, force: bool = False
|
|
86
88
|
) -> Task:
|
|
87
89
|
"""
|
|
88
90
|
Remove chosen software version from device
|
|
@@ -5,14 +5,15 @@ from typing import TYPE_CHECKING, List, Optional, cast
|
|
|
5
5
|
|
|
6
6
|
from catalystwan.api.task_status_api import Task
|
|
7
7
|
from catalystwan.api.versions_utils import DeviceVersions, RepositoryAPI
|
|
8
|
-
from catalystwan.dataclasses import Device
|
|
9
8
|
from catalystwan.endpoints.configuration_device_actions import (
|
|
10
9
|
InstallActionPayload,
|
|
10
|
+
InstallData,
|
|
11
11
|
InstallDevice,
|
|
12
12
|
InstallInput,
|
|
13
13
|
PartitionActionPayload,
|
|
14
14
|
)
|
|
15
|
-
from catalystwan.
|
|
15
|
+
from catalystwan.endpoints.configuration_device_inventory import DeviceDetailsResponse
|
|
16
|
+
from catalystwan.exceptions import EmptyVersionPayloadError, ImageNotInRepositoryError # type: ignore
|
|
16
17
|
from catalystwan.typed_list import DataSequence
|
|
17
18
|
from catalystwan.utils.personality import Personality
|
|
18
19
|
from catalystwan.utils.upgrades_helper import get_install_specification, validate_personality_homogeneity
|
|
@@ -35,13 +36,12 @@ class SoftwareActionAPI:
|
|
|
35
36
|
session = create_manager_session(...)
|
|
36
37
|
|
|
37
38
|
# Prepare devices list
|
|
38
|
-
|
|
39
|
-
vsmarts =
|
|
39
|
+
controllers = session.endpoints.configuration_device_inventory.get_device_details('controllers')
|
|
40
|
+
vsmarts = controllers.filter(personality=Personality.VSMART)
|
|
40
41
|
software_image = "viptela-20.7.2-x86_64.tar.gz"
|
|
41
42
|
|
|
42
43
|
# Upgrade
|
|
43
|
-
upgrade_id = SoftwareActionAPI(session).install(devices =
|
|
44
|
-
software_image=software_image)
|
|
44
|
+
upgrade_id = SoftwareActionAPI(session).install(devices = vsmarts, software_image=software_image)
|
|
45
45
|
|
|
46
46
|
# Check upgrade status
|
|
47
47
|
TaskAPI(session, software_action_id).wait_for_completed()
|
|
@@ -54,20 +54,23 @@ class SoftwareActionAPI:
|
|
|
54
54
|
|
|
55
55
|
def activate(
|
|
56
56
|
self,
|
|
57
|
-
devices: DataSequence[
|
|
57
|
+
devices: DataSequence[DeviceDetailsResponse],
|
|
58
58
|
version_to_activate: Optional[str] = "",
|
|
59
59
|
image: Optional[str] = "",
|
|
60
60
|
) -> Task:
|
|
61
61
|
"""
|
|
62
|
-
Set chosen version as current version
|
|
62
|
+
Set chosen version as current version. Requires that selected devices have already version_to_activate
|
|
63
|
+
or image present in their available files.
|
|
63
64
|
|
|
64
65
|
Args:
|
|
65
|
-
devices (List[
|
|
66
|
+
devices (List[DeviceDetailsResponse]): For those devices software will be activated
|
|
66
67
|
version_to_activate (Optional[str]): version to be set as current version
|
|
67
|
-
image (Optional[str]):
|
|
68
|
+
image (Optional[str]): software image name in available files
|
|
68
69
|
|
|
69
|
-
Notice: Have to pass one of those arguments (version_to_activate,
|
|
70
|
-
|
|
70
|
+
Notice: Have to pass one of those arguments (version_to_activate, image)
|
|
71
|
+
|
|
72
|
+
Raises:
|
|
73
|
+
EmptyVersionPayloadError: If selected version_to_activate or image not detected in available files
|
|
71
74
|
|
|
72
75
|
Returns:
|
|
73
76
|
str: Activate software action id
|
|
@@ -78,7 +81,7 @@ class SoftwareActionAPI:
|
|
|
78
81
|
elif version_to_activate and not image:
|
|
79
82
|
version = cast(str, version_to_activate)
|
|
80
83
|
else:
|
|
81
|
-
raise
|
|
84
|
+
raise ValueError("You can not provide software_image and image version at the same time!")
|
|
82
85
|
|
|
83
86
|
payload_devices = self.device_versions.get_device_available(version, devices)
|
|
84
87
|
for device in payload_devices:
|
|
@@ -98,55 +101,111 @@ class SoftwareActionAPI:
|
|
|
98
101
|
|
|
99
102
|
def install(
|
|
100
103
|
self,
|
|
101
|
-
devices: DataSequence[
|
|
104
|
+
devices: DataSequence[DeviceDetailsResponse],
|
|
102
105
|
reboot: bool = False,
|
|
103
106
|
sync: bool = True,
|
|
104
|
-
|
|
105
|
-
|
|
107
|
+
v_edge_vpn: int = 0,
|
|
108
|
+
v_smart_vpn: int = 0,
|
|
109
|
+
image: Optional[str] = None,
|
|
110
|
+
image_version: Optional[str] = None,
|
|
106
111
|
downgrade_check: bool = True,
|
|
112
|
+
remote_server_name: Optional[str] = None,
|
|
113
|
+
remote_image_filename: Optional[str] = None,
|
|
107
114
|
) -> Task:
|
|
108
115
|
"""
|
|
109
116
|
Method to install new software
|
|
110
117
|
|
|
111
118
|
Args:
|
|
112
|
-
devices (List[
|
|
113
|
-
reboot (bool): reboot device after action end
|
|
119
|
+
devices (List[DeviceDetailsResponse]): For those devices software will be activated
|
|
120
|
+
reboot (bool, optional): reboot device after action end
|
|
114
121
|
sync (bool, optional): Synchronize settings. Defaults to True.
|
|
122
|
+
v_edge_vpn (int, optional): vEdge VPN
|
|
123
|
+
v_smart_vpn (int, optional): vSmart VPN
|
|
115
124
|
image (str): path to software image or its name from available files
|
|
116
125
|
image_version (str): version of software image
|
|
117
|
-
downgrade_check (bool): perform a downgrade check when applicable
|
|
126
|
+
downgrade_check (bool, optional): perform a downgrade check when applicable
|
|
127
|
+
remote_server_name (str): name of configured Remote Server
|
|
128
|
+
remote_image_filename (str): filename to choose from selected Remote Server
|
|
118
129
|
|
|
119
|
-
Notice: Have to pass one of those
|
|
120
|
-
|
|
130
|
+
Notice: Have to pass one of those:
|
|
131
|
+
- image_version
|
|
132
|
+
- image
|
|
133
|
+
- remote_server_name and remote_image_filename
|
|
121
134
|
|
|
122
135
|
Raises:
|
|
123
|
-
ValueError: Raise error if downgrade in certain cases
|
|
136
|
+
ValueError: Raise error if downgrade in certain cases or wrong arguments combination provided
|
|
137
|
+
ImageNotInRepositoryError: If selected image, image_version or remote_image_filename not found
|
|
124
138
|
|
|
125
139
|
Returns:
|
|
126
140
|
Task: Task object representing started install process
|
|
127
141
|
"""
|
|
128
142
|
validate_personality_homogeneity(devices)
|
|
129
|
-
|
|
143
|
+
|
|
144
|
+
if (
|
|
145
|
+
sum(
|
|
146
|
+
[
|
|
147
|
+
image is not None,
|
|
148
|
+
image_version is not None,
|
|
149
|
+
all([remote_server_name is not None, remote_image_filename is not None]),
|
|
150
|
+
]
|
|
151
|
+
)
|
|
152
|
+
!= 1
|
|
153
|
+
):
|
|
154
|
+
raise ValueError(
|
|
155
|
+
"Please provide one option to detect software to install."
|
|
156
|
+
"Pick either 'image', 'image_version', or both 'remote_server_name' and 'remote_image_filename'."
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# FIXME downgrade_check will be supported when software images from Remote Server will have versions fields
|
|
160
|
+
if remote_server_name and remote_image_filename and downgrade_check:
|
|
161
|
+
raise ValueError("Downgrade check is not supported for install action for images from Remote Server.")
|
|
162
|
+
|
|
163
|
+
version, remote_image_details = None, None
|
|
164
|
+
if image:
|
|
130
165
|
version = cast(str, self.repository.get_image_version(image))
|
|
131
|
-
|
|
166
|
+
if image_version:
|
|
132
167
|
version = cast(str, image_version)
|
|
133
|
-
|
|
134
|
-
|
|
168
|
+
if remote_server_name and remote_image_filename:
|
|
169
|
+
remote_image_details = self.repository.get_remote_image(remote_image_filename, remote_server_name)
|
|
135
170
|
|
|
136
|
-
|
|
171
|
+
if not any([version, remote_image_details]):
|
|
172
|
+
raise ImageNotInRepositoryError(
|
|
173
|
+
"Based on provided arguments, software version to install on device(s) cannot be detected."
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
install_specification = get_install_specification(devices.first(), remote=bool(remote_image_details))
|
|
137
177
|
install_devices = [
|
|
138
178
|
InstallDevice(**device.model_dump(by_alias=True))
|
|
139
179
|
for device in self.device_versions.get_device_list(devices)
|
|
140
180
|
]
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
181
|
+
|
|
182
|
+
if version:
|
|
183
|
+
input = InstallInput(
|
|
184
|
+
v_edge_vpn=v_edge_vpn,
|
|
185
|
+
v_smart_vpn=v_smart_vpn,
|
|
186
|
+
family=install_specification.family.value,
|
|
187
|
+
version=version,
|
|
188
|
+
version_type=install_specification.version_type.value,
|
|
189
|
+
reboot=reboot,
|
|
190
|
+
sync=sync,
|
|
191
|
+
)
|
|
192
|
+
else:
|
|
193
|
+
input = InstallInput(
|
|
194
|
+
v_edge_vpn=v_edge_vpn,
|
|
195
|
+
v_smart_vpn=v_smart_vpn,
|
|
196
|
+
data=[
|
|
197
|
+
InstallData(
|
|
198
|
+
family=install_specification.family.value,
|
|
199
|
+
version=remote_image_details.version_id, # type: ignore
|
|
200
|
+
remote_server_id=remote_image_details.remote_server_id, # type: ignore
|
|
201
|
+
version_id=remote_image_details.version_id, # type: ignore
|
|
202
|
+
)
|
|
203
|
+
],
|
|
204
|
+
version_type=install_specification.version_type.value,
|
|
205
|
+
reboot=reboot,
|
|
206
|
+
sync=sync,
|
|
207
|
+
)
|
|
208
|
+
|
|
150
209
|
device_type = install_specification.device_type.value
|
|
151
210
|
install_payload = InstallActionPayload(
|
|
152
211
|
action="install", input=input, devices=install_devices, device_type=device_type
|
|
@@ -154,7 +213,9 @@ class SoftwareActionAPI:
|
|
|
154
213
|
|
|
155
214
|
if downgrade_check and devices.first().personality in (Personality.VMANAGE, Personality.EDGE):
|
|
156
215
|
self._downgrade_check(
|
|
157
|
-
install_payload.devices,
|
|
216
|
+
install_payload.devices,
|
|
217
|
+
install_payload.input.version, # type: ignore
|
|
218
|
+
install_specification.family.value, # type: ignore
|
|
158
219
|
)
|
|
159
220
|
|
|
160
221
|
install_action = self.session.endpoints.configuration_device_actions.process_install_operation(
|
|
@@ -170,10 +231,10 @@ class SoftwareActionAPI:
|
|
|
170
231
|
|
|
171
232
|
Args:
|
|
172
233
|
version_to_upgrade (str): version to upgrade
|
|
173
|
-
|
|
234
|
+
payload_devices List[InstallDevice]: list of Devices to check downgrade possibility
|
|
174
235
|
|
|
175
|
-
|
|
176
|
-
|
|
236
|
+
Raises:
|
|
237
|
+
ValueError: If for any of the devices upgrade action is denied
|
|
177
238
|
"""
|
|
178
239
|
incorrect_devices = []
|
|
179
240
|
devices_versions_repo = self.repository.get_devices_versions_repository()
|
|
@@ -382,7 +382,9 @@ class TemplatesAPI:
|
|
|
382
382
|
if self.is_created_by_generator(template):
|
|
383
383
|
debug = False
|
|
384
384
|
schema = self.get_feature_template_schema(template, debug)
|
|
385
|
-
payload = self.generate_feature_template_payload(template, schema, debug).model_dump(
|
|
385
|
+
payload = self.generate_feature_template_payload(template, schema, debug).model_dump(
|
|
386
|
+
by_alias=True, mode="json"
|
|
387
|
+
)
|
|
386
388
|
else:
|
|
387
389
|
payload = json.loads(template.generate_payload(self.session))
|
|
388
390
|
|
|
@@ -541,7 +543,7 @@ class TemplatesAPI:
|
|
|
541
543
|
payload = self.generate_feature_template_payload(template, schema, debug)
|
|
542
544
|
|
|
543
545
|
endpoint = "/dataservice/template/feature"
|
|
544
|
-
response = self.session.post(endpoint, json=payload.model_dump(by_alias=True, exclude_none=True))
|
|
546
|
+
response = self.session.post(endpoint, json=payload.model_dump(by_alias=True, exclude_none=True, mode="json"))
|
|
545
547
|
|
|
546
548
|
return response.json()["templateId"]
|
|
547
549
|
|
|
@@ -557,9 +559,9 @@ class TemplatesAPI:
|
|
|
557
559
|
) # type: ignore
|
|
558
560
|
|
|
559
561
|
fr_template_fields = [FeatureTemplateField(**field) for field in schema["fields"]] # TODO
|
|
560
|
-
|
|
562
|
+
json_dumped_template = template.model_dump(mode="json")
|
|
561
563
|
# "name"
|
|
562
|
-
for
|
|
564
|
+
for field in fr_template_fields:
|
|
563
565
|
value = None
|
|
564
566
|
priority_order = None
|
|
565
567
|
# TODO How to discover Device specific variable
|
|
@@ -575,16 +577,19 @@ class TemplatesAPI:
|
|
|
575
577
|
):
|
|
576
578
|
priority_order = get_extra_field(field_value, "priority_order") # type: ignore
|
|
577
579
|
value = getattr(template, field_name)
|
|
580
|
+
json_dumped_value = json_dumped_template.get(field_name)
|
|
578
581
|
break
|
|
579
582
|
if value is None:
|
|
580
583
|
continue
|
|
581
584
|
|
|
582
|
-
|
|
583
|
-
|
|
585
|
+
payload.definition = merge(
|
|
586
|
+
payload.definition,
|
|
587
|
+
field.payload_scheme(value, json_dumped_value=json_dumped_value, priority_order=priority_order),
|
|
588
|
+
)
|
|
584
589
|
|
|
585
590
|
if debug:
|
|
586
591
|
with open(f"payload_{template.type}.json", "w") as f:
|
|
587
|
-
f.write(json.dumps(payload.model_dump(by_alias=True), indent=4))
|
|
592
|
+
f.write(json.dumps(payload.model_dump(by_alias=True, mode="json"), indent=4))
|
|
588
593
|
|
|
589
594
|
return payload
|
|
590
595
|
|
{catalystwan-0.31.0.dev2 → catalystwan-0.31.0.dev3}/catalystwan/api/templates/feature_template.py
RENAMED
|
@@ -29,7 +29,7 @@ class FeatureTemplate(BaseModel, ABC):
|
|
|
29
29
|
undefined=DebugUndefined,
|
|
30
30
|
)
|
|
31
31
|
template = env.get_template(self.payload_path.name)
|
|
32
|
-
output = template.render(self.model_dump())
|
|
32
|
+
output = template.render(self.model_dump(mode="json"))
|
|
33
33
|
|
|
34
34
|
ast = env.parse(output)
|
|
35
35
|
if meta.find_undeclared_variables(ast):
|
|
@@ -89,7 +89,7 @@ class FeatureTemplateField(BaseModel):
|
|
|
89
89
|
|
|
90
90
|
# value must be JSON serializable, return JSON serializable dict
|
|
91
91
|
def payload_scheme(
|
|
92
|
-
self, value: Any = None,
|
|
92
|
+
self, value: Any = None, json_dumped_value: Any = None, priority_order=None, vip_type=None
|
|
93
93
|
) -> dict:
|
|
94
94
|
output: dict = {}
|
|
95
95
|
rel_output: dict = {}
|
|
@@ -119,10 +119,9 @@ class FeatureTemplateField(BaseModel):
|
|
|
119
119
|
if self.children:
|
|
120
120
|
children_output = []
|
|
121
121
|
for obj in value: # obj is User, atomic value. Loop every child
|
|
122
|
+
obj_json_dump = obj.model_dump(mode="json")
|
|
122
123
|
child_payload: dict = {}
|
|
123
124
|
for child in self.children: # Child in schema
|
|
124
|
-
if current_path is None:
|
|
125
|
-
current_path = []
|
|
126
125
|
obj: FeatureTemplate # type: ignore
|
|
127
126
|
model_tuple = next(
|
|
128
127
|
filter(
|
|
@@ -137,14 +136,14 @@ class FeatureTemplateField(BaseModel):
|
|
|
137
136
|
)
|
|
138
137
|
model_field = model_tuple[1]
|
|
139
138
|
obj_value = getattr(obj, model_tuple[0])
|
|
139
|
+
obj_json_value = obj_json_dump.get(model_tuple[0])
|
|
140
140
|
po = get_extra_field(model_field, "priority_order")
|
|
141
141
|
vip_type = get_extra_field(model_field, "vip_type")
|
|
142
142
|
merge(
|
|
143
143
|
child_payload,
|
|
144
144
|
child.payload_scheme(
|
|
145
145
|
obj_value,
|
|
146
|
-
|
|
147
|
-
current_path=self.dataPath + [self.key],
|
|
146
|
+
json_dumped_value=obj_json_value,
|
|
148
147
|
priority_order=po,
|
|
149
148
|
vip_type=vip_type,
|
|
150
149
|
),
|
|
@@ -154,7 +153,7 @@ class FeatureTemplateField(BaseModel):
|
|
|
154
153
|
children_output.append(child_payload)
|
|
155
154
|
output["vipValue"] = children_output
|
|
156
155
|
else:
|
|
157
|
-
output["vipValue"] =
|
|
156
|
+
output["vipValue"] = json_dumped_value
|
|
158
157
|
else:
|
|
159
158
|
if value is None:
|
|
160
159
|
return {}
|
|
@@ -2,10 +2,10 @@ from enum import Enum
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import ClassVar, List, Optional
|
|
4
4
|
|
|
5
|
-
from pydantic import ConfigDict, Field
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
6
6
|
|
|
7
|
+
from catalystwan.api.templates.bool_str import BoolStr
|
|
7
8
|
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
8
|
-
from catalystwan.utils.pydantic_validators import ConvertBoolToStringModel
|
|
9
9
|
|
|
10
10
|
DEFAULT_BFD_COLOR_MULTIPLIER = 7
|
|
11
11
|
DEFAULT_BFD_DSCP = 48
|
|
@@ -39,18 +39,18 @@ class ColorType(str, Enum):
|
|
|
39
39
|
PRIVATE6 = "private6"
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class Color(
|
|
42
|
+
class Color(BaseModel):
|
|
43
43
|
color: ColorType
|
|
44
44
|
hello_interval: Optional[int] = Field(
|
|
45
45
|
DEFAULT_BFD_HELLO_INTERVAL, json_schema_extra={"vmanage_key": "hello-interval"}
|
|
46
46
|
)
|
|
47
47
|
multiplier: Optional[int] = DEFAULT_BFD_COLOR_MULTIPLIER
|
|
48
|
-
pmtu_discovery: Optional[
|
|
48
|
+
pmtu_discovery: Optional[BoolStr] = Field(default=True, json_schema_extra={"vmanage_key": "pmtu-discovery"})
|
|
49
49
|
dscp: Optional[int] = DEFAULT_BFD_DSCP
|
|
50
50
|
model_config = ConfigDict(populate_by_name=True)
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
class CiscoBFDModel(FeatureTemplate
|
|
53
|
+
class CiscoBFDModel(FeatureTemplate):
|
|
54
54
|
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
|
|
55
55
|
|
|
56
56
|
multiplier: Optional[int] = Field(DEFAULT_BFD_MULTIPLIER, json_schema_extra={"data_path": ["app-route"]})
|
|
@@ -2,8 +2,9 @@ from enum import Enum
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import ClassVar, List, Optional
|
|
4
4
|
|
|
5
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
6
6
|
|
|
7
|
+
from catalystwan.api.templates.bool_str import BoolStr
|
|
7
8
|
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
8
9
|
|
|
9
10
|
|
|
@@ -42,16 +43,10 @@ class AddressFamilyType(str, Enum):
|
|
|
42
43
|
|
|
43
44
|
class AggregateAddress(BaseModel):
|
|
44
45
|
prefix: str
|
|
45
|
-
as_set: Optional[
|
|
46
|
-
summary_only: Optional[
|
|
46
|
+
as_set: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "as-set"})
|
|
47
|
+
summary_only: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "summary-only"})
|
|
47
48
|
model_config = ConfigDict(populate_by_name=True)
|
|
48
49
|
|
|
49
|
-
@field_validator("as_set", "summary_only")
|
|
50
|
-
@classmethod
|
|
51
|
-
def cast_to_str(cls, value):
|
|
52
|
-
if value is not None:
|
|
53
|
-
return str(value).lower()
|
|
54
|
-
|
|
55
50
|
|
|
56
51
|
class Ipv6AggregateAddress(BaseModel):
|
|
57
52
|
prefix: str
|
|
@@ -95,20 +90,14 @@ class AddressFamily(BaseModel):
|
|
|
95
90
|
network: Optional[List[Network]] = None
|
|
96
91
|
ipv6_network: Optional[List[Ipv6Network]] = Field(default=None, json_schema_extra={"vmanage_key": "ipv6-network"})
|
|
97
92
|
paths: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["maximum-paths"]})
|
|
98
|
-
originate: Optional[
|
|
93
|
+
originate: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["default-information"]})
|
|
99
94
|
policy_name: Optional[str] = Field(
|
|
100
95
|
default=None, json_schema_extra={"data_path": ["table-map"], "vmanage_key": "name"}
|
|
101
96
|
)
|
|
102
|
-
filter: Optional[
|
|
97
|
+
filter: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["table-map"]})
|
|
103
98
|
redistribute: Optional[List[Redistribute]] = None
|
|
104
99
|
model_config = ConfigDict(populate_by_name=True)
|
|
105
100
|
|
|
106
|
-
@field_validator("originate", "filter")
|
|
107
|
-
@classmethod
|
|
108
|
-
def cast_to_str(cls, value):
|
|
109
|
-
if value is not None:
|
|
110
|
-
return str(value).lower()
|
|
111
|
-
|
|
112
101
|
|
|
113
102
|
class NeighborFamilyType(str, Enum):
|
|
114
103
|
IPV4_UNICAST = "ipv4-unicast"
|
|
@@ -144,21 +133,23 @@ class NeighborAddressFamily(BaseModel):
|
|
|
144
133
|
class Neighbor(BaseModel):
|
|
145
134
|
address: str
|
|
146
135
|
description: Optional[str] = None
|
|
147
|
-
shutdown: Optional[
|
|
136
|
+
shutdown: Optional[BoolStr] = None
|
|
148
137
|
remote_as: int = Field(json_schema_extra={"vmanage_key": "remote-as"})
|
|
149
138
|
keepalive: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
|
|
150
139
|
holdtime: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
|
|
151
140
|
if_name: Optional[str] = Field(
|
|
152
141
|
default=None, json_schema_extra={"data_path": ["update-source"], "vmanage_key": "if-name"}
|
|
153
142
|
)
|
|
154
|
-
next_hop_self: Optional[
|
|
155
|
-
send_community: Optional[
|
|
156
|
-
send_ext_community: Optional[
|
|
143
|
+
next_hop_self: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "next-hop-self"})
|
|
144
|
+
send_community: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "send-community"})
|
|
145
|
+
send_ext_community: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "send-ext-community"})
|
|
157
146
|
ebgp_multihop: Optional[int] = Field(default=None, json_schema_extra={"vmanage_key": "ebgp-multihop"})
|
|
158
147
|
password: Optional[str] = None
|
|
159
|
-
send_label: Optional[
|
|
160
|
-
send_label_explicit: Optional[
|
|
161
|
-
|
|
148
|
+
send_label: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "send-label"})
|
|
149
|
+
send_label_explicit: Optional[BoolStr] = Field(
|
|
150
|
+
default=None, json_schema_extra={"vmanage_key": "send-label-explicit"}
|
|
151
|
+
)
|
|
152
|
+
as_override: Optional[BoolStr] = Field(default=None, json_schema_extra={"vmanage_key": "as-override"})
|
|
162
153
|
as_number: Optional[int] = Field(
|
|
163
154
|
default=None, json_schema_extra={"data_path": ["allowas-in"], "vmanage_key": "as-number"}
|
|
164
155
|
)
|
|
@@ -167,20 +158,6 @@ class Neighbor(BaseModel):
|
|
|
167
158
|
)
|
|
168
159
|
model_config = ConfigDict(populate_by_name=True)
|
|
169
160
|
|
|
170
|
-
@field_validator(
|
|
171
|
-
"shutdown",
|
|
172
|
-
"next_hop_self",
|
|
173
|
-
"send_community",
|
|
174
|
-
"send_ext_community",
|
|
175
|
-
"send_label",
|
|
176
|
-
"send_label_explicit",
|
|
177
|
-
"as_override",
|
|
178
|
-
)
|
|
179
|
-
@classmethod
|
|
180
|
-
def cast_to_str(cls, value):
|
|
181
|
-
if value is not None:
|
|
182
|
-
return str(value).lower()
|
|
183
|
-
|
|
184
161
|
|
|
185
162
|
class IPv6NeighborFamilyType(str, Enum):
|
|
186
163
|
IPV6_UNICAST = "ipv6-unicast"
|
|
@@ -203,21 +180,23 @@ class IPv6NeighborAddressFamily(BaseModel):
|
|
|
203
180
|
class Ipv6Neighbor(BaseModel):
|
|
204
181
|
address: str
|
|
205
182
|
description: Optional[str] = None
|
|
206
|
-
shutdown: Optional[
|
|
183
|
+
shutdown: Optional[BoolStr] = None
|
|
207
184
|
remote_as: int = Field(default=None, json_schema_extra={"vmanage_key": "remote-as"})
|
|
208
185
|
keepalive: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
|
|
209
186
|
holdtime: Optional[int] = Field(default=None, json_schema_extra={"data_path": ["timers"]})
|
|
210
187
|
if_name: Optional[str] = Field(
|
|
211
188
|
default=None, json_schema_extra={"data_path": ["update-source"], "vmanage_key": "if-name"}
|
|
212
189
|
)
|
|
213
|
-
next_hop_self: Optional[
|
|
214
|
-
send_community: Optional[
|
|
215
|
-
send_ext_community: Optional[
|
|
190
|
+
next_hop_self: Optional[BoolStr] = Field(default=False, json_schema_extra={"vmanage_key": "next-hop-self"})
|
|
191
|
+
send_community: Optional[BoolStr] = Field(default=True, json_schema_extra={"vmanage_key": "send-community"})
|
|
192
|
+
send_ext_community: Optional[BoolStr] = Field(default=True, json_schema_extra={"vmanage_key": "send-ext-community"})
|
|
216
193
|
ebgp_multihop: Optional[int] = Field(1, json_schema_extra={"vmanage_key": "ebgp-multihop"})
|
|
217
194
|
password: Optional[str] = None
|
|
218
|
-
send_label: Optional[
|
|
219
|
-
send_label_explicit: Optional[
|
|
220
|
-
|
|
195
|
+
send_label: Optional[BoolStr] = Field(default=False, json_schema_extra={"vmanage_key": "send-label"})
|
|
196
|
+
send_label_explicit: Optional[BoolStr] = Field(
|
|
197
|
+
default=False, json_schema_extra={"vmanage_key": "send-label-explicit"}
|
|
198
|
+
)
|
|
199
|
+
as_override: Optional[BoolStr] = Field(default=False, json_schema_extra={"vmanage_key": "as-override"})
|
|
221
200
|
as_number: Optional[int] = Field(
|
|
222
201
|
default=None, json_schema_extra={"data_path": ["allowas-in"], "vmanage_key": "as-number"}
|
|
223
202
|
)
|
|
@@ -226,26 +205,12 @@ class Ipv6Neighbor(BaseModel):
|
|
|
226
205
|
)
|
|
227
206
|
model_config = ConfigDict(populate_by_name=True)
|
|
228
207
|
|
|
229
|
-
@field_validator(
|
|
230
|
-
"shutdown",
|
|
231
|
-
"next_hop_self",
|
|
232
|
-
"send_community",
|
|
233
|
-
"send_ext_community",
|
|
234
|
-
"send_label",
|
|
235
|
-
"send_label_explicit",
|
|
236
|
-
"as_override",
|
|
237
|
-
)
|
|
238
|
-
@classmethod
|
|
239
|
-
def cast_to_str(cls, value):
|
|
240
|
-
if value is not None:
|
|
241
|
-
return str(value).lower()
|
|
242
|
-
|
|
243
208
|
|
|
244
209
|
class CiscoBGPModel(FeatureTemplate):
|
|
245
210
|
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
|
|
246
211
|
|
|
247
212
|
as_num: Optional[str] = Field(default=None, json_schema_extra={"data_path": ["bgp"], "vmanage_key": "as-num"})
|
|
248
|
-
shutdown: Optional[
|
|
213
|
+
shutdown: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["bgp"]})
|
|
249
214
|
router_id: Optional[str] = Field(default=None, json_schema_extra={"data_path": ["bgp"], "vmanage_key": "router-id"})
|
|
250
215
|
propagate_aspath: Optional[bool] = Field(
|
|
251
216
|
default=None, json_schema_extra={"data_path": ["bgp"], "vmanage_key": "propagate-aspath"}
|
|
@@ -270,14 +235,14 @@ class CiscoBGPModel(FeatureTemplate):
|
|
|
270
235
|
always_compare: Optional[bool] = Field(
|
|
271
236
|
default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"], "vmanage_key": "always-compare"}
|
|
272
237
|
)
|
|
273
|
-
deterministic: Optional[
|
|
274
|
-
missing_as_worst: Optional[
|
|
238
|
+
deterministic: Optional[BoolStr] = Field(default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"]})
|
|
239
|
+
missing_as_worst: Optional[BoolStr] = Field(
|
|
275
240
|
default=None, json_schema_extra={"data_path": ["bgp", "best-path", "med"], "vmanage_key": "missing-as-worst"}
|
|
276
241
|
)
|
|
277
|
-
compare_router_id: Optional[
|
|
242
|
+
compare_router_id: Optional[BoolStr] = Field(
|
|
278
243
|
default=None, json_schema_extra={"data_path": ["bgp", "best-path"], "vmanage_key": "compare-router-id"}
|
|
279
244
|
)
|
|
280
|
-
multipath_relax: Optional[
|
|
245
|
+
multipath_relax: Optional[BoolStr] = Field(
|
|
281
246
|
default=None, json_schema_extra={"data_path": ["bgp", "best-path", "as-path"], "vmanage_key": "multipath-relax"}
|
|
282
247
|
)
|
|
283
248
|
address_family: Optional[List[AddressFamily]] = Field(
|
|
@@ -290,9 +255,3 @@ class CiscoBGPModel(FeatureTemplate):
|
|
|
290
255
|
|
|
291
256
|
payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
|
|
292
257
|
type: ClassVar[str] = "cisco_bgp"
|
|
293
|
-
|
|
294
|
-
@field_validator("shutdown", "deterministic", "missing_as_worst", "compare_router_id", "multipath_relax")
|
|
295
|
-
@classmethod
|
|
296
|
-
def cast_to_str(cls, value):
|
|
297
|
-
if value is not None:
|
|
298
|
-
return str(value).lower()
|