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
catalystwan/api/template_api.py
CHANGED
|
@@ -5,13 +5,16 @@ from __future__ import annotations
|
|
|
5
5
|
import json
|
|
6
6
|
import logging
|
|
7
7
|
from enum import Enum
|
|
8
|
-
from typing import TYPE_CHECKING, Any, Optional, Type, overload
|
|
8
|
+
from typing import TYPE_CHECKING, Any, List, Optional, Type, overload
|
|
9
9
|
|
|
10
10
|
from ciscoconfparse import CiscoConfParse # type: ignore
|
|
11
|
+
from typing_extensions import deprecated
|
|
11
12
|
|
|
12
13
|
from catalystwan.api.task_status_api import Task
|
|
13
14
|
from catalystwan.api.templates.cli_template import CLITemplate
|
|
14
15
|
from catalystwan.api.templates.device_template.device_template import (
|
|
16
|
+
CreateDeviceInputPayload,
|
|
17
|
+
DeviceInputValues,
|
|
15
18
|
DeviceSpecificValue,
|
|
16
19
|
DeviceTemplate,
|
|
17
20
|
GeneralTemplate,
|
|
@@ -19,6 +22,7 @@ from catalystwan.api.templates.device_template.device_template import (
|
|
|
19
22
|
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
20
23
|
from catalystwan.api.templates.feature_template_field import FeatureTemplateField
|
|
21
24
|
from catalystwan.api.templates.feature_template_payload import FeatureTemplatePayload
|
|
25
|
+
from catalystwan.api.templates.models.aaa_model import AAAModel
|
|
22
26
|
from catalystwan.api.templates.models.cisco_aaa_model import CiscoAAAModel
|
|
23
27
|
from catalystwan.api.templates.models.cisco_banner_model import CiscoBannerModel
|
|
24
28
|
from catalystwan.api.templates.models.cisco_bfd_model import CiscoBFDModel
|
|
@@ -37,12 +41,15 @@ from catalystwan.api.templates.models.cli_template import CliTemplateModel
|
|
|
37
41
|
from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
|
|
38
42
|
from catalystwan.api.templates.models.security_vsmart_model import SecurityvSmart
|
|
39
43
|
from catalystwan.api.templates.models.system_vsmart_model import SystemVsmart
|
|
40
|
-
from catalystwan.
|
|
44
|
+
from catalystwan.api.templates.models.vpn_vsmart_interface_model import VpnVsmartInterfaceModel
|
|
45
|
+
from catalystwan.api.templates.models.vpn_vsmart_model import VpnVsmartModel
|
|
46
|
+
from catalystwan.dataclasses import Device, FeatureTemplatesTypes
|
|
41
47
|
from catalystwan.endpoints.configuration_device_template import FeatureToCLIPayload
|
|
42
|
-
from catalystwan.exceptions import AttachedError, TemplateNotFoundError
|
|
48
|
+
from catalystwan.exceptions import AttachedError, CatalystwanDeprecationWarning, TemplateNotFoundError
|
|
49
|
+
from catalystwan.models.common import DeviceModel
|
|
50
|
+
from catalystwan.models.templates import DeviceTemplateInformation, FeatureTemplateInformation, TemplateInformation
|
|
43
51
|
from catalystwan.response import ManagerResponse
|
|
44
52
|
from catalystwan.typed_list import DataSequence
|
|
45
|
-
from catalystwan.utils.device_model import DeviceModel
|
|
46
53
|
from catalystwan.utils.dict import merge
|
|
47
54
|
from catalystwan.utils.pydantic_field import get_extra_field
|
|
48
55
|
from catalystwan.utils.template_type import TemplateType
|
|
@@ -74,15 +81,15 @@ class TemplatesAPI:
|
|
|
74
81
|
self.session = session
|
|
75
82
|
|
|
76
83
|
@overload
|
|
77
|
-
def get(self, template: Type[DeviceTemplate]) -> DataSequence[
|
|
84
|
+
def get(self, template: Type[DeviceTemplate]) -> DataSequence[DeviceTemplateInformation]:
|
|
78
85
|
...
|
|
79
86
|
|
|
80
87
|
@overload
|
|
81
|
-
def get(self, template: Type[FeatureTemplate]) -> DataSequence[
|
|
88
|
+
def get(self, template: Type[FeatureTemplate]) -> DataSequence[FeatureTemplateInformation]:
|
|
82
89
|
...
|
|
83
90
|
|
|
84
91
|
@overload
|
|
85
|
-
def get(self, template: Type[CLITemplate]) -> DataSequence[
|
|
92
|
+
def get(self, template: Type[CLITemplate]) -> DataSequence[TemplateInformation]:
|
|
86
93
|
...
|
|
87
94
|
|
|
88
95
|
def get(self, template):
|
|
@@ -100,33 +107,29 @@ class TemplatesAPI:
|
|
|
100
107
|
def _get_feature_templates(
|
|
101
108
|
self,
|
|
102
109
|
summary: bool = True,
|
|
103
|
-
|
|
104
|
-
limit: Optional[int] = None,
|
|
105
|
-
) -> DataSequence[FeatureTemplateInfo]:
|
|
110
|
+
) -> DataSequence[FeatureTemplateInformation]:
|
|
106
111
|
"""In a multitenant vManage system, this API is only available in the Provider view."""
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
fr_templates = self.session.get(url=endpoint, params=params)
|
|
111
|
-
|
|
112
|
-
return fr_templates.dataseq(FeatureTemplateInfo)
|
|
112
|
+
return self.session.endpoints.configuration_general_template.get_feature_template_list(
|
|
113
|
+
params={"summary": summary}
|
|
114
|
+
)
|
|
113
115
|
|
|
114
116
|
def _get_device_templates(
|
|
115
117
|
self, feature: DeviceTemplateFeature = DeviceTemplateFeature.ALL
|
|
116
|
-
) -> DataSequence[
|
|
118
|
+
) -> DataSequence[DeviceTemplateInformation]:
|
|
117
119
|
"""In a multitenant vManage system, this API is only available in the Provider view."""
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
templates = self.session.get(url=endpoint, params=params)
|
|
122
|
-
return templates.dataseq(DeviceTemplateInfo)
|
|
120
|
+
return self.session.endpoints.configuration_template_master.get_device_template_list(
|
|
121
|
+
params={"feature": feature.value}
|
|
122
|
+
)
|
|
123
123
|
|
|
124
124
|
def attach(self, name: str, device: Device, timeout_seconds: int = 300, **kwargs):
|
|
125
|
-
|
|
126
|
-
if
|
|
125
|
+
template_info = self.get(DeviceTemplate).filter(name=name).single_or_default()
|
|
126
|
+
if not template_info:
|
|
127
|
+
raise TemplateNotFoundError(f"Template with name [{name}] does not exists.")
|
|
128
|
+
|
|
129
|
+
if template_info.config_type == TemplateType.CLI.value:
|
|
127
130
|
return self._attach_cli(name, device, timeout_seconds=timeout_seconds, **kwargs)
|
|
128
131
|
|
|
129
|
-
if
|
|
132
|
+
if template_info.config_type == TemplateType.FEATURE.value:
|
|
130
133
|
return self._attach_feature(name, device, timeout_seconds=timeout_seconds, **kwargs)
|
|
131
134
|
|
|
132
135
|
raise NotImplementedError()
|
|
@@ -175,17 +178,19 @@ class TemplatesAPI:
|
|
|
175
178
|
}
|
|
176
179
|
|
|
177
180
|
invalid = False
|
|
181
|
+
msg = {}
|
|
178
182
|
for var in vars:
|
|
179
183
|
if var.property not in payload["deviceTemplateList"][0]["device"][0]:
|
|
180
184
|
pointer = payload["deviceTemplateList"][0]["device"][0]
|
|
181
185
|
if var.property not in kwargs["device_specific_vars"]:
|
|
182
186
|
invalid = True
|
|
187
|
+
msg[var.property] = "should be provided in attach method as device_specific_vars kwarg."
|
|
183
188
|
logger.error(f"{var.property} should be provided in attach method as device_specific_vars kwarg.")
|
|
184
189
|
else:
|
|
185
190
|
pointer[var.property] = kwargs["device_specific_vars"][var.property] # type: ignore
|
|
186
191
|
|
|
187
192
|
if invalid:
|
|
188
|
-
raise TypeError()
|
|
193
|
+
raise TypeError(f"{msg}")
|
|
189
194
|
|
|
190
195
|
endpoint = "/dataservice/template/device/config/attachfeature"
|
|
191
196
|
logger.info(f"Attaching a template: {name} to the device: {device.hostname}.")
|
|
@@ -278,7 +283,7 @@ class TemplatesAPI:
|
|
|
278
283
|
def delete(self, template: Type[CLITemplate], name: str) -> bool: # type: ignore
|
|
279
284
|
...
|
|
280
285
|
|
|
281
|
-
def delete(self, template, name):
|
|
286
|
+
def delete(self, template, name) -> bool:
|
|
282
287
|
status = False
|
|
283
288
|
|
|
284
289
|
if template is FeatureTemplate:
|
|
@@ -375,12 +380,15 @@ class TemplatesAPI:
|
|
|
375
380
|
if isinstance(template, DeviceTemplate):
|
|
376
381
|
return self._edit_device_template(template)
|
|
377
382
|
|
|
383
|
+
if isinstance(template, CLITemplate):
|
|
384
|
+
return self._edit_cli_template(template, template_info)
|
|
385
|
+
|
|
378
386
|
raise NotImplementedError()
|
|
379
387
|
|
|
380
388
|
def _edit_device_template(self, template: DeviceTemplate):
|
|
381
389
|
self._create_device_template(template, True)
|
|
382
390
|
|
|
383
|
-
def _edit_feature_template(self, template: FeatureTemplate, data:
|
|
391
|
+
def _edit_feature_template(self, template: FeatureTemplate, data: FeatureTemplateInformation) -> ManagerResponse:
|
|
384
392
|
if self.is_created_by_generator(template):
|
|
385
393
|
debug = False
|
|
386
394
|
schema = self.get_feature_template_schema(template, debug)
|
|
@@ -393,6 +401,11 @@ class TemplatesAPI:
|
|
|
393
401
|
response = self.session.put(f"/dataservice/template/feature/{data.id}", json=payload)
|
|
394
402
|
return response
|
|
395
403
|
|
|
404
|
+
def _edit_cli_template(self, template: CLITemplate, data: TemplateInformation) -> ManagerResponse:
|
|
405
|
+
response = self.session.put(f"/dataservice/template/device/{data.id}", json=template.generate_payload())
|
|
406
|
+
|
|
407
|
+
return response
|
|
408
|
+
|
|
396
409
|
@overload
|
|
397
410
|
def create(self, template: FeatureTemplate, debug=False) -> str:
|
|
398
411
|
...
|
|
@@ -437,6 +450,9 @@ class TemplatesAPI:
|
|
|
437
450
|
logger.info(f"Template {template.template_name} ({template_type}) was created successfully ({template_id}).")
|
|
438
451
|
return template_id
|
|
439
452
|
|
|
453
|
+
@deprecated(
|
|
454
|
+
"Obsolete way to use Feature Templates - only create_by_generator", category=CatalystwanDeprecationWarning
|
|
455
|
+
)
|
|
440
456
|
def _create_feature_template(self, template: FeatureTemplate) -> str:
|
|
441
457
|
payload = template.generate_payload(self.session)
|
|
442
458
|
response = self.session.post("/dataservice/template/feature", json=json.loads(payload))
|
|
@@ -453,8 +469,8 @@ class TemplatesAPI:
|
|
|
453
469
|
|
|
454
470
|
def _create_device_template(self, device_template: DeviceTemplate, edit: bool = False) -> str:
|
|
455
471
|
def get_general_template_info(
|
|
456
|
-
name: str, fr_templates: DataSequence[
|
|
457
|
-
) ->
|
|
472
|
+
name: str, fr_templates: DataSequence[FeatureTemplateInformation]
|
|
473
|
+
) -> FeatureTemplateInformation:
|
|
458
474
|
_template = fr_templates.filter(name=name).single_or_default()
|
|
459
475
|
|
|
460
476
|
if not _template:
|
|
@@ -464,19 +480,19 @@ class TemplatesAPI:
|
|
|
464
480
|
|
|
465
481
|
def parse_general_template(
|
|
466
482
|
general_template: GeneralTemplate,
|
|
467
|
-
fr_templates: DataSequence[
|
|
483
|
+
fr_templates: DataSequence[FeatureTemplateInformation],
|
|
468
484
|
) -> GeneralTemplate:
|
|
469
|
-
if general_template.
|
|
470
|
-
general_template.
|
|
471
|
-
parse_general_template(_t, fr_templates) for _t in general_template.
|
|
485
|
+
if general_template.sub_templates:
|
|
486
|
+
general_template.sub_templates = [
|
|
487
|
+
parse_general_template(_t, fr_templates) for _t in general_template.sub_templates
|
|
472
488
|
]
|
|
473
489
|
if general_template.name:
|
|
474
490
|
info = get_general_template_info(general_template.name, fr_templates)
|
|
475
491
|
return GeneralTemplate(
|
|
476
492
|
name=general_template.name,
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
493
|
+
sub_templates=general_template.sub_templates,
|
|
494
|
+
template_id=info.id,
|
|
495
|
+
template_type=info.template_type,
|
|
480
496
|
)
|
|
481
497
|
else:
|
|
482
498
|
return general_template
|
|
@@ -494,13 +510,18 @@ class TemplatesAPI:
|
|
|
494
510
|
.id
|
|
495
511
|
)
|
|
496
512
|
payload = json.loads(device_template.generate_payload())
|
|
497
|
-
response = self.session.
|
|
513
|
+
response = self.session.endpoints.configuration_template_master.edit_template(
|
|
514
|
+
template_id=template_id, payload=payload
|
|
515
|
+
)
|
|
516
|
+
return response
|
|
498
517
|
else:
|
|
499
|
-
endpoint = "/dataservice/template/device/feature/"
|
|
500
518
|
payload = json.loads(device_template.generate_payload())
|
|
501
|
-
response =
|
|
502
|
-
|
|
503
|
-
|
|
519
|
+
response = (
|
|
520
|
+
self.session.endpoints.configuration_template_master.create_device_template_from_feature_templates(
|
|
521
|
+
payload=payload
|
|
522
|
+
)
|
|
523
|
+
)
|
|
524
|
+
return response.template_id
|
|
504
525
|
|
|
505
526
|
def is_created_by_generator(self, template: FeatureTemplate) -> bool:
|
|
506
527
|
"""Checks if template is created by generator
|
|
@@ -508,6 +529,7 @@ class TemplatesAPI:
|
|
|
508
529
|
Method will be deleted if every template's payload will be generated dynamically.
|
|
509
530
|
"""
|
|
510
531
|
ported_templates = (
|
|
532
|
+
AAAModel,
|
|
511
533
|
CiscoAAAModel,
|
|
512
534
|
CiscoBFDModel,
|
|
513
535
|
CiscoBannerModel,
|
|
@@ -526,6 +548,8 @@ class TemplatesAPI:
|
|
|
526
548
|
CliTemplateModel,
|
|
527
549
|
CiscoSecureInternetGatewayModel,
|
|
528
550
|
CiscoOspfv3Model,
|
|
551
|
+
VpnVsmartModel,
|
|
552
|
+
VpnVsmartInterfaceModel,
|
|
529
553
|
)
|
|
530
554
|
|
|
531
555
|
return isinstance(template, ported_templates)
|
|
@@ -556,7 +580,7 @@ class TemplatesAPI:
|
|
|
556
580
|
name=template.template_name,
|
|
557
581
|
description=template.template_description,
|
|
558
582
|
template_type=template.type,
|
|
559
|
-
device_types=[device_model
|
|
583
|
+
device_types=[device_model for device_model in template.device_models],
|
|
560
584
|
definition={},
|
|
561
585
|
) # type: ignore
|
|
562
586
|
|
|
@@ -566,6 +590,7 @@ class TemplatesAPI:
|
|
|
566
590
|
for field in fr_template_fields:
|
|
567
591
|
value = None
|
|
568
592
|
priority_order = None
|
|
593
|
+
json_dumped_value = None
|
|
569
594
|
# TODO How to discover Device specific variable
|
|
570
595
|
if field.key in template.device_specific_variables:
|
|
571
596
|
value = template.device_specific_variables[field.key]
|
|
@@ -603,7 +628,7 @@ class TemplatesAPI:
|
|
|
603
628
|
available_devices_for_template = [device["name"] for device in template_type.device_models]
|
|
604
629
|
|
|
605
630
|
provided_device_models = [
|
|
606
|
-
dev_mod
|
|
631
|
+
dev_mod if type(dev_mod) is DeviceModel else dev_mod for dev_mod in template.device_models
|
|
607
632
|
]
|
|
608
633
|
|
|
609
634
|
if not all(dev in available_devices_for_template for dev in provided_device_models):
|
|
@@ -698,3 +723,47 @@ class TemplatesAPI:
|
|
|
698
723
|
config = CiscoConfParse(response["config"].splitlines())
|
|
699
724
|
logger.debug(f"Template loaded from {device.hostname}.")
|
|
700
725
|
return config
|
|
726
|
+
|
|
727
|
+
def get_feature_templates(self) -> DataSequence[FeatureTemplateInformation]:
|
|
728
|
+
endpoint = "/dataservice/template/feature"
|
|
729
|
+
fr_templates = self.session.get(endpoint)
|
|
730
|
+
return fr_templates.dataseq(FeatureTemplateInformation)
|
|
731
|
+
|
|
732
|
+
def get_device_templates(self) -> DataSequence[DeviceTemplateInformation]:
|
|
733
|
+
endpoint = "/dataservice/template/device"
|
|
734
|
+
params = {"feature": "all"}
|
|
735
|
+
templates = self.session.get(url=endpoint, params=params)
|
|
736
|
+
return templates.dataseq(DeviceTemplateInformation)
|
|
737
|
+
|
|
738
|
+
def get_device_template(self, template_id: str) -> DeviceTemplate:
|
|
739
|
+
endpoint = f"/dataservice/template/device/object/{template_id}"
|
|
740
|
+
response = self.session.get(endpoint)
|
|
741
|
+
return DeviceTemplate(**response.json())
|
|
742
|
+
|
|
743
|
+
def get_device_template_attached_devices_variables(self, template_id: str) -> List[DeviceInputValues]:
|
|
744
|
+
"""
|
|
745
|
+
Fetches and processes attached device variables for a given device template.
|
|
746
|
+
|
|
747
|
+
Args:
|
|
748
|
+
template_id (str): The ID of the device template.
|
|
749
|
+
|
|
750
|
+
Returns:
|
|
751
|
+
List[DeviceInputValues]: A list of DeviceInputValues objects containing device variables.
|
|
752
|
+
"""
|
|
753
|
+
api = self.session.endpoints.configuration_device_template
|
|
754
|
+
|
|
755
|
+
# Fetch attached devices for the template
|
|
756
|
+
attached_devices = api.get_device_config_attached(template_id)
|
|
757
|
+
|
|
758
|
+
# Prepare payload for fetching device variables
|
|
759
|
+
payload = CreateDeviceInputPayload(
|
|
760
|
+
template_id=template_id,
|
|
761
|
+
device_ids=[d.uuid for d in attached_devices if d.uuid],
|
|
762
|
+
is_edited=False,
|
|
763
|
+
is_master_edited=False,
|
|
764
|
+
)
|
|
765
|
+
|
|
766
|
+
# Fetch device variables
|
|
767
|
+
result = api.create_device_input(payload).data
|
|
768
|
+
|
|
769
|
+
return result
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
## Feature Template Creation
|
|
4
4
|
|
|
5
5
|
```python
|
|
6
|
+
from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
|
|
7
|
+
|
|
6
8
|
omp_vsmart = OMPvSmart(
|
|
7
9
|
name="my_first_template",
|
|
8
10
|
description="NA",
|
|
9
|
-
device_models=[
|
|
11
|
+
device_models=["vsmart"]
|
|
10
12
|
|
|
11
13
|
)
|
|
12
14
|
|
|
@@ -14,74 +16,86 @@ session.api.templates.create(omp_vsmart)
|
|
|
14
16
|
```
|
|
15
17
|
|
|
16
18
|
## Add new Feature Template in Cisco Catalyst WAN SDK
|
|
17
|
-
These steps will help you to automate feature template creation. We'll explain what to do and why, so everyone will have deep understanding how our templates work. In the example we will try to create `OMP` Feature Template for vSmart.
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
These steps will help you to automate feature template creation. We'll explain what to do and why, so everyone will have deep understanding how our templates work. In the example we will try to create `OMP` Feature Template for vSmart.
|
|
21
|
+
|
|
22
|
+
1. Get your template type name and version.
|
|
20
23
|
>Note: display name is not template type name!
|
|
24
|
+
|
|
21
25
|
- For example, you could extract it from response body. Go to your Manager and create any template which you would like to automate in catalystwan. Send template creation request and check for `templateType` and `templateMinVersion` variable names. `OMP` (display name) for vSmart has `omp-vsmart` template type name.
|
|
22
26
|
|
|
23
27
|
2. With corresponding `templateType` we are able to create new class which implements `FeatureTemplate` interface. Create new file in `catalystwan\api\templates\models\` and copy-paste the code and change name of the class with its type attribute.
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
```python
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
from typing import ClassVar
|
|
32
|
+
from pydantic import ConfigDict
|
|
33
|
+
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class OMPvSmart(FeatureTemplate):
|
|
37
|
+
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
|
|
30
38
|
|
|
39
|
+
payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
|
|
40
|
+
type: ClassVar[str] = "omp-vsmart"
|
|
41
|
+
```
|
|
31
42
|
|
|
32
|
-
class OMPvSmart(FeatureTemplate):
|
|
33
|
-
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
|
|
34
|
-
|
|
35
|
-
payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
|
|
36
|
-
type: ClassVar[str] = "omp-vsmart"
|
|
37
|
-
```
|
|
38
43
|
3. (This step is temporary) Find `is_created_by_generator` method in `template_api` and add your new template class.
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
```python
|
|
46
|
+
ported_templates = (..., OMPvSmart)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
NOTE: This step will be removed once all template payloads will be generated automatically.
|
|
50
|
+
|
|
44
51
|
4. (This step is temporary) Find `available_models` definition in 'supported' and add your new template class.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
available_models = {
|
|
55
|
+
(...)
|
|
56
|
+
'omp_vsmart': OMPvSmart
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
NOTE: This step will be removed once all template payloads will be generated dynamically.
|
|
61
|
+
|
|
52
62
|
5. We can try to create our first template with default values.
|
|
53
|
-
```python
|
|
54
|
-
omp_vsmart = OMPvSmart(
|
|
55
|
-
name="my_first_template",
|
|
56
|
-
description="NA",
|
|
57
|
-
device_models=[DeviceModel.VSMART]
|
|
58
|
-
)
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
```python
|
|
65
|
+
omp_vsmart = OMPvSmart(
|
|
66
|
+
name="my_first_template",
|
|
67
|
+
description="NA",
|
|
68
|
+
device_models=["vsmart"]
|
|
69
|
+
)
|
|
63
70
|
|
|
64
|
-
|
|
71
|
+
session.api.templates.create(omp_vsmart)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
If everything went successfuly, we will get similar message:
|
|
75
|
+
|
|
76
|
+
`Template my_first_template (FeatureTemplate) was created successfully (7e56acdd-640e-45dc-9335-87abc697995f).`
|
|
65
77
|
|
|
66
78
|
6. We can check whether our template is created sucessfully in Manager manually. If there is an error, please create an issue with error and try go to the 7th step.
|
|
67
|
-
|
|
68
|
-
### Customize Feature Template fields
|
|
79
|
+
|
|
80
|
+
### Customize Feature Template fields
|
|
81
|
+
|
|
69
82
|
7. Run below code with already created session and changed corresponding variables.
|
|
70
83
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
```python
|
|
85
|
+
# TODO: Use 2nd layer.
|
|
86
|
+
import json
|
|
74
87
|
|
|
75
88
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
89
|
+
template_type = "omp-vsmart" # Change this value
|
|
90
|
+
template_version = "15.0.0" # Change this value
|
|
91
|
+
endpoint = f"/dataservice/template/feature/types/definition/{template_type}/{template_version}"
|
|
79
92
|
|
|
80
|
-
|
|
93
|
+
schema = session.get(url=endpoint).json()
|
|
81
94
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
95
|
+
with open(f"response_{template_type}.json", "w") as f:
|
|
96
|
+
f.write(json.dumps(schema, indent=4))
|
|
97
|
+
```
|
|
85
98
|
|
|
86
99
|
8. Open `response_{template_type}.json` file.
|
|
100
|
+
|
|
87
101
|
9. Find `fields` key. The value should be list of dictionaries. Get every possible key in the dictionary and fill our class with every possible key. You can find the code in `catalystwan\api\templates\models\omp_vsmart_model.py` file.
|
|
@@ -13,7 +13,7 @@ from requests.exceptions import HTTPError
|
|
|
13
13
|
|
|
14
14
|
from catalystwan.dataclasses import Device
|
|
15
15
|
from catalystwan.exceptions import TemplateTypeError
|
|
16
|
-
from catalystwan.
|
|
16
|
+
from catalystwan.models.common import DeviceModel
|
|
17
17
|
from catalystwan.utils.template_type import TemplateType
|
|
18
18
|
|
|
19
19
|
logger = logging.getLogger(__name__)
|
|
@@ -62,21 +62,31 @@ class CLITemplate:
|
|
|
62
62
|
logger.debug(f"Template loaded from {device.hostname}.")
|
|
63
63
|
return self.config
|
|
64
64
|
|
|
65
|
+
def load_from_file(self, file: str) -> CiscoConfParse:
|
|
66
|
+
"""Load CLI config from file.
|
|
67
|
+
Args:
|
|
68
|
+
file: The path of the file to be loaded.
|
|
69
|
+
Returns:
|
|
70
|
+
CiscoConfParse: Loaded template.
|
|
71
|
+
"""
|
|
72
|
+
self.config = CiscoConfParse(file)
|
|
73
|
+
return self.config
|
|
74
|
+
|
|
65
75
|
def generate_payload(self) -> dict:
|
|
66
76
|
config_str = "\n".join(self.config.ioscfg)
|
|
67
77
|
payload = {
|
|
68
78
|
"templateName": self.template_name,
|
|
69
79
|
"templateDescription": self.template_description,
|
|
70
|
-
"deviceType": self.device_model
|
|
80
|
+
"deviceType": self.device_model,
|
|
71
81
|
"templateConfiguration": config_str,
|
|
72
82
|
"factoryDefault": False,
|
|
73
83
|
"configType": "file",
|
|
74
84
|
}
|
|
75
85
|
if self.device_model not in [
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
86
|
+
"vedge",
|
|
87
|
+
"vsmart",
|
|
88
|
+
"vmanage",
|
|
89
|
+
"vedge-cloud",
|
|
80
90
|
]:
|
|
81
91
|
payload["cliType"] = "device"
|
|
82
92
|
payload["draftMode"] = False
|
|
@@ -100,7 +110,7 @@ class CLITemplate:
|
|
|
100
110
|
"templateId": id,
|
|
101
111
|
"templateName": self.template_name,
|
|
102
112
|
"templateDescription": self.template_description,
|
|
103
|
-
"deviceType": self.device_model
|
|
113
|
+
"deviceType": self.device_model,
|
|
104
114
|
"templateConfiguration": config_str,
|
|
105
115
|
"factoryDefault": False,
|
|
106
116
|
"configType": "file",
|