catalystwan 0.41.2__py3-none-any.whl → 0.41.2.dev1__py3-none-any.whl
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/__init__.py +3 -2
- catalystwan/api/administration.py +13 -2
- catalystwan/api/api_container.py +4 -1
- catalystwan/api/builders/__init__.py +14 -0
- catalystwan/api/builders/feature_profiles/__init__.py +0 -0
- catalystwan/api/builders/feature_profiles/application_priority.py +58 -0
- catalystwan/api/builders/feature_profiles/builder_factory.py +59 -0
- catalystwan/api/builders/feature_profiles/cli.py +76 -0
- catalystwan/api/builders/feature_profiles/mixins.py +44 -0
- catalystwan/api/builders/feature_profiles/other.py +79 -0
- catalystwan/api/builders/feature_profiles/report.py +155 -0
- catalystwan/api/builders/feature_profiles/service.py +248 -0
- catalystwan/api/builders/feature_profiles/system.py +80 -0
- catalystwan/api/builders/feature_profiles/transport.py +256 -0
- catalystwan/api/builders/feature_profiles/uc_voice.py +287 -0
- catalystwan/api/config_group_api.py +41 -16
- catalystwan/api/configuration_groups/parcel.py +100 -30
- catalystwan/api/feature_profile_api.py +2021 -242
- catalystwan/api/policy_api.py +470 -116
- catalystwan/api/template_api.py +113 -44
- catalystwan/api/templates/README.md +61 -47
- catalystwan/api/templates/cli_template.py +17 -7
- catalystwan/api/templates/device_template/device_template.py +127 -32
- catalystwan/api/templates/feature_template.py +3 -3
- catalystwan/api/templates/models/aaa_model.py +387 -0
- catalystwan/api/templates/models/cisco_aaa_model.py +289 -42
- catalystwan/api/templates/models/cisco_banner_model.py +11 -2
- catalystwan/api/templates/models/cisco_bfd_model.py +31 -36
- catalystwan/api/templates/models/cisco_bgp_model.py +382 -131
- catalystwan/api/templates/models/cisco_logging_model.py +80 -43
- catalystwan/api/templates/models/cisco_ntp_model.py +34 -15
- catalystwan/api/templates/models/cisco_omp_model.py +70 -60
- catalystwan/api/templates/models/cisco_ospf.py +143 -74
- catalystwan/api/templates/models/cisco_ospfv3.py +217 -95
- catalystwan/api/templates/models/cisco_secure_internet_gateway.py +304 -142
- catalystwan/api/templates/models/cisco_snmp_model.py +66 -52
- catalystwan/api/templates/models/cisco_system.py +238 -129
- catalystwan/api/templates/models/cisco_vpn_interface_model.py +632 -275
- catalystwan/api/templates/models/cisco_vpn_model.py +433 -270
- catalystwan/api/templates/models/cli_template.py +3 -2
- catalystwan/api/templates/models/omp_vsmart_model.py +46 -10
- catalystwan/api/templates/models/security_vsmart_model.py +11 -8
- catalystwan/api/templates/models/supported.py +10 -4
- catalystwan/api/templates/models/system_vsmart_model.py +164 -27
- catalystwan/api/templates/models/vpn_vsmart_interface_model.py +198 -0
- catalystwan/api/templates/models/vpn_vsmart_model.py +124 -0
- catalystwan/apigw_auth.py +6 -2
- catalystwan/dataclasses.py +2 -53
- catalystwan/endpoints/__init__.py +41 -41
- catalystwan/endpoints/certificate_management_device.py +4 -0
- catalystwan/endpoints/cluster_management.py +27 -7
- catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +107 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +60 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +83 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +88 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +62 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +35 -12
- catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +154 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +88 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +164 -11
- catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +93 -0
- catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +144 -26
- catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +77 -0
- catalystwan/endpoints/configuration/network_hierarchy.py +32 -0
- catalystwan/endpoints/configuration/policy/abstractions.py +49 -0
- catalystwan/endpoints/configuration/policy/definition/access_control_list.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/aip.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/amp.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/app_route.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/cflowd.py +46 -0
- catalystwan/endpoints/configuration/policy/definition/control.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/device_access.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/dial_peer.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/dns_security.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/fxo_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/fxs_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/mesh.py +2 -11
- catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +57 -0
- catalystwan/endpoints/configuration/policy/definition/qos_map.py +2 -11
- catalystwan/endpoints/configuration/policy/definition/rewrite.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/route_policy.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/rule_set.py +2 -11
- catalystwan/endpoints/configuration/policy/definition/security_group.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +59 -0
- catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +52 -0
- catalystwan/endpoints/configuration/policy/definition/traffic_data.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/url_filtering.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +6 -11
- catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +50 -0
- catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +6 -11
- catalystwan/endpoints/configuration/policy/list/app.py +3 -16
- catalystwan/endpoints/configuration/policy/list/app_probe.py +6 -15
- catalystwan/endpoints/configuration/policy/list/as_path.py +3 -16
- catalystwan/endpoints/configuration/policy/list/class_map.py +3 -16
- catalystwan/endpoints/configuration/policy/list/color.py +3 -16
- catalystwan/endpoints/configuration/policy/list/community.py +3 -16
- catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +6 -15
- catalystwan/endpoints/configuration/policy/list/data_prefix.py +3 -16
- catalystwan/endpoints/configuration/policy/list/expanded_community.py +6 -15
- catalystwan/endpoints/configuration/policy/list/extended_community.py +52 -0
- catalystwan/endpoints/configuration/policy/list/fax_protocol.py +48 -0
- catalystwan/endpoints/configuration/policy/list/fqdn.py +3 -16
- catalystwan/endpoints/configuration/policy/list/geo_location.py +3 -16
- catalystwan/endpoints/configuration/policy/list/identity.py +48 -0
- catalystwan/endpoints/configuration/policy/list/ips_signature.py +6 -15
- catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +3 -16
- catalystwan/endpoints/configuration/policy/list/local_app.py +3 -16
- catalystwan/endpoints/configuration/policy/list/local_domain.py +3 -16
- catalystwan/endpoints/configuration/policy/list/media_profile.py +52 -0
- catalystwan/endpoints/configuration/policy/list/mirror.py +3 -16
- catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +52 -0
- catalystwan/endpoints/configuration/policy/list/policer.py +3 -16
- catalystwan/endpoints/configuration/policy/list/port.py +3 -16
- catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +6 -15
- catalystwan/endpoints/configuration/policy/list/prefix.py +4 -16
- catalystwan/endpoints/configuration/policy/list/protocol_name.py +6 -15
- catalystwan/endpoints/configuration/policy/list/region.py +2 -10
- catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +52 -0
- catalystwan/endpoints/configuration/policy/list/site.py +3 -16
- catalystwan/endpoints/configuration/policy/list/sla.py +3 -16
- catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +52 -0
- catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +52 -0
- catalystwan/endpoints/configuration/policy/list/tloc.py +3 -16
- catalystwan/endpoints/configuration/policy/list/translation_profile.py +52 -0
- catalystwan/endpoints/configuration/policy/list/translation_rules.py +52 -0
- catalystwan/endpoints/configuration/policy/list/trunkgroup.py +48 -0
- catalystwan/endpoints/configuration/policy/list/umbrella_data.py +52 -0
- catalystwan/endpoints/configuration/policy/list/url_allow_list.py +3 -16
- catalystwan/endpoints/configuration/policy/list/url_block_list.py +3 -16
- catalystwan/endpoints/configuration/policy/list/vpn.py +3 -16
- catalystwan/endpoints/configuration/policy/list/zone.py +3 -16
- catalystwan/endpoints/configuration/policy/security_template.py +2 -3
- catalystwan/endpoints/configuration/policy/voice_template.py +39 -0
- catalystwan/endpoints/configuration/policy_group.py +30 -0
- catalystwan/endpoints/configuration/software_actions.py +2 -4
- catalystwan/endpoints/configuration/topology_group.py +51 -0
- catalystwan/endpoints/configuration_dashboard_status.py +2 -2
- catalystwan/endpoints/configuration_device_template.py +15 -1
- catalystwan/endpoints/configuration_feature_profile.py +8 -11
- catalystwan/endpoints/configuration_general_template.py +31 -0
- catalystwan/endpoints/configuration_group.py +28 -5
- catalystwan/endpoints/configuration_settings.py +90 -1
- catalystwan/endpoints/configuration_template_master.py +48 -0
- catalystwan/endpoints/endpoints_container.py +79 -19
- catalystwan/endpoints/real_time_monitoring/reboot_history.py +1 -3
- catalystwan/endpoints/tenant_migration.py +2 -0
- catalystwan/exceptions.py +17 -0
- catalystwan/integration_tests/base.py +81 -0
- catalystwan/integration_tests/feature_profile/sdwan/__init__.py +0 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/__init__.py +0 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/base.py +33 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +33 -0
- catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +32 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +433 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +54 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +106 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_other.py +49 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_service.py +1078 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +322 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +85 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_system.py +368 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +127 -0
- catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +1698 -0
- catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +93 -0
- catalystwan/integration_tests/profile_builder/__init__.py +0 -0
- catalystwan/integration_tests/profile_builder/test_pb_service.py +197 -0
- catalystwan/integration_tests/profile_builder/test_pb_transport.py +226 -0
- catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +277 -0
- catalystwan/integration_tests/test_data/__init__.py +117 -0
- catalystwan/integration_tests/test_find_template_values.py +7 -18
- catalystwan/integration_tests/test_network_hierarchy.py +82 -0
- catalystwan/integration_tests/test_settings.py +30 -0
- catalystwan/models/common.py +1898 -2
- catalystwan/models/configuration/common.py +1 -0
- catalystwan/models/configuration/feature_profile/common.py +634 -149
- catalystwan/models/configuration/feature_profile/parcel.py +238 -0
- catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +13 -0
- catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +298 -0
- catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +344 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +218 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +61 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +31 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +102 -0
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +1057 -0
- catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +23 -0
- catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +18 -0
- catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +13 -0
- catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +110 -0
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +23 -0
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +493 -0
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +171 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +25 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +44 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +147 -0
- catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +110 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +62 -48
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +34 -20
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +8 -6
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +22 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +13 -4
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +9 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +34 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +254 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +11 -9
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +25 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +27 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +15 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policier.py → policer.py} +12 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +29 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +23 -8
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +21 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +12 -31
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +16 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +8 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +64 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +79 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +8 -6
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +30 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +58 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +72 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +7 -5
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +137 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +21 -11
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +126 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +165 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -10
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +148 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +14 -18
- catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +609 -0
- catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospf.py +55 -47
- catalystwan/models/configuration/feature_profile/sdwan/{service → routing}/ospfv3.py +74 -72
- catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +91 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +76 -41
- catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +107 -64
- catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +39 -42
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +7 -88
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +231 -155
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +38 -108
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +77 -84
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +101 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +62 -56
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +111 -120
- catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +56 -57
- catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +15 -21
- catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +358 -110
- catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +38 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +17 -25
- catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +50 -58
- catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +12 -21
- catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +27 -31
- catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +19 -0
- catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +379 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +59 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +58 -10
- catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +30 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +290 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +69 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +157 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +157 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +163 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +162 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +75 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +103 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +120 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/security.py +179 -0
- catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +173 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +29 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +425 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +60 -0
- catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +23 -0
- catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +36 -0
- catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +96 -0
- catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +63 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +93 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +26 -23
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +71 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +37 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +121 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +124 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +285 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +173 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +389 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +46 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +137 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +219 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +405 -0
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +195 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +62 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +436 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +179 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +380 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +193 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +17 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +51 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +86 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +69 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +42 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +31 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +57 -0
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +40 -0
- catalystwan/models/configuration/network_hierarchy/__init__.py +22 -0
- catalystwan/models/configuration/network_hierarchy/cflowd.py +120 -0
- catalystwan/models/configuration/network_hierarchy/node.py +88 -0
- catalystwan/models/configuration/policy_group.py +74 -0
- catalystwan/models/configuration/profile_type.py +1 -6
- catalystwan/models/configuration/topology_group.py +52 -0
- catalystwan/models/policy/__init__.py +275 -69
- catalystwan/models/policy/centralized.py +26 -29
- catalystwan/models/policy/{definitions → definition}/access_control_list.py +47 -17
- catalystwan/models/policy/{definitions → definition}/access_control_list_ipv6.py +42 -18
- catalystwan/models/policy/definition/aip.py +60 -0
- catalystwan/models/policy/definition/amp.py +65 -0
- catalystwan/models/policy/definition/app_route.py +246 -0
- catalystwan/models/policy/definition/cflowd.py +95 -0
- catalystwan/models/policy/{definitions → definition}/control.py +48 -25
- catalystwan/models/policy/{definitions → definition}/device_access.py +22 -11
- catalystwan/models/policy/{definitions → definition}/device_access_ipv6.py +20 -11
- catalystwan/models/policy/definition/dial_peer.py +60 -0
- catalystwan/models/policy/definition/dns_security.py +130 -0
- catalystwan/models/policy/definition/fxo_port.py +63 -0
- catalystwan/models/policy/definition/fxs_did_port.py +58 -0
- catalystwan/models/policy/definition/fxs_port.py +56 -0
- catalystwan/models/policy/{definitions → definition}/hub_and_spoke.py +18 -4
- catalystwan/models/policy/definition/intrusion_prevention.py +55 -0
- catalystwan/models/policy/{definitions → definition}/mesh.py +13 -1
- catalystwan/models/policy/definition/pri_isdn_port.py +48 -0
- catalystwan/models/policy/{definitions → definition}/qos_map.py +39 -32
- catalystwan/models/policy/{definitions → definition}/rewrite.py +12 -2
- catalystwan/models/policy/definition/route_policy.py +187 -0
- catalystwan/models/policy/{definitions → definition}/rule_set.py +66 -48
- catalystwan/models/policy/{definitions → definition}/security_group.py +38 -14
- catalystwan/models/policy/definition/srst_phone_profile.py +37 -0
- catalystwan/models/policy/definition/ssl_decryption.py +209 -0
- catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +87 -0
- catalystwan/models/policy/{definitions → definition}/traffic_data.py +184 -61
- catalystwan/models/policy/definition/url_filtering.py +70 -0
- catalystwan/models/policy/{definitions → definition}/vpn_membership.py +13 -1
- catalystwan/models/policy/definition/vpn_qos_map.py +46 -0
- catalystwan/models/policy/{definitions → definition}/zone_based_firewall.py +93 -32
- catalystwan/models/policy/list/app.py +44 -0
- catalystwan/models/policy/list/app_probe.py +42 -0
- catalystwan/models/policy/list/as_path.py +30 -0
- catalystwan/models/policy/list/class_map.py +30 -0
- catalystwan/models/policy/list/color.py +28 -0
- catalystwan/models/policy/list/communities.py +83 -0
- catalystwan/models/policy/list/data_ipv6_prefix.py +30 -0
- catalystwan/models/policy/list/data_prefix.py +30 -0
- catalystwan/models/policy/list/fax_protocol.py +45 -0
- catalystwan/models/policy/list/fqdn.py +24 -0
- catalystwan/models/policy/list/geo_location.py +33 -0
- catalystwan/models/policy/list/identity.py +29 -0
- catalystwan/models/policy/list/ips_signature.py +27 -0
- catalystwan/models/policy/list/ipv6_prefix.py +33 -0
- catalystwan/models/policy/list/local_app.py +45 -0
- catalystwan/models/policy/list/local_domain.py +36 -0
- catalystwan/models/policy/list/media_profile.py +44 -0
- catalystwan/models/policy/list/mirror.py +27 -0
- catalystwan/models/policy/list/modem_pass_through.py +27 -0
- catalystwan/models/policy/list/policer.py +39 -0
- catalystwan/models/policy/list/port.py +33 -0
- catalystwan/models/policy/list/preferred_color_group.py +82 -0
- catalystwan/models/policy/list/prefix.py +33 -0
- catalystwan/models/policy/list/protocol_name.py +26 -0
- catalystwan/models/policy/list/region.py +45 -0
- catalystwan/models/policy/list/scalable_group_tag.py +30 -0
- catalystwan/models/policy/list/site.py +34 -0
- catalystwan/models/policy/list/sla.py +77 -0
- catalystwan/models/policy/list/supervisory_disconnect.py +62 -0
- catalystwan/models/policy/list/threat_grid_api_key.py +32 -0
- catalystwan/models/policy/list/tloc.py +32 -0
- catalystwan/models/policy/list/translation_profile.py +32 -0
- catalystwan/models/policy/list/translation_rules.py +29 -0
- catalystwan/models/policy/list/trunkgroup.py +56 -0
- catalystwan/models/policy/list/umbrella_data.py +30 -0
- catalystwan/models/policy/list/url.py +39 -0
- catalystwan/models/policy/list/vpn.py +40 -0
- catalystwan/models/policy/list/zone.py +46 -0
- catalystwan/models/policy/localized.py +34 -16
- catalystwan/models/policy/policy.py +13 -9
- catalystwan/models/policy/policy_definition.py +673 -173
- catalystwan/models/policy/policy_list.py +38 -27
- catalystwan/models/policy/security.py +145 -46
- catalystwan/models/policy/voice.py +77 -0
- catalystwan/models/settings.py +41 -0
- catalystwan/models/templates.py +79 -0
- catalystwan/response.py +6 -2
- catalystwan/session.py +1 -1
- catalystwan/tests/builders/test_report.py +60 -0
- catalystwan/tests/builders/uc_voice.py +85 -0
- catalystwan/tests/models/__init__.py +0 -0
- catalystwan/tests/models/test_digital_interface.py +56 -0
- catalystwan/tests/templates/definitions/aaa_basic.json +96 -0
- catalystwan/tests/templates/definitions/aaa_complex.json +464 -0
- catalystwan/tests/templates/definitions/{iuo.json → cisco_aaa.json} +44 -15
- catalystwan/tests/templates/definitions/cisco_aaa_complex.json +361 -0
- catalystwan/tests/templates/definitions/cisco_logging_complex.json +268 -0
- catalystwan/tests/templates/definitions/cisco_ntp_complex.json +143 -0
- catalystwan/tests/templates/definitions/cisco_omp_complex.json +175 -0
- catalystwan/tests/templates/definitions/cisco_ospf_complex.json +302 -0
- catalystwan/tests/templates/definitions/cisco_sig.json +405 -0
- catalystwan/tests/templates/definitions/cisco_snmp_complex.json +258 -0
- catalystwan/tests/templates/definitions/cisco_system_complex.json +502 -0
- catalystwan/tests/templates/definitions/{Basic_Cisco_VPN_Model.json → cisco_vpn_basic.json} +2 -2
- catalystwan/tests/templates/definitions/{complex_cisco_vpn.json → cisco_vpn_complex.json} +27 -12
- catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +821 -0
- catalystwan/tests/templates/definitions/omp_vsmart_1.json +26 -0
- catalystwan/tests/templates/definitions/{omp_2.json → omp_vsmart_2.json} +16 -2
- catalystwan/tests/templates/definitions/{omp_3.json → omp_vsmart_3.json} +16 -2
- catalystwan/tests/templates/definitions/omp_vsmart_complex.json +73 -0
- catalystwan/tests/templates/definitions/security_vsmart_complex.json +24 -0
- catalystwan/tests/templates/definitions/system_vsmart_complex.json +193 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +17 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +179 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +42 -0
- catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +208 -0
- catalystwan/tests/templates/models/__init__.py +46 -13
- catalystwan/tests/templates/models/aaa.py +106 -0
- catalystwan/tests/templates/models/cisco_aaa.py +81 -48
- catalystwan/tests/templates/models/cisco_banner.py +2 -2
- catalystwan/tests/templates/models/cisco_bfd.py +4 -6
- catalystwan/tests/templates/models/cisco_logging.py +65 -0
- catalystwan/tests/templates/models/cisco_ntp.py +17 -0
- catalystwan/tests/templates/models/cisco_omp.py +37 -0
- catalystwan/tests/templates/models/cisco_ospf.py +60 -0
- catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +95 -0
- catalystwan/tests/templates/models/cisco_snmp.py +40 -0
- catalystwan/tests/templates/models/cisco_system.py +108 -3
- catalystwan/tests/templates/models/cisco_vpn.py +42 -72
- catalystwan/tests/templates/models/cisco_vpn_interface.py +200 -0
- catalystwan/tests/templates/models/omp_vsmart.py +28 -8
- catalystwan/tests/templates/models/security_vsmart.py +11 -0
- catalystwan/tests/templates/models/system_vsmart.py +37 -0
- catalystwan/tests/templates/models/vpn_vsmart.py +32 -0
- catalystwan/tests/templates/models/vpn_vsmart_interface.py +54 -0
- catalystwan/tests/templates/schemas/aaa.json +1096 -0
- catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
- catalystwan/tests/templates/schemas/cisco_logging.json +577 -0
- catalystwan/tests/templates/schemas/cisco_ntp.json +265 -0
- catalystwan/tests/templates/schemas/cisco_omp.json +479 -0
- catalystwan/tests/templates/schemas/cisco_ospf.json +908 -0
- catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +1520 -0
- catalystwan/tests/templates/schemas/cisco_snmp.json +561 -0
- catalystwan/tests/templates/schemas/cisco_system.json +242 -0
- catalystwan/tests/templates/schemas/cisco_vpn.json +53 -1
- catalystwan/tests/templates/schemas/cisco_vpn_interface.json +3348 -0
- catalystwan/tests/templates/schemas/omp-vsmart.json +20 -0
- catalystwan/tests/templates/schemas/security-vsmart.json +58 -0
- catalystwan/tests/templates/schemas/system-vsmart.json +2585 -0
- catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +859 -0
- catalystwan/tests/templates/schemas/vpn-vsmart.json +445 -0
- catalystwan/tests/templates/test_chose_model.py +6 -10
- catalystwan/tests/templates/test_deserialize_model.py +4 -4
- catalystwan/tests/templates/test_find_template_values.py +229 -0
- catalystwan/tests/templates/test_find_template_values_2.py +193 -0
- catalystwan/tests/templates/test_serialize_model.py +1 -2
- catalystwan/tests/test_cli_template.py +8 -9
- catalystwan/tests/test_endpoints.py +42 -11
- catalystwan/tests/test_feature_profile_api.py +282 -0
- catalystwan/tests/test_models_common.py +53 -0
- catalystwan/tests/test_templates.py +16 -19
- catalystwan/utils/feature_template/find_template_values.py +17 -4
- catalystwan/utils/model.py +45 -0
- catalystwan/utils/persona.py +5 -0
- catalystwan/utils/type_check.py +22 -0
- catalystwan/workflows/backup_restore_device_templates.py +467 -0
- catalystwan/workflows/tenant_migration.py +1 -1
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/METADATA +20 -1
- catalystwan-0.41.2.dev1.dist-info/RECORD +636 -0
- catalystwan/ENDPOINTS.md +0 -611
- catalystwan/api/configuration_groups/parcels/cellular_controller.py +0 -33
- catalystwan/api/templates/device_template/device_template_payload.json.j2 +0 -19
- catalystwan/models/configuration/config_migration.py +0 -36
- catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +0 -409
- catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +0 -288
- catalystwan/models/policy/lists.py +0 -330
- catalystwan/models/policy/lists_entries.py +0 -444
- catalystwan/tests/templates/definitions/complex_aaa.json +0 -277
- catalystwan/tests/templates/definitions/omp_1.json +0 -11
- catalystwan/utils/timezone.py +0 -422
- catalystwan-0.41.2.dist-info/RECORD +0 -353
- /catalystwan/tests/templates/definitions/{banner_1.json → cisco_banner.json} +0 -0
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/LICENSE +0 -0
- {catalystwan-0.41.2.dist-info → catalystwan-0.41.2.dev1.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Copyright 2023 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import ClassVar, List, Literal, Optional
|
|
5
|
+
|
|
6
|
+
from pydantic import ConfigDict, Field
|
|
7
|
+
|
|
8
|
+
from catalystwan.api.templates.bool_str import BoolStr
|
|
9
|
+
from catalystwan.api.templates.feature_template import FeatureTemplate, FeatureTemplateValidator
|
|
10
|
+
|
|
11
|
+
VpnId = Literal["0", "512"]
|
|
12
|
+
Role = Literal["primary", "secondary"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Dns(FeatureTemplateValidator):
|
|
16
|
+
dns_addr: Optional[str] = Field(
|
|
17
|
+
default=None, json_schema_extra={"vmanage_key": "dns-addr"}, description="The IP address of the DNS server."
|
|
18
|
+
)
|
|
19
|
+
role: Role = Field(description="The role of the DNS server, either 'PRIMARY' or 'SECONDARY'.")
|
|
20
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Host(FeatureTemplateValidator):
|
|
24
|
+
hostname: str = Field(..., description="The hostname of the device.")
|
|
25
|
+
ip: List[str] = Field(..., description="A list of IP addresses associated with the hostname.")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class NextHop(FeatureTemplateValidator):
|
|
29
|
+
address: Optional[str] = Field(default=None, description="The IP address of the next hop for the route.")
|
|
30
|
+
distance: Optional[int] = Field(default=1, description="The administrative distance of the next hop.")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class RouteInterface(FeatureTemplateValidator):
|
|
34
|
+
interface_name: str = Field(
|
|
35
|
+
description="The name of the interface used for routing.", json_schema_extra={"vmanage_key": "interface-name"}
|
|
36
|
+
)
|
|
37
|
+
interface_next_hop: Optional[List[NextHop]] = Field(
|
|
38
|
+
default=None,
|
|
39
|
+
description="A list of next hops associated with the interface for routing purposes.",
|
|
40
|
+
json_schema_extra={"vmanage_key": "interface-next-hop", "priority_order": ["address", "distance"]},
|
|
41
|
+
)
|
|
42
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class Routev4(FeatureTemplateValidator):
|
|
46
|
+
prefix: Optional[str] = Field(default=None, description="The IPv4 network prefix for the static route.")
|
|
47
|
+
next_hop: Optional[List[NextHop]] = Field(
|
|
48
|
+
default=None,
|
|
49
|
+
description="A list of IPv4 next hops for the route.",
|
|
50
|
+
json_schema_extra={"vmanage_key": "next-hop", "priority_order": ["address", "distance"]},
|
|
51
|
+
)
|
|
52
|
+
route_interface: Optional[RouteInterface] = Field(
|
|
53
|
+
default=None,
|
|
54
|
+
description="The interface configuration for the IPv4 static route.",
|
|
55
|
+
json_schema_extra={"vmanage_key": "route-interface"},
|
|
56
|
+
)
|
|
57
|
+
null0: Optional[BoolStr] = Field(
|
|
58
|
+
default=None, description="A flag indicating whether to route traffic to null0 for this static route."
|
|
59
|
+
)
|
|
60
|
+
distance: Optional[int] = Field(default=None, description="The administrative distance for the static route.")
|
|
61
|
+
vpn: Optional[int] = Field(
|
|
62
|
+
default=None, description="The VPN instance identifier associated with the static route."
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class NextHopv6(FeatureTemplateValidator):
|
|
69
|
+
address: str = Field(description="The IPv6 address of the next hop for the route.")
|
|
70
|
+
distance: Optional[int] = Field(default=1, description="The administrative distance of the IPv6 next hop.")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class Routev6(FeatureTemplateValidator):
|
|
74
|
+
prefix: str = Field(description="The IPv6 network prefix for the static route.")
|
|
75
|
+
next_hop: Optional[List[NextHopv6]] = Field(
|
|
76
|
+
default=None,
|
|
77
|
+
description="A list of IPv6 next hops for the route.",
|
|
78
|
+
json_schema_extra={"vmanage_key": "next-hop"},
|
|
79
|
+
)
|
|
80
|
+
null0: Optional[BoolStr] = Field(
|
|
81
|
+
default=None, description="A flag indicating whether to route IPv6 traffic to null0 for this static route."
|
|
82
|
+
)
|
|
83
|
+
distance: Optional[int] = Field(default=1, description="The administrative distance for the static route.")
|
|
84
|
+
vpn: Optional[int] = Field(default=0, description="The VPN instance identifier associated with the static route.")
|
|
85
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class VpnVsmartModel(FeatureTemplate):
|
|
89
|
+
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
|
|
90
|
+
_docs_description: str = "vSmart VPN Feature Template configuration."
|
|
91
|
+
|
|
92
|
+
vpn_id: VpnId = Field(
|
|
93
|
+
description="The unique identifier for the VPN, only 0 and 512 are allowed on vsmart",
|
|
94
|
+
json_schema_extra={"vmanage_key": "vpn-id"},
|
|
95
|
+
)
|
|
96
|
+
name: Optional[str] = Field(
|
|
97
|
+
default=None, description="The name of the VPN.", json_schema_extra={"vmanage_key": "name"}
|
|
98
|
+
)
|
|
99
|
+
dns: Optional[List[Dns]] = Field(
|
|
100
|
+
default=None,
|
|
101
|
+
description="A list of DNS configurations for the VPN instance.",
|
|
102
|
+
)
|
|
103
|
+
host: Optional[List[Host]] = Field(
|
|
104
|
+
default=None,
|
|
105
|
+
description="Static DNS mapping",
|
|
106
|
+
json_schema_extra={"priority_order": ["hostname", "ip"]},
|
|
107
|
+
)
|
|
108
|
+
route_v4: Optional[List[Routev4]] = Field(
|
|
109
|
+
default=None,
|
|
110
|
+
description="A list of IPv4 route configurations within the VPN instance.",
|
|
111
|
+
json_schema_extra={
|
|
112
|
+
"data_path": ["ip"],
|
|
113
|
+
"vmanage_key": "route",
|
|
114
|
+
"priority_order": ["prefix", "next-hop", "next-hop-with-track"],
|
|
115
|
+
},
|
|
116
|
+
)
|
|
117
|
+
route_v6: Optional[List[Routev6]] = Field(
|
|
118
|
+
default=None,
|
|
119
|
+
description="A list of IPv6 route configurations within the VPN instance.",
|
|
120
|
+
json_schema_extra={"data_path": ["ipv6"], "vmanage_key": "route"},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
|
|
124
|
+
type: ClassVar[str] = "vpn-vsmart"
|
catalystwan/apigw_auth.py
CHANGED
|
@@ -7,10 +7,10 @@ from urllib.parse import urlparse
|
|
|
7
7
|
from pydantic import BaseModel, Field, PositiveInt
|
|
8
8
|
from requests import HTTPError, PreparedRequest, post
|
|
9
9
|
from requests.auth import AuthBase
|
|
10
|
-
from requests.exceptions import JSONDecodeError
|
|
10
|
+
from requests.exceptions import JSONDecodeError, Timeout
|
|
11
11
|
|
|
12
12
|
from catalystwan.abstractions import APIEndpointClient, AuthProtocol
|
|
13
|
-
from catalystwan.exceptions import CatalystwanException
|
|
13
|
+
from catalystwan.exceptions import ApiGwAuthTimeout, CatalystwanException
|
|
14
14
|
from catalystwan.response import auth_response_debug
|
|
15
15
|
|
|
16
16
|
LoginMode = Literal["machine", "user", "session"]
|
|
@@ -106,6 +106,8 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
106
106
|
raise CatalystwanException(
|
|
107
107
|
f"Problem with connection to ApiGateway login endpoint, ({ex}). Response: ({response.text})"
|
|
108
108
|
)
|
|
109
|
+
except Timeout as ex:
|
|
110
|
+
raise ApiGwAuthTimeout(f"The request to the API GW login timeout, ({ex}).")
|
|
109
111
|
except KeyError as ex:
|
|
110
112
|
raise CatalystwanException(f"Not found token in login response from ApiGateway, ({ex})")
|
|
111
113
|
else:
|
|
@@ -139,6 +141,8 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
139
141
|
f"Problem with connecting to API GW organization registration endpoint, ({ex}).\
|
|
140
142
|
Response: ({response.text})"
|
|
141
143
|
)
|
|
144
|
+
except Timeout as ex:
|
|
145
|
+
raise ApiGwAuthTimeout(f"The request to the API GW organization registration timeout, ({ex}).")
|
|
142
146
|
except Exception as ex:
|
|
143
147
|
raise CatalystwanException(f"Org registration to API-GW failed: {ex}")
|
|
144
148
|
|
catalystwan/dataclasses.py
CHANGED
|
@@ -11,9 +11,9 @@ from catalystwan.utils.alarm_status import Severity
|
|
|
11
11
|
from catalystwan.utils.certificate_status import ValidityPeriod
|
|
12
12
|
from catalystwan.utils.colors import PrintColors
|
|
13
13
|
from catalystwan.utils.creation_tools import FIELD_NAME, asdict, convert_attributes
|
|
14
|
+
from catalystwan.utils.persona import Persona
|
|
14
15
|
from catalystwan.utils.personality import Personality
|
|
15
16
|
from catalystwan.utils.reachability import Reachability
|
|
16
|
-
from catalystwan.utils.template_type import TemplateType
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class DataclassBase:
|
|
@@ -252,36 +252,6 @@ class User(DataclassBase):
|
|
|
252
252
|
resource_group: Optional[str] = field(default=None, metadata={FIELD_NAME: "resGroupName"})
|
|
253
253
|
|
|
254
254
|
|
|
255
|
-
@define(kw_only=True)
|
|
256
|
-
class TemplateInfo(DataclassBase):
|
|
257
|
-
last_updated_by: str = field(metadata={FIELD_NAME: "lastUpdatedBy"})
|
|
258
|
-
id: str = field(metadata={FIELD_NAME: "templateId"})
|
|
259
|
-
factory_default: bool = field(metadata={FIELD_NAME: "factoryDefault"})
|
|
260
|
-
name: str = field(metadata={FIELD_NAME: "templateName"})
|
|
261
|
-
devices_attached: int = field(metadata={FIELD_NAME: "devicesAttached"})
|
|
262
|
-
description: str = field(metadata={FIELD_NAME: "templateDescription"})
|
|
263
|
-
last_updated_on: dt.datetime = field(metadata={FIELD_NAME: "lastUpdatedOn"})
|
|
264
|
-
resource_group: Optional[str] = field(default=None, metadata={FIELD_NAME: "resourceGroup"})
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
@define(kw_only=True)
|
|
268
|
-
class FeatureTemplateInfo(TemplateInfo):
|
|
269
|
-
template_type: str = field(metadata={FIELD_NAME: "templateType"})
|
|
270
|
-
device_type: List[str] = field(metadata={FIELD_NAME: "deviceType"})
|
|
271
|
-
version: str = field(metadata={FIELD_NAME: "templateMinVersion"})
|
|
272
|
-
template_definiton: Optional[str] = field(default=None, metadata={FIELD_NAME: "templateDefinition"})
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
@define(kw_only=True)
|
|
276
|
-
class DeviceTemplateInfo(TemplateInfo):
|
|
277
|
-
device_type: str = field(metadata={FIELD_NAME: "deviceType"})
|
|
278
|
-
template_class: str = field(metadata={FIELD_NAME: "templateClass"})
|
|
279
|
-
config_type: TemplateType = field(converter=TemplateType, metadata={FIELD_NAME: "configType"})
|
|
280
|
-
template_attached: int = field(metadata={FIELD_NAME: "templateAttached"})
|
|
281
|
-
draft_mode: Optional[str] = field(default=None, metadata={FIELD_NAME: "draftMode"})
|
|
282
|
-
device_role: Optional[str] = field(default=None, metadata={FIELD_NAME: "deviceRole"})
|
|
283
|
-
|
|
284
|
-
|
|
285
255
|
@define
|
|
286
256
|
class Speedtest(DataclassBase):
|
|
287
257
|
device_ip: str
|
|
@@ -312,7 +282,7 @@ class ServiceConfigurationData(DataclassBase):
|
|
|
312
282
|
vmanage_id: str = field(metadata={FIELD_NAME: "vmanageID"})
|
|
313
283
|
device_ip: str = field(metadata={FIELD_NAME: "deviceIP"}) # consider using ip4 module to verify
|
|
314
284
|
services: dict = field(metadata={FIELD_NAME: "services"}) # consider using nested dataclasses
|
|
315
|
-
persona:
|
|
285
|
+
persona: Persona = field(default="COMPUTE_AND_DATA")
|
|
316
286
|
username: Optional[str] = field(default=None)
|
|
317
287
|
password: Optional[str] = field(default=None)
|
|
318
288
|
|
|
@@ -374,27 +344,6 @@ class TierInfo(DataclassBase):
|
|
|
374
344
|
nat_session_limit: Optional[int] = field(default=None, metadata={FIELD_NAME: "natSessionLimit"})
|
|
375
345
|
|
|
376
346
|
|
|
377
|
-
@define(frozen=True)
|
|
378
|
-
class FeatureTemplateInformation(DataclassBase):
|
|
379
|
-
"""Endpoint: /dataservice/template/feature"""
|
|
380
|
-
|
|
381
|
-
id: str = field(metadata={FIELD_NAME: "templateId"})
|
|
382
|
-
name: str = field(metadata={FIELD_NAME: "templateName"})
|
|
383
|
-
description: str = field(metadata={FIELD_NAME: "templateDescription"})
|
|
384
|
-
type: str = field(metadata={FIELD_NAME: "templateType"}) # TODO Enum
|
|
385
|
-
device_types: List[str] = field(metadata={FIELD_NAME: "deviceType"}) # TODO Enum
|
|
386
|
-
last_updated_by: str = field(metadata={FIELD_NAME: "lastUpdatedBy"})
|
|
387
|
-
last_updated_on: dt.datetime = field(metadata={FIELD_NAME: "lastUpdatedOn"})
|
|
388
|
-
factory_default: bool = field(metadata={FIELD_NAME: "factoryDefault"})
|
|
389
|
-
devices_attached: int = field(metadata={FIELD_NAME: "devicesAttached"})
|
|
390
|
-
attached_masters: int = field(metadata={FIELD_NAME: "attachedMastersCount"})
|
|
391
|
-
version: str = field(metadata={FIELD_NAME: "templateMinVersion"})
|
|
392
|
-
config_type: str = field(metadata={FIELD_NAME: "configType"})
|
|
393
|
-
created_by: str = field(metadata={FIELD_NAME: "createdBy"})
|
|
394
|
-
created_on: dt.datetime = field(metadata={FIELD_NAME: "createdOn"})
|
|
395
|
-
resource_group: str = field(metadata={FIELD_NAME: "resourceGroup"})
|
|
396
|
-
|
|
397
|
-
|
|
398
347
|
@define
|
|
399
348
|
class Organization(DataclassBase):
|
|
400
349
|
name: str = field(metadata={FIELD_NAME: "org"})
|
|
@@ -61,11 +61,12 @@ from uuid import UUID
|
|
|
61
61
|
from packaging.specifiers import SpecifierSet # type: ignore
|
|
62
62
|
from packaging.version import Version # type: ignore
|
|
63
63
|
from pydantic import BaseModel
|
|
64
|
-
from typing_extensions import
|
|
64
|
+
from typing_extensions import get_args, get_origin
|
|
65
65
|
|
|
66
66
|
from catalystwan.abstractions import APIEndpointClient, APIEndpointClientResponse
|
|
67
67
|
from catalystwan.exceptions import APIEndpointError, APIRequestPayloadTypeError, APIVersionError, APIViewError
|
|
68
68
|
from catalystwan.typed_list import DataSequence
|
|
69
|
+
from catalystwan.utils.model import resolve_nested_base_model_unions
|
|
69
70
|
from catalystwan.utils.session_type import SessionType
|
|
70
71
|
|
|
71
72
|
BASE_PATH: Final[str] = "/dataservice"
|
|
@@ -75,8 +76,7 @@ logger = logging.getLogger(__name__)
|
|
|
75
76
|
|
|
76
77
|
@runtime_checkable
|
|
77
78
|
class CustomPayloadType(Protocol):
|
|
78
|
-
def prepared(self) -> PreparedPayload:
|
|
79
|
-
...
|
|
79
|
+
def prepared(self) -> PreparedPayload: ...
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
JSON = Union[str, int, float, bool, None, Dict[str, "JSON"], List["JSON"]]
|
|
@@ -113,6 +113,19 @@ class TypeSpecifier:
|
|
|
113
113
|
def model_union(cls, models: Sequence[type]) -> TypeSpecifier:
|
|
114
114
|
return TypeSpecifier(present=True, payload_union_model_types=models)
|
|
115
115
|
|
|
116
|
+
@classmethod
|
|
117
|
+
def resolve_nested(cls, annotation: Any, models_types: List[type]) -> List[type]:
|
|
118
|
+
try:
|
|
119
|
+
return resolve_nested_base_model_unions(annotation)
|
|
120
|
+
except TypeError:
|
|
121
|
+
raise APIEndpointError(f"Expected: {PayloadType}")
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def payload_model_set(self) -> Optional[Set[type]]:
|
|
125
|
+
if self.payload_union_model_types is not None:
|
|
126
|
+
return set(self.payload_union_model_types)
|
|
127
|
+
return None
|
|
128
|
+
|
|
116
129
|
|
|
117
130
|
@dataclass
|
|
118
131
|
class APIEndpointRequestMeta:
|
|
@@ -161,16 +174,18 @@ class APIEndpoints:
|
|
|
161
174
|
"""
|
|
162
175
|
|
|
163
176
|
@classmethod
|
|
164
|
-
def _prepare_payload(
|
|
177
|
+
def _prepare_payload(
|
|
178
|
+
cls, payload: PayloadType, force_json: bool = False, context: Dict[str, Any] = {}
|
|
179
|
+
) -> PreparedPayload:
|
|
165
180
|
"""Helper method to prepare data for sending based on type"""
|
|
166
181
|
if force_json or isinstance(payload, dict):
|
|
167
182
|
return PreparedPayload(data=json.dumps(payload), headers={"content-type": "application/json"})
|
|
168
183
|
if isinstance(payload, (str, bytes)):
|
|
169
184
|
return PreparedPayload(data=payload)
|
|
170
185
|
elif isinstance(payload, (BaseModel)):
|
|
171
|
-
return cls._prepare_basemodel_payload(payload)
|
|
186
|
+
return cls._prepare_basemodel_payload(payload, context)
|
|
172
187
|
elif isinstance(payload, Sequence) and not isinstance(payload, (str, bytes)):
|
|
173
|
-
return cls._prepare_sequence_payload(payload) # type: ignore[arg-type]
|
|
188
|
+
return cls._prepare_sequence_payload(payload, context) # type: ignore[arg-type]
|
|
174
189
|
# offender is List[JSON] which is also a Sequence can be ignored as long as force_json is passed correctly
|
|
175
190
|
elif isinstance(payload, CustomPayloadType):
|
|
176
191
|
return payload.prepared()
|
|
@@ -178,26 +193,27 @@ class APIEndpoints:
|
|
|
178
193
|
raise APIRequestPayloadTypeError(payload)
|
|
179
194
|
|
|
180
195
|
@classmethod
|
|
181
|
-
def _prepare_basemodel_payload(cls, payload: BaseModel) -> PreparedPayload:
|
|
196
|
+
def _prepare_basemodel_payload(cls, payload: BaseModel, context: Dict[str, Any] = {}) -> PreparedPayload:
|
|
182
197
|
"""Helper method to prepare BaseModel instance for sending"""
|
|
183
198
|
return PreparedPayload(
|
|
184
|
-
data=payload.model_dump_json(exclude_none=True, by_alias=True
|
|
199
|
+
data=payload.model_dump_json(exclude_none=True, by_alias=True, context=context),
|
|
200
|
+
headers={"content-type": "application/json"},
|
|
185
201
|
)
|
|
186
202
|
|
|
187
203
|
@classmethod
|
|
188
|
-
def _prepare_sequence_payload(cls, payload: Iterable[BaseModel]) -> PreparedPayload:
|
|
204
|
+
def _prepare_sequence_payload(cls, payload: Iterable[BaseModel], context: Dict[str, Any] = {}) -> PreparedPayload:
|
|
189
205
|
"""Helper method to prepare sequences for sending"""
|
|
190
206
|
items = []
|
|
191
207
|
for item in payload:
|
|
192
|
-
items.append(item.model_dump(exclude_none=True, by_alias=True))
|
|
208
|
+
items.append(item.model_dump(exclude_none=True, by_alias=True, context=context))
|
|
193
209
|
data = json.dumps(items)
|
|
194
210
|
return PreparedPayload(data=data, headers={"content-type": "application/json"})
|
|
195
211
|
|
|
196
212
|
@classmethod
|
|
197
|
-
def _prepare_params(cls, params: RequestParamsType) -> Dict[str, Any]:
|
|
213
|
+
def _prepare_params(cls, params: RequestParamsType, context: Dict[str, Any] = {}) -> Dict[str, Any]:
|
|
198
214
|
"""Helper method to prepare params for sending"""
|
|
199
215
|
if isinstance(params, BaseModel):
|
|
200
|
-
return params.model_dump(exclude_none=True, by_alias=True)
|
|
216
|
+
return params.model_dump(exclude_none=True, by_alias=True, context=context)
|
|
201
217
|
return params
|
|
202
218
|
|
|
203
219
|
def __init__(self, client: APIEndpointClient):
|
|
@@ -215,10 +231,11 @@ class APIEndpoints:
|
|
|
215
231
|
) -> APIEndpointClientResponse:
|
|
216
232
|
"""Prepares and sends request using client protocol"""
|
|
217
233
|
_kwargs = dict(kwargs)
|
|
234
|
+
context = dict(api_version=self._api_version)
|
|
218
235
|
if payload is not None:
|
|
219
|
-
_kwargs.update(self._prepare_payload(payload, force_json_payload).asdict())
|
|
236
|
+
_kwargs.update(self._prepare_payload(payload, force_json_payload, context).asdict())
|
|
220
237
|
if params is not None:
|
|
221
|
-
_kwargs.update({"params": self._prepare_params(params)})
|
|
238
|
+
_kwargs.update({"params": self._prepare_params(params, context)})
|
|
222
239
|
return self._client.request(method, self._basepath + url, **_kwargs)
|
|
223
240
|
|
|
224
241
|
@property
|
|
@@ -245,9 +262,9 @@ class versions(APIEndpointsDecorator):
|
|
|
245
262
|
Logs warning or raises exception when incompatibility found during runtime.
|
|
246
263
|
"""
|
|
247
264
|
|
|
248
|
-
versions_lookup: ClassVar[
|
|
249
|
-
|
|
250
|
-
|
|
265
|
+
versions_lookup: ClassVar[Dict[str, SpecifierSet]] = (
|
|
266
|
+
{}
|
|
267
|
+
) # maps decorated method instance to it's supported verisions
|
|
251
268
|
|
|
252
269
|
def __init__(self, supported_versions: str, raises: bool = False):
|
|
253
270
|
self.supported_versions = SpecifierSet(supported_versions)
|
|
@@ -337,9 +354,9 @@ class request(APIEndpointsDecorator):
|
|
|
337
354
|
"""
|
|
338
355
|
|
|
339
356
|
forbidden_url_field_names = {"self", "payload", "params"}
|
|
340
|
-
request_lookup: ClassVar[
|
|
341
|
-
|
|
342
|
-
|
|
357
|
+
request_lookup: ClassVar[Dict[str, APIEndpointRequestMeta]] = (
|
|
358
|
+
{}
|
|
359
|
+
) # maps decorated method instance to it's meta information
|
|
343
360
|
|
|
344
361
|
def __init__(self, http_method: str, url: str, resp_json_key: Optional[str] = None, **kwargs):
|
|
345
362
|
self.http_method = http_method
|
|
@@ -441,27 +458,10 @@ class request(APIEndpointsDecorator):
|
|
|
441
458
|
and issubclass(type_args[0], BaseModel)
|
|
442
459
|
):
|
|
443
460
|
return TypeSpecifier(True, type_origin, type_args[0], None, False, is_optional)
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
if (
|
|
449
|
-
(type_args := get_args(annotated_origin[0]))
|
|
450
|
-
and all(isclass(t) for t in type_args)
|
|
451
|
-
and all(issubclass(t, BaseModel) for t in type_args)
|
|
452
|
-
):
|
|
453
|
-
return TypeSpecifier.model_union(models=list(type_args))
|
|
454
|
-
# Check if Union[PayloadModelType, ...], only unions of pydantic models allowed
|
|
455
|
-
elif type_origin == Union:
|
|
456
|
-
if (
|
|
457
|
-
(type_args := get_args(annotation))
|
|
458
|
-
and all(isclass(t) for t in type_args)
|
|
459
|
-
and all(issubclass(t, BaseModel) for t in type_args)
|
|
460
|
-
):
|
|
461
|
-
return TypeSpecifier.model_union(models=list(type_args))
|
|
462
|
-
raise APIEndpointError(f"Expected: {PayloadType} but found payload {annotation}")
|
|
463
|
-
else:
|
|
464
|
-
raise APIEndpointError(f"Expected: {PayloadType} but found payload {annotation}")
|
|
461
|
+
else:
|
|
462
|
+
models = TypeSpecifier.resolve_nested(annotation, [])
|
|
463
|
+
return TypeSpecifier.model_union(models)
|
|
464
|
+
raise APIEndpointError(f"'payload' param must be annotated with supported type: {PayloadType}")
|
|
465
465
|
|
|
466
466
|
def check_params(self):
|
|
467
467
|
"""Checks params in decorated method definition
|
|
@@ -135,3 +135,7 @@ class CertificateManagementDevice(APIEndpoints):
|
|
|
135
135
|
@post("/certificate/vsmart/list")
|
|
136
136
|
def send_to_vbond(self) -> CertActionResponse:
|
|
137
137
|
...
|
|
138
|
+
|
|
139
|
+
@post("/certificate/install/signedCert")
|
|
140
|
+
def install_signed_cert(self, payload: str) -> CertActionResponse:
|
|
141
|
+
...
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# Copyright 2023 Cisco Systems, Inc. and its affiliates
|
|
2
2
|
|
|
3
3
|
# mypy: disable-error-code="empty-body"
|
|
4
|
-
from typing import Literal, Optional
|
|
4
|
+
from typing import Dict, Literal, Optional
|
|
5
5
|
|
|
6
|
-
from pydantic import BaseModel
|
|
6
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
7
7
|
|
|
8
|
-
from catalystwan.endpoints import APIEndpoints, get
|
|
8
|
+
from catalystwan.endpoints import JSON, APIEndpoints, get, post, put
|
|
9
9
|
from catalystwan.typed_list import DataSequence
|
|
10
|
+
from catalystwan.utils.persona import Persona
|
|
10
11
|
|
|
11
12
|
TenancyModes = Literal["SingleTenant", "MultiTenant"]
|
|
12
13
|
|
|
@@ -24,12 +25,30 @@ class VManageDetails(BaseModel):
|
|
|
24
25
|
status: str
|
|
25
26
|
|
|
26
27
|
|
|
28
|
+
class ConnectedDevice(BaseModel):
|
|
29
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
30
|
+
uuid: str
|
|
31
|
+
device_id: str = Field(serialization_alias="deviceId", validation_alias="deviceId")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class VManageSetup(BaseModel):
|
|
35
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
36
|
+
vmanage_id: Optional[str] = Field(default=None, serialization_alias="vmanageID", validation_alias="vmanageID")
|
|
37
|
+
device_ip: str = Field(serialization_alias="deviceIP", validation_alias="deviceIP")
|
|
38
|
+
username: str
|
|
39
|
+
password: str
|
|
40
|
+
gen_csr: Optional[bool] = Field(default=None, serialization_alias="genCSR", validation_alias="genCSR")
|
|
41
|
+
persona: Persona
|
|
42
|
+
services: Optional[Dict[str, Dict[str, bool]]] = Field(default=None)
|
|
43
|
+
|
|
44
|
+
|
|
27
45
|
class ClusterManagement(APIEndpoints):
|
|
28
46
|
def add_or_update_user_credentials(self):
|
|
29
47
|
# POST /clusterManagement/userCreds
|
|
30
48
|
...
|
|
31
49
|
|
|
32
|
-
|
|
50
|
+
@post("/clusterManagement/setup")
|
|
51
|
+
def add_vmanage(self, payload: VManageSetup) -> JSON:
|
|
33
52
|
# POST /clusterManagement/setup
|
|
34
53
|
...
|
|
35
54
|
|
|
@@ -41,7 +60,8 @@ class ClusterManagement(APIEndpoints):
|
|
|
41
60
|
# POST /clusterManagement/configure
|
|
42
61
|
...
|
|
43
62
|
|
|
44
|
-
|
|
63
|
+
@put("/clusterManagement/setup")
|
|
64
|
+
def edit_vmanage(self, payload: VManageSetup) -> JSON:
|
|
45
65
|
# PUT /clusterManagement/setup
|
|
46
66
|
...
|
|
47
67
|
|
|
@@ -53,8 +73,8 @@ class ClusterManagement(APIEndpoints):
|
|
|
53
73
|
# GET /clusterManagement/iplist/{vmanageID}
|
|
54
74
|
...
|
|
55
75
|
|
|
56
|
-
|
|
57
|
-
|
|
76
|
+
@get("/clusterManagement/connectedDevices/{vmanageIP}", "data")
|
|
77
|
+
def get_connected_devices(self, vmanageIP: str) -> DataSequence[ConnectedDevice]:
|
|
58
78
|
...
|
|
59
79
|
|
|
60
80
|
def get_connected_devices_per_tenant(self):
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
|
|
3
|
+
# mypy: disable-error-code="empty-body"
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from catalystwan.endpoints import APIEndpoints, delete, get, post, put, versions
|
|
7
|
+
from catalystwan.models.configuration.feature_profile.common import (
|
|
8
|
+
FeatureProfileCreationPayload,
|
|
9
|
+
FeatureProfileCreationResponse,
|
|
10
|
+
FeatureProfileDetail,
|
|
11
|
+
FeatureProfileEditPayload,
|
|
12
|
+
FeatureProfileInfo,
|
|
13
|
+
GetFeatureProfilesParams,
|
|
14
|
+
)
|
|
15
|
+
from catalystwan.models.configuration.feature_profile.parcel import Parcel, ParcelCreationResponse
|
|
16
|
+
from catalystwan.models.configuration.feature_profile.sdwan.application_priority import AnyApplicationPriorityParcel
|
|
17
|
+
from catalystwan.models.configuration.feature_profile.sdwan.application_priority.policy_settings import (
|
|
18
|
+
PolicySettingsParcel,
|
|
19
|
+
)
|
|
20
|
+
from catalystwan.typed_list import DataSequence
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ApplicationPriorityFeatureProfile(APIEndpoints):
|
|
24
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
25
|
+
@post("/v1/feature-profile/sdwan/application-priority")
|
|
26
|
+
def create_application_priority_feature_profile(
|
|
27
|
+
self, payload: FeatureProfileCreationPayload
|
|
28
|
+
) -> FeatureProfileCreationResponse:
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
32
|
+
@get("/v1/feature-profile/sdwan/application-priority")
|
|
33
|
+
def get_application_priority_feature_profiles(
|
|
34
|
+
self, params: GetFeatureProfilesParams
|
|
35
|
+
) -> DataSequence[FeatureProfileInfo]:
|
|
36
|
+
...
|
|
37
|
+
|
|
38
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
39
|
+
@get("/v1/feature-profile/sdwan/application-priority/{profile_id}")
|
|
40
|
+
def get_application_priority_feature_profile(
|
|
41
|
+
self, profile_id: str, params: GetFeatureProfilesParams
|
|
42
|
+
) -> FeatureProfileDetail:
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
46
|
+
@put("/v1/feature-profile/sdwan/application-priority/{profile_id}")
|
|
47
|
+
def edit_application_priority_feature_profile(
|
|
48
|
+
self, profile_id: str, payload: FeatureProfileEditPayload
|
|
49
|
+
) -> FeatureProfileCreationResponse:
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
53
|
+
@delete("/v1/feature-profile/sdwan/application-priority/{profile_id}")
|
|
54
|
+
def delete_application_priority_feature_profile(self, profile_id: str) -> None:
|
|
55
|
+
...
|
|
56
|
+
|
|
57
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
58
|
+
@post("/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}")
|
|
59
|
+
def create(
|
|
60
|
+
self, profile_id: UUID, application_priority_list_type: str, payload: AnyApplicationPriorityParcel
|
|
61
|
+
) -> ParcelCreationResponse:
|
|
62
|
+
...
|
|
63
|
+
|
|
64
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
65
|
+
@delete(
|
|
66
|
+
"/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}/{list_object_id}"
|
|
67
|
+
)
|
|
68
|
+
def delete(self, profile_id: UUID, application_priority_list_type: str, list_object_id: UUID) -> None:
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
72
|
+
@put(
|
|
73
|
+
"/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}/{list_object_id}"
|
|
74
|
+
)
|
|
75
|
+
def update(
|
|
76
|
+
self,
|
|
77
|
+
profile_id: UUID,
|
|
78
|
+
application_priority_list_type: str,
|
|
79
|
+
list_object_id: UUID,
|
|
80
|
+
payload: AnyApplicationPriorityParcel,
|
|
81
|
+
) -> ParcelCreationResponse:
|
|
82
|
+
...
|
|
83
|
+
|
|
84
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
85
|
+
@get(
|
|
86
|
+
"/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}/{list_object_id}"
|
|
87
|
+
)
|
|
88
|
+
def get_by_id(self, profile_id: UUID, application_priority_list_type: str, list_object_id: UUID) -> Parcel:
|
|
89
|
+
...
|
|
90
|
+
|
|
91
|
+
@versions(supported_versions=(">=20.12"), raises=False)
|
|
92
|
+
@get(
|
|
93
|
+
"/v1/feature-profile/sdwan/application-priority/{profile_id}/{application_priority_list_type}",
|
|
94
|
+
resp_json_key="data",
|
|
95
|
+
)
|
|
96
|
+
def get_all(self, profile_id: UUID, application_priority_list_type: str) -> DataSequence[Parcel]:
|
|
97
|
+
...
|
|
98
|
+
|
|
99
|
+
@versions(supported_versions=(">20.12"), raises=False)
|
|
100
|
+
@post("/v1/feature-profile/sdwan/application-priority/{profile_id}/policy-settings")
|
|
101
|
+
def create_policy_settings(self, profile_id: UUID, payload: PolicySettingsParcel) -> ParcelCreationResponse:
|
|
102
|
+
...
|
|
103
|
+
|
|
104
|
+
@versions(supported_versions=(">20.12"), raises=False)
|
|
105
|
+
@get("/v1/feature-profile/sdwan/application-priority/{profile_id}/policy-settings/{list_object_id}")
|
|
106
|
+
def get_policy_settings(self, profile_id: UUID, list_object_id: UUID) -> Parcel:
|
|
107
|
+
...
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
|
|
3
|
+
# mypy: disable-error-code="empty-body"
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from catalystwan.endpoints import APIEndpoints, delete, get, post, put, versions
|
|
8
|
+
from catalystwan.models.configuration.feature_profile.common import (
|
|
9
|
+
FeatureProfileCreationPayload,
|
|
10
|
+
FeatureProfileCreationResponse,
|
|
11
|
+
FeatureProfileInfo,
|
|
12
|
+
GetFeatureProfilesParams,
|
|
13
|
+
)
|
|
14
|
+
from catalystwan.models.configuration.feature_profile.parcel import Parcel, ParcelCreationResponse
|
|
15
|
+
from catalystwan.models.configuration.feature_profile.sdwan.cli import AnyCliParcel
|
|
16
|
+
from catalystwan.typed_list import DataSequence
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CliFeatureProfile(APIEndpoints):
|
|
20
|
+
@versions(">=20.9")
|
|
21
|
+
@get("/v1/feature-profile/sdwan/cli")
|
|
22
|
+
def get_profiles(self, payload: Optional[GetFeatureProfilesParams]) -> DataSequence[FeatureProfileInfo]:
|
|
23
|
+
...
|
|
24
|
+
|
|
25
|
+
@versions(">=20.9")
|
|
26
|
+
@post("/v1/feature-profile/sdwan/cli")
|
|
27
|
+
def create_profile(self, payload: FeatureProfileCreationPayload) -> FeatureProfileCreationResponse:
|
|
28
|
+
...
|
|
29
|
+
|
|
30
|
+
@versions(">=20.9")
|
|
31
|
+
@delete("/v1/feature-profile/sdwan/cli/{profile_id}")
|
|
32
|
+
def delete_profile(self, profile_id: UUID) -> None:
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
@versions(">=20.9")
|
|
36
|
+
@get("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}")
|
|
37
|
+
def get_all(self, profile_id: UUID, parcel_type: str) -> DataSequence[Parcel[AnyCliParcel]]:
|
|
38
|
+
...
|
|
39
|
+
|
|
40
|
+
@versions(">=20.9")
|
|
41
|
+
@get("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}/{parcel_id}")
|
|
42
|
+
def get_by_id(self, profile_id: UUID, parcel_type: str, parcel_id: UUID) -> Parcel[AnyCliParcel]:
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
@versions(">=20.9")
|
|
46
|
+
@post("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}")
|
|
47
|
+
def create(self, profile_id: UUID, parcel_type: str, payload: AnyCliParcel) -> ParcelCreationResponse:
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
@versions(">=20.9")
|
|
51
|
+
@put("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}/{parcel_id}")
|
|
52
|
+
def update(
|
|
53
|
+
self, profile_id: UUID, parcel_type: str, parcel_id: UUID, payload: AnyCliParcel
|
|
54
|
+
) -> ParcelCreationResponse:
|
|
55
|
+
...
|
|
56
|
+
|
|
57
|
+
@versions(">=20.9")
|
|
58
|
+
@delete("/v1/feature-profile/sdwan/cli/{profile_id}/{parcel_type}/{parcel_id}")
|
|
59
|
+
def delete(self, profile_id: UUID, parcel_type: str, parcel_id: UUID) -> None:
|
|
60
|
+
...
|