catalystwan 0.41.2.dev9__py3-none-any.whl → 0.41.3__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/ENDPOINTS.md +611 -0
- catalystwan/__init__.py +2 -3
- catalystwan/api/administration.py +2 -13
- catalystwan/api/api_container.py +1 -4
- catalystwan/api/config_group_api.py +16 -41
- catalystwan/api/configuration_groups/parcel.py +30 -100
- catalystwan/api/configuration_groups/parcels/cellular_controller.py +33 -0
- catalystwan/api/feature_profile_api.py +237 -2016
- catalystwan/api/policy_api.py +116 -470
- catalystwan/api/template_api.py +44 -113
- catalystwan/api/templates/README.md +47 -61
- catalystwan/api/templates/cli_template.py +7 -17
- catalystwan/api/templates/device_template/device_template.py +32 -127
- catalystwan/api/templates/device_template/device_template_payload.json.j2 +19 -0
- catalystwan/api/templates/feature_template.py +3 -3
- catalystwan/api/templates/models/cisco_aaa_model.py +42 -289
- catalystwan/api/templates/models/cisco_banner_model.py +2 -11
- catalystwan/api/templates/models/cisco_bfd_model.py +36 -31
- catalystwan/api/templates/models/cisco_bgp_model.py +131 -382
- catalystwan/api/templates/models/cisco_logging_model.py +43 -80
- catalystwan/api/templates/models/cisco_ntp_model.py +15 -34
- catalystwan/api/templates/models/cisco_omp_model.py +60 -70
- catalystwan/api/templates/models/cisco_ospf.py +74 -143
- catalystwan/api/templates/models/cisco_ospfv3.py +95 -217
- catalystwan/api/templates/models/cisco_secure_internet_gateway.py +142 -304
- catalystwan/api/templates/models/cisco_snmp_model.py +52 -66
- catalystwan/api/templates/models/cisco_system.py +129 -238
- catalystwan/api/templates/models/cisco_vpn_interface_model.py +275 -632
- catalystwan/api/templates/models/cisco_vpn_model.py +270 -433
- catalystwan/api/templates/models/cli_template.py +2 -3
- catalystwan/api/templates/models/omp_vsmart_model.py +10 -46
- catalystwan/api/templates/models/security_vsmart_model.py +8 -11
- catalystwan/api/templates/models/supported.py +4 -10
- catalystwan/api/templates/models/system_vsmart_model.py +27 -164
- catalystwan/apigw_auth.py +2 -6
- catalystwan/dataclasses.py +53 -2
- catalystwan/endpoints/__init__.py +41 -41
- catalystwan/endpoints/certificate_management_device.py +0 -4
- catalystwan/endpoints/cluster_management.py +9 -30
- catalystwan/endpoints/configuration/feature_profile/sdwan/policy_object.py +12 -35
- catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +11 -164
- catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +26 -144
- catalystwan/endpoints/configuration/policy/definition/access_control_list.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/control.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/device_access.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/hub_and_spoke.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/mesh.py +11 -2
- catalystwan/endpoints/configuration/policy/definition/qos_map.py +11 -2
- catalystwan/endpoints/configuration/policy/definition/rewrite.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/rule_set.py +11 -2
- catalystwan/endpoints/configuration/policy/definition/security_group.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/traffic_data.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +11 -6
- catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +11 -6
- catalystwan/endpoints/configuration/policy/list/app.py +16 -3
- catalystwan/endpoints/configuration/policy/list/app_probe.py +15 -6
- catalystwan/endpoints/configuration/policy/list/as_path.py +16 -3
- catalystwan/endpoints/configuration/policy/list/class_map.py +16 -3
- catalystwan/endpoints/configuration/policy/list/color.py +16 -3
- catalystwan/endpoints/configuration/policy/list/community.py +16 -3
- catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +15 -6
- catalystwan/endpoints/configuration/policy/list/data_prefix.py +16 -3
- catalystwan/endpoints/configuration/policy/list/expanded_community.py +15 -6
- catalystwan/endpoints/configuration/policy/list/fqdn.py +16 -3
- catalystwan/endpoints/configuration/policy/list/geo_location.py +16 -3
- catalystwan/endpoints/configuration/policy/list/ips_signature.py +15 -6
- catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +16 -3
- catalystwan/endpoints/configuration/policy/list/local_app.py +16 -3
- catalystwan/endpoints/configuration/policy/list/local_domain.py +16 -3
- catalystwan/endpoints/configuration/policy/list/mirror.py +16 -3
- catalystwan/endpoints/configuration/policy/list/policer.py +16 -3
- catalystwan/endpoints/configuration/policy/list/port.py +16 -3
- catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +15 -6
- catalystwan/endpoints/configuration/policy/list/prefix.py +16 -4
- catalystwan/endpoints/configuration/policy/list/protocol_name.py +15 -6
- catalystwan/endpoints/configuration/policy/list/region.py +10 -2
- catalystwan/endpoints/configuration/policy/list/site.py +16 -3
- catalystwan/endpoints/configuration/policy/list/sla.py +16 -3
- catalystwan/endpoints/configuration/policy/list/tloc.py +16 -3
- catalystwan/endpoints/configuration/policy/list/url_allow_list.py +16 -3
- catalystwan/endpoints/configuration/policy/list/url_block_list.py +16 -3
- catalystwan/endpoints/configuration/policy/list/vpn.py +16 -3
- catalystwan/endpoints/configuration/policy/list/zone.py +16 -3
- catalystwan/endpoints/configuration/policy/security_template.py +3 -2
- catalystwan/endpoints/configuration/software_actions.py +4 -2
- catalystwan/endpoints/configuration_dashboard_status.py +2 -2
- catalystwan/endpoints/configuration_device_template.py +1 -15
- catalystwan/endpoints/configuration_feature_profile.py +11 -8
- catalystwan/endpoints/configuration_group.py +5 -28
- catalystwan/endpoints/configuration_settings.py +1 -90
- catalystwan/endpoints/endpoints_container.py +18 -82
- catalystwan/endpoints/real_time_monitoring/reboot_history.py +3 -1
- catalystwan/endpoints/tenant_migration.py +0 -2
- catalystwan/exceptions.py +0 -24
- catalystwan/integration_tests/test_find_template_values.py +18 -7
- catalystwan/models/common.py +2 -1898
- catalystwan/models/configuration/common.py +0 -1
- catalystwan/models/configuration/config_migration.py +36 -0
- catalystwan/models/configuration/feature_profile/common.py +149 -634
- catalystwan/models/configuration/feature_profile/sdwan/management/vpn.py +26 -0
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/__init__.py +60 -69
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +20 -34
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +6 -8
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +4 -13
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +7 -9
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_data_prefix.py +9 -11
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +10 -25
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/{policer.py → policier.py} +10 -12
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +10 -29
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +8 -23
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +31 -12
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +10 -16
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +7 -8
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/application_list.py +6 -8
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ips_signature.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +5 -7
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +11 -21
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url.py +15 -36
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +18 -14
- catalystwan/models/configuration/feature_profile/sdwan/service/acl.py +409 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +42 -77
- catalystwan/models/configuration/feature_profile/sdwan/service/bgp.py +288 -0
- catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +64 -107
- catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +42 -39
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +88 -7
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +156 -232
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +108 -38
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +84 -77
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +56 -62
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +121 -112
- catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +57 -56
- catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +21 -15
- catalystwan/models/configuration/feature_profile/sdwan/{routing → service}/ospf.py +47 -55
- catalystwan/models/configuration/feature_profile/sdwan/{routing → service}/ospfv3.py +72 -74
- catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +110 -358
- catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +25 -17
- catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +58 -50
- catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +21 -12
- catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +31 -27
- catalystwan/models/configuration/feature_profile/sdwan/system/aaa.py +10 -58
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +23 -26
- catalystwan/models/configuration/profile_type.py +6 -1
- catalystwan/models/policy/__init__.py +69 -282
- catalystwan/models/policy/centralized.py +29 -26
- catalystwan/models/policy/{definition → definitions}/access_control_list.py +17 -47
- catalystwan/models/policy/{definition → definitions}/access_control_list_ipv6.py +18 -42
- catalystwan/models/policy/{definition → definitions}/control.py +25 -48
- catalystwan/models/policy/{definition → definitions}/device_access.py +11 -22
- catalystwan/models/policy/{definition → definitions}/device_access_ipv6.py +11 -20
- catalystwan/models/policy/{definition → definitions}/hub_and_spoke.py +4 -18
- catalystwan/models/policy/{definition → definitions}/mesh.py +1 -13
- catalystwan/models/policy/{definition → definitions}/qos_map.py +32 -39
- catalystwan/models/policy/{definition → definitions}/rewrite.py +2 -12
- catalystwan/models/policy/{definition → definitions}/rule_set.py +48 -66
- catalystwan/models/policy/{definition → definitions}/security_group.py +14 -38
- catalystwan/models/policy/{definition → definitions}/traffic_data.py +61 -184
- catalystwan/models/policy/{definition → definitions}/vpn_membership.py +1 -13
- catalystwan/models/policy/{definition → definitions}/zone_based_firewall.py +32 -93
- catalystwan/models/policy/lists.py +330 -0
- catalystwan/models/policy/lists_entries.py +444 -0
- catalystwan/models/policy/localized.py +16 -34
- catalystwan/models/policy/policy.py +10 -14
- catalystwan/models/policy/policy_definition.py +173 -673
- catalystwan/models/policy/policy_list.py +27 -38
- catalystwan/models/policy/security.py +46 -145
- catalystwan/response.py +2 -6
- catalystwan/session.py +1 -1
- catalystwan/tests/templates/definitions/{cisco_vpn_basic.json → Basic_Cisco_VPN_Model.json} +2 -2
- catalystwan/tests/templates/definitions/complex_aaa.json +277 -0
- catalystwan/tests/templates/definitions/{cisco_vpn_complex.json → complex_cisco_vpn.json} +12 -27
- catalystwan/tests/templates/definitions/{cisco_aaa.json → iuo.json} +15 -44
- catalystwan/tests/templates/definitions/omp_1.json +11 -0
- catalystwan/tests/templates/definitions/{omp_vsmart_2.json → omp_2.json} +2 -16
- catalystwan/tests/templates/definitions/{omp_vsmart_3.json → omp_3.json} +2 -16
- catalystwan/tests/templates/models/__init__.py +13 -46
- catalystwan/tests/templates/models/cisco_aaa.py +48 -81
- catalystwan/tests/templates/models/cisco_banner.py +2 -2
- catalystwan/tests/templates/models/cisco_bfd.py +6 -4
- catalystwan/tests/templates/models/cisco_system.py +3 -108
- catalystwan/tests/templates/models/cisco_vpn.py +72 -42
- catalystwan/tests/templates/models/omp_vsmart.py +8 -28
- catalystwan/tests/templates/schemas/cedge_aaa.json +1 -1
- catalystwan/tests/templates/schemas/cisco_system.json +0 -242
- catalystwan/tests/templates/schemas/cisco_vpn.json +1 -53
- catalystwan/tests/templates/schemas/omp-vsmart.json +0 -20
- catalystwan/tests/templates/test_chose_model.py +10 -6
- catalystwan/tests/templates/test_deserialize_model.py +4 -4
- catalystwan/tests/templates/test_find_template_values.py +0 -229
- catalystwan/tests/templates/test_serialize_model.py +2 -1
- catalystwan/tests/test_cli_template.py +9 -8
- catalystwan/tests/test_endpoints.py +11 -42
- catalystwan/tests/test_templates.py +19 -16
- catalystwan/utils/feature_template/find_template_values.py +9 -22
- catalystwan/utils/timezone.py +422 -0
- catalystwan/workflows/tenant_migration.py +1 -1
- {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/METADATA +1 -20
- catalystwan-0.41.3.dist-info/RECORD +353 -0
- catalystwan/api/builders/__init__.py +0 -14
- catalystwan/api/builders/feature_profiles/__init__.py +0 -0
- catalystwan/api/builders/feature_profiles/application_priority.py +0 -58
- catalystwan/api/builders/feature_profiles/builder_factory.py +0 -59
- catalystwan/api/builders/feature_profiles/cli.py +0 -76
- catalystwan/api/builders/feature_profiles/mixins.py +0 -44
- catalystwan/api/builders/feature_profiles/other.py +0 -79
- catalystwan/api/builders/feature_profiles/report.py +0 -155
- catalystwan/api/builders/feature_profiles/service.py +0 -248
- catalystwan/api/builders/feature_profiles/system.py +0 -80
- catalystwan/api/builders/feature_profiles/transport.py +0 -256
- catalystwan/api/builders/feature_profiles/uc_voice.py +0 -287
- catalystwan/api/templates/models/aaa_model.py +0 -387
- catalystwan/api/templates/models/vpn_vsmart_interface_model.py +0 -198
- catalystwan/api/templates/models/vpn_vsmart_model.py +0 -124
- catalystwan/endpoints/configuration/feature_profile/sdwan/application_priority.py +0 -107
- catalystwan/endpoints/configuration/feature_profile/sdwan/cli.py +0 -60
- catalystwan/endpoints/configuration/feature_profile/sdwan/dns_security.py +0 -83
- catalystwan/endpoints/configuration/feature_profile/sdwan/embedded_security.py +0 -88
- catalystwan/endpoints/configuration/feature_profile/sdwan/other.py +0 -62
- catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +0 -154
- catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +0 -88
- catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +0 -93
- catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +0 -77
- catalystwan/endpoints/configuration/network_hierarchy.py +0 -47
- catalystwan/endpoints/configuration/packages.py +0 -36
- catalystwan/endpoints/configuration/policy/abstractions.py +0 -49
- catalystwan/endpoints/configuration/policy/definition/aip.py +0 -52
- catalystwan/endpoints/configuration/policy/definition/amp.py +0 -52
- catalystwan/endpoints/configuration/policy/definition/app_route.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/cflowd.py +0 -46
- catalystwan/endpoints/configuration/policy/definition/dial_peer.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/dns_security.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/fxo_port.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/fxs_did_port.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/fxs_port.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +0 -52
- catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/route_policy.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/srst_phone_profile.py +0 -59
- catalystwan/endpoints/configuration/policy/definition/ssl_decryption.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/ssl_decryption_utd_profile.py +0 -52
- catalystwan/endpoints/configuration/policy/definition/url_filtering.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +0 -50
- catalystwan/endpoints/configuration/policy/list/extended_community.py +0 -52
- catalystwan/endpoints/configuration/policy/list/fax_protocol.py +0 -48
- catalystwan/endpoints/configuration/policy/list/identity.py +0 -48
- catalystwan/endpoints/configuration/policy/list/media_profile.py +0 -52
- catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +0 -52
- catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +0 -52
- catalystwan/endpoints/configuration/policy/list/supervisory_disconnect.py +0 -52
- catalystwan/endpoints/configuration/policy/list/threat_grid_api_key.py +0 -52
- catalystwan/endpoints/configuration/policy/list/translation_profile.py +0 -52
- catalystwan/endpoints/configuration/policy/list/translation_rules.py +0 -52
- catalystwan/endpoints/configuration/policy/list/trunkgroup.py +0 -48
- catalystwan/endpoints/configuration/policy/list/umbrella_data.py +0 -52
- catalystwan/endpoints/configuration/policy/voice_template.py +0 -39
- catalystwan/endpoints/configuration/policy_group.py +0 -30
- catalystwan/endpoints/configuration/topology_group.py +0 -51
- catalystwan/endpoints/configuration_general_template.py +0 -31
- catalystwan/endpoints/configuration_template_master.py +0 -48
- catalystwan/integration_tests/base.py +0 -81
- 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 +0 -33
- catalystwan/integration_tests/feature_profile/sdwan/policy/test_extended_community.py +0 -33
- catalystwan/integration_tests/feature_profile/sdwan/policy/test_security_app_list.py +0 -32
- catalystwan/integration_tests/feature_profile/sdwan/test_application_priority.py +0 -433
- catalystwan/integration_tests/feature_profile/sdwan/test_cli.py +0 -54
- catalystwan/integration_tests/feature_profile/sdwan/test_dns_security.py +0 -106
- catalystwan/integration_tests/feature_profile/sdwan/test_other.py +0 -49
- catalystwan/integration_tests/feature_profile/sdwan/test_service.py +0 -1078
- catalystwan/integration_tests/feature_profile/sdwan/test_sig_security.py +0 -322
- catalystwan/integration_tests/feature_profile/sdwan/test_ssl_decryption.py +0 -85
- catalystwan/integration_tests/feature_profile/sdwan/test_system.py +0 -368
- catalystwan/integration_tests/feature_profile/sdwan/test_tracker.py +0 -127
- catalystwan/integration_tests/feature_profile/sdwan/test_transport.py +0 -1698
- catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +0 -93
- catalystwan/integration_tests/feature_profile/test_parcel.py +0 -54
- catalystwan/integration_tests/profile_builder/__init__.py +0 -0
- catalystwan/integration_tests/profile_builder/test_pb_service.py +0 -197
- catalystwan/integration_tests/profile_builder/test_pb_transport.py +0 -226
- catalystwan/integration_tests/profile_builder/test_pb_uc_voice.py +0 -277
- catalystwan/integration_tests/test_data/__init__.py +0 -117
- catalystwan/integration_tests/test_network_hierarchy.py +0 -82
- catalystwan/integration_tests/test_settings.py +0 -30
- catalystwan/models/configuration/feature_profile/parcel.py +0 -245
- catalystwan/models/configuration/feature_profile/sdwan/acl/__init__.py +0 -13
- catalystwan/models/configuration/feature_profile/sdwan/acl/ipv4acl.py +0 -298
- catalystwan/models/configuration/feature_profile/sdwan/acl/ipv6acl.py +0 -344
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/__init__.py +0 -218
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/cloud_probe.py +0 -61
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/policy_settings.py +0 -31
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/qos_policy.py +0 -102
- catalystwan/models/configuration/feature_profile/sdwan/application_priority/traffic_policy.py +0 -1057
- catalystwan/models/configuration/feature_profile/sdwan/cli/__init__.py +0 -23
- catalystwan/models/configuration/feature_profile/sdwan/cli/config.py +0 -18
- catalystwan/models/configuration/feature_profile/sdwan/cli/full_config.py +0 -15
- catalystwan/models/configuration/feature_profile/sdwan/dns_security/__init__.py +0 -13
- catalystwan/models/configuration/feature_profile/sdwan/dns_security/dns.py +0 -110
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/__init__.py +0 -23
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/ngfirewall.py +0 -493
- catalystwan/models/configuration/feature_profile/sdwan/embedded_security/policy.py +0 -171
- catalystwan/models/configuration/feature_profile/sdwan/other/__init__.py +0 -25
- catalystwan/models/configuration/feature_profile/sdwan/other/cybervision.py +0 -44
- catalystwan/models/configuration/feature_profile/sdwan/other/thousandeyes.py +0 -147
- catalystwan/models/configuration/feature_profile/sdwan/other/ucse.py +0 -110
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +0 -22
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +0 -34
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_network_object.py +0 -15
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv4_service_object.py +0 -254
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/mirror.py +0 -27
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/network_object_group.py +0 -15
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/object_group.py +0 -15
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +0 -21
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/aip.py +0 -64
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/amp.py +0 -79
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/identity.py +0 -30
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/intrusion_prevention.py +0 -58
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/object_group.py +0 -72
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/rule_set.py +0 -137
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption.py +0 -126
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/ssl_decryption_profile.py +0 -165
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +0 -148
- catalystwan/models/configuration/feature_profile/sdwan/routing/__init__.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/routing/bgp.py +0 -609
- catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +0 -91
- catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +0 -101
- catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +0 -38
- catalystwan/models/configuration/feature_profile/sdwan/sig_security/__init__.py +0 -19
- catalystwan/models/configuration/feature_profile/sdwan/sig_security/sig_security.py +0 -379
- catalystwan/models/configuration/feature_profile/sdwan/system/__init__.py +0 -59
- catalystwan/models/configuration/feature_profile/sdwan/system/banner.py +0 -30
- catalystwan/models/configuration/feature_profile/sdwan/system/basic.py +0 -290
- catalystwan/models/configuration/feature_profile/sdwan/system/bfd.py +0 -69
- catalystwan/models/configuration/feature_profile/sdwan/system/device_access.py +0 -157
- catalystwan/models/configuration/feature_profile/sdwan/system/device_access_ipv6.py +0 -157
- catalystwan/models/configuration/feature_profile/sdwan/system/global_parcel.py +0 -163
- catalystwan/models/configuration/feature_profile/sdwan/system/logging_parcel.py +0 -162
- catalystwan/models/configuration/feature_profile/sdwan/system/mrf.py +0 -75
- catalystwan/models/configuration/feature_profile/sdwan/system/ntp.py +0 -103
- catalystwan/models/configuration/feature_profile/sdwan/system/omp.py +0 -120
- catalystwan/models/configuration/feature_profile/sdwan/system/security.py +0 -179
- catalystwan/models/configuration/feature_profile/sdwan/system/snmp.py +0 -173
- catalystwan/models/configuration/feature_profile/sdwan/topology/__init__.py +0 -29
- catalystwan/models/configuration/feature_profile/sdwan/topology/custom_control.py +0 -425
- catalystwan/models/configuration/feature_profile/sdwan/topology/hubspoke.py +0 -60
- catalystwan/models/configuration/feature_profile/sdwan/topology/mesh.py +0 -23
- catalystwan/models/configuration/feature_profile/sdwan/trackers/__init__.py +0 -36
- catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker.py +0 -96
- catalystwan/models/configuration/feature_profile/sdwan/trackers/tracker_group.py +0 -63
- catalystwan/models/configuration/feature_profile/sdwan/transport/__init__.py +0 -93
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_profile.py +0 -71
- catalystwan/models/configuration/feature_profile/sdwan/transport/gps.py +0 -37
- catalystwan/models/configuration/feature_profile/sdwan/transport/management/ethernet.py +0 -121
- catalystwan/models/configuration/feature_profile/sdwan/transport/t1e1controller.py +0 -124
- catalystwan/models/configuration/feature_profile/sdwan/transport/vpn.py +0 -285
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/cellular.py +0 -173
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +0 -389
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/gre.py +0 -46
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ipsec.py +0 -137
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/multilink.py +0 -219
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/protocol_over.py +0 -405
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/t1e1serial.py +0 -195
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/__init__.py +0 -62
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/analog_interface.py +0 -436
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/call_routing.py +0 -179
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/digital_interface.py +0 -380
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/dsp_farm.py +0 -193
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/media_profile.py +0 -17
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/server_group.py +0 -51
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/srst.py +0 -86
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/supervisory_disconnect.py +0 -69
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_profile.py +0 -42
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/translation_rule.py +0 -31
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/trunk_group.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_global.py +0 -57
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +0 -40
- catalystwan/models/configuration/network_hierarchy/__init__.py +0 -24
- catalystwan/models/configuration/network_hierarchy/cflowd.py +0 -128
- catalystwan/models/configuration/network_hierarchy/node.py +0 -88
- catalystwan/models/configuration/network_hierarchy/security_logging.py +0 -91
- catalystwan/models/configuration/packages.py +0 -57
- catalystwan/models/configuration/policy_group.py +0 -74
- catalystwan/models/configuration/topology_group.py +0 -52
- catalystwan/models/policy/definition/aip.py +0 -60
- catalystwan/models/policy/definition/amp.py +0 -65
- catalystwan/models/policy/definition/app_route.py +0 -246
- catalystwan/models/policy/definition/cflowd.py +0 -95
- catalystwan/models/policy/definition/dial_peer.py +0 -60
- catalystwan/models/policy/definition/dns_security.py +0 -130
- catalystwan/models/policy/definition/fxo_port.py +0 -63
- catalystwan/models/policy/definition/fxs_did_port.py +0 -58
- catalystwan/models/policy/definition/fxs_port.py +0 -56
- catalystwan/models/policy/definition/intrusion_prevention.py +0 -55
- catalystwan/models/policy/definition/pri_isdn_port.py +0 -48
- catalystwan/models/policy/definition/route_policy.py +0 -187
- catalystwan/models/policy/definition/srst_phone_profile.py +0 -37
- catalystwan/models/policy/definition/ssl_decryption.py +0 -209
- catalystwan/models/policy/definition/ssl_decryption_utd_profile.py +0 -88
- catalystwan/models/policy/definition/url_filtering.py +0 -70
- catalystwan/models/policy/definition/vpn_qos_map.py +0 -46
- catalystwan/models/policy/list/app.py +0 -44
- catalystwan/models/policy/list/app_probe.py +0 -42
- catalystwan/models/policy/list/as_path.py +0 -30
- catalystwan/models/policy/list/class_map.py +0 -30
- catalystwan/models/policy/list/color.py +0 -28
- catalystwan/models/policy/list/communities.py +0 -83
- catalystwan/models/policy/list/data_ipv6_prefix.py +0 -30
- catalystwan/models/policy/list/data_prefix.py +0 -30
- catalystwan/models/policy/list/fax_protocol.py +0 -45
- catalystwan/models/policy/list/fqdn.py +0 -24
- catalystwan/models/policy/list/geo_location.py +0 -33
- catalystwan/models/policy/list/identity.py +0 -29
- catalystwan/models/policy/list/ips_signature.py +0 -27
- catalystwan/models/policy/list/ipv6_prefix.py +0 -33
- catalystwan/models/policy/list/local_app.py +0 -45
- catalystwan/models/policy/list/local_domain.py +0 -36
- catalystwan/models/policy/list/media_profile.py +0 -44
- catalystwan/models/policy/list/mirror.py +0 -27
- catalystwan/models/policy/list/modem_pass_through.py +0 -27
- catalystwan/models/policy/list/policer.py +0 -39
- catalystwan/models/policy/list/port.py +0 -33
- catalystwan/models/policy/list/preferred_color_group.py +0 -82
- catalystwan/models/policy/list/prefix.py +0 -33
- catalystwan/models/policy/list/protocol_name.py +0 -26
- catalystwan/models/policy/list/region.py +0 -45
- catalystwan/models/policy/list/scalable_group_tag.py +0 -30
- catalystwan/models/policy/list/site.py +0 -34
- catalystwan/models/policy/list/sla.py +0 -77
- catalystwan/models/policy/list/supervisory_disconnect.py +0 -62
- catalystwan/models/policy/list/threat_grid_api_key.py +0 -32
- catalystwan/models/policy/list/tloc.py +0 -32
- catalystwan/models/policy/list/translation_profile.py +0 -32
- catalystwan/models/policy/list/translation_rules.py +0 -29
- catalystwan/models/policy/list/trunkgroup.py +0 -56
- catalystwan/models/policy/list/umbrella_data.py +0 -30
- catalystwan/models/policy/list/url.py +0 -39
- catalystwan/models/policy/list/vpn.py +0 -40
- catalystwan/models/policy/list/zone.py +0 -46
- catalystwan/models/policy/voice.py +0 -77
- catalystwan/models/settings.py +0 -41
- catalystwan/models/templates.py +0 -79
- catalystwan/tests/builders/test_report.py +0 -60
- catalystwan/tests/builders/uc_voice.py +0 -85
- catalystwan/tests/models/__init__.py +0 -0
- catalystwan/tests/models/configuration/feature_profile/sdwan/policy_object/security/test_url.py +0 -73
- catalystwan/tests/models/test_digital_interface.py +0 -56
- catalystwan/tests/templates/definitions/aaa_basic.json +0 -96
- catalystwan/tests/templates/definitions/aaa_complex.json +0 -464
- catalystwan/tests/templates/definitions/cisco_aaa_complex.json +0 -361
- catalystwan/tests/templates/definitions/cisco_logging_complex.json +0 -268
- catalystwan/tests/templates/definitions/cisco_ntp_complex.json +0 -143
- catalystwan/tests/templates/definitions/cisco_omp_complex.json +0 -175
- catalystwan/tests/templates/definitions/cisco_ospf_complex.json +0 -302
- catalystwan/tests/templates/definitions/cisco_sig.json +0 -405
- catalystwan/tests/templates/definitions/cisco_snmp_complex.json +0 -258
- catalystwan/tests/templates/definitions/cisco_system_complex.json +0 -502
- catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +0 -821
- catalystwan/tests/templates/definitions/omp_vsmart_1.json +0 -26
- catalystwan/tests/templates/definitions/omp_vsmart_complex.json +0 -73
- catalystwan/tests/templates/definitions/security_vsmart_complex.json +0 -24
- catalystwan/tests/templates/definitions/system_vsmart_complex.json +0 -193
- catalystwan/tests/templates/definitions/vpn_vsmart_basic.json +0 -17
- catalystwan/tests/templates/definitions/vpn_vsmart_complex.json +0 -179
- catalystwan/tests/templates/definitions/vpn_vsmart_interface_basic.json +0 -42
- catalystwan/tests/templates/definitions/vpn_vsmart_interface_complex.json +0 -208
- catalystwan/tests/templates/models/aaa.py +0 -106
- catalystwan/tests/templates/models/cisco_logging.py +0 -65
- catalystwan/tests/templates/models/cisco_ntp.py +0 -17
- catalystwan/tests/templates/models/cisco_omp.py +0 -37
- catalystwan/tests/templates/models/cisco_ospf.py +0 -60
- catalystwan/tests/templates/models/cisco_secure_internet_gateway.py +0 -95
- catalystwan/tests/templates/models/cisco_snmp.py +0 -40
- catalystwan/tests/templates/models/cisco_vpn_interface.py +0 -200
- catalystwan/tests/templates/models/security_vsmart.py +0 -11
- catalystwan/tests/templates/models/system_vsmart.py +0 -37
- catalystwan/tests/templates/models/vpn_vsmart.py +0 -32
- catalystwan/tests/templates/models/vpn_vsmart_interface.py +0 -54
- catalystwan/tests/templates/schemas/aaa.json +0 -1096
- catalystwan/tests/templates/schemas/cisco_logging.json +0 -577
- catalystwan/tests/templates/schemas/cisco_ntp.json +0 -265
- catalystwan/tests/templates/schemas/cisco_omp.json +0 -479
- catalystwan/tests/templates/schemas/cisco_ospf.json +0 -908
- catalystwan/tests/templates/schemas/cisco_secure_internet_gateway.json +0 -1520
- catalystwan/tests/templates/schemas/cisco_snmp.json +0 -561
- catalystwan/tests/templates/schemas/cisco_vpn_interface.json +0 -3348
- catalystwan/tests/templates/schemas/security-vsmart.json +0 -58
- catalystwan/tests/templates/schemas/system-vsmart.json +0 -2585
- catalystwan/tests/templates/schemas/vpn-vsmart-interface.json +0 -859
- catalystwan/tests/templates/schemas/vpn-vsmart.json +0 -445
- catalystwan/tests/templates/test_find_template_values_2.py +0 -193
- catalystwan/tests/test_feature_profile_api.py +0 -282
- catalystwan/tests/test_models_common.py +0 -53
- catalystwan/utils/model.py +0 -48
- catalystwan/utils/persona.py +0 -5
- catalystwan/utils/type_check.py +0 -22
- catalystwan/workflows/backup_restore_device_templates.py +0 -467
- catalystwan-0.41.2.dev9.dist-info/RECORD +0 -641
- /catalystwan/tests/templates/definitions/{cisco_banner.json → banner_1.json} +0 -0
- {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/LICENSE +0 -0
- {catalystwan-0.41.2.dev9.dist-info → catalystwan-0.41.3.dist-info}/WHEEL +0 -0
catalystwan/api/template_api.py
CHANGED
|
@@ -5,16 +5,13 @@ 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,
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Optional, Type, overload
|
|
9
9
|
|
|
10
10
|
from ciscoconfparse import CiscoConfParse # type: ignore
|
|
11
|
-
from typing_extensions import deprecated
|
|
12
11
|
|
|
13
12
|
from catalystwan.api.task_status_api import Task
|
|
14
13
|
from catalystwan.api.templates.cli_template import CLITemplate
|
|
15
14
|
from catalystwan.api.templates.device_template.device_template import (
|
|
16
|
-
CreateDeviceInputPayload,
|
|
17
|
-
DeviceInputValues,
|
|
18
15
|
DeviceSpecificValue,
|
|
19
16
|
DeviceTemplate,
|
|
20
17
|
GeneralTemplate,
|
|
@@ -22,7 +19,6 @@ from catalystwan.api.templates.device_template.device_template import (
|
|
|
22
19
|
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
23
20
|
from catalystwan.api.templates.feature_template_field import FeatureTemplateField
|
|
24
21
|
from catalystwan.api.templates.feature_template_payload import FeatureTemplatePayload
|
|
25
|
-
from catalystwan.api.templates.models.aaa_model import AAAModel
|
|
26
22
|
from catalystwan.api.templates.models.cisco_aaa_model import CiscoAAAModel
|
|
27
23
|
from catalystwan.api.templates.models.cisco_banner_model import CiscoBannerModel
|
|
28
24
|
from catalystwan.api.templates.models.cisco_bfd_model import CiscoBFDModel
|
|
@@ -41,15 +37,12 @@ from catalystwan.api.templates.models.cli_template import CliTemplateModel
|
|
|
41
37
|
from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
|
|
42
38
|
from catalystwan.api.templates.models.security_vsmart_model import SecurityvSmart
|
|
43
39
|
from catalystwan.api.templates.models.system_vsmart_model import SystemVsmart
|
|
44
|
-
from catalystwan.
|
|
45
|
-
from catalystwan.api.templates.models.vpn_vsmart_model import VpnVsmartModel
|
|
46
|
-
from catalystwan.dataclasses import Device, FeatureTemplatesTypes
|
|
40
|
+
from catalystwan.dataclasses import Device, DeviceTemplateInfo, FeatureTemplateInfo, FeatureTemplatesTypes, TemplateInfo
|
|
47
41
|
from catalystwan.endpoints.configuration_device_template import FeatureToCLIPayload
|
|
48
|
-
from catalystwan.exceptions import AttachedError,
|
|
49
|
-
from catalystwan.models.common import DeviceModel
|
|
50
|
-
from catalystwan.models.templates import DeviceTemplateInformation, FeatureTemplateInformation, TemplateInformation
|
|
42
|
+
from catalystwan.exceptions import AttachedError, TemplateNotFoundError
|
|
51
43
|
from catalystwan.response import ManagerResponse
|
|
52
44
|
from catalystwan.typed_list import DataSequence
|
|
45
|
+
from catalystwan.utils.device_model import DeviceModel
|
|
53
46
|
from catalystwan.utils.dict import merge
|
|
54
47
|
from catalystwan.utils.pydantic_field import get_extra_field
|
|
55
48
|
from catalystwan.utils.template_type import TemplateType
|
|
@@ -81,15 +74,15 @@ class TemplatesAPI:
|
|
|
81
74
|
self.session = session
|
|
82
75
|
|
|
83
76
|
@overload
|
|
84
|
-
def get(self, template: Type[DeviceTemplate]) -> DataSequence[
|
|
77
|
+
def get(self, template: Type[DeviceTemplate]) -> DataSequence[DeviceTemplateInfo]: # type: ignore
|
|
85
78
|
...
|
|
86
79
|
|
|
87
80
|
@overload
|
|
88
|
-
def get(self, template: Type[FeatureTemplate]) -> DataSequence[
|
|
81
|
+
def get(self, template: Type[FeatureTemplate]) -> DataSequence[FeatureTemplateInfo]: # type: ignore
|
|
89
82
|
...
|
|
90
83
|
|
|
91
84
|
@overload
|
|
92
|
-
def get(self, template: Type[CLITemplate]) -> DataSequence[
|
|
85
|
+
def get(self, template: Type[CLITemplate]) -> DataSequence[TemplateInfo]: # type: ignore
|
|
93
86
|
...
|
|
94
87
|
|
|
95
88
|
def get(self, template):
|
|
@@ -107,29 +100,33 @@ class TemplatesAPI:
|
|
|
107
100
|
def _get_feature_templates(
|
|
108
101
|
self,
|
|
109
102
|
summary: bool = True,
|
|
110
|
-
|
|
103
|
+
offset: Optional[int] = None,
|
|
104
|
+
limit: Optional[int] = None,
|
|
105
|
+
) -> DataSequence[FeatureTemplateInfo]:
|
|
111
106
|
"""In a multitenant vManage system, this API is only available in the Provider view."""
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
endpoint = "/dataservice/template/feature"
|
|
108
|
+
params = {"summary": summary}
|
|
109
|
+
|
|
110
|
+
fr_templates = self.session.get(url=endpoint, params=params)
|
|
111
|
+
|
|
112
|
+
return fr_templates.dataseq(FeatureTemplateInfo)
|
|
115
113
|
|
|
116
114
|
def _get_device_templates(
|
|
117
115
|
self, feature: DeviceTemplateFeature = DeviceTemplateFeature.ALL
|
|
118
|
-
) -> DataSequence[
|
|
116
|
+
) -> DataSequence[DeviceTemplateInfo]:
|
|
119
117
|
"""In a multitenant vManage system, this API is only available in the Provider view."""
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
)
|
|
118
|
+
endpoint = "/dataservice/template/device"
|
|
119
|
+
params = {"feature": feature.value}
|
|
123
120
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if not template_info:
|
|
127
|
-
raise TemplateNotFoundError(f"Template with name [{name}] does not exists.")
|
|
121
|
+
templates = self.session.get(url=endpoint, params=params)
|
|
122
|
+
return templates.dataseq(DeviceTemplateInfo)
|
|
128
123
|
|
|
129
|
-
|
|
124
|
+
def attach(self, name: str, device: Device, timeout_seconds: int = 300, **kwargs):
|
|
125
|
+
template_type = self.get(DeviceTemplate).filter(name=name).single_or_default().config_type
|
|
126
|
+
if template_type == TemplateType.CLI:
|
|
130
127
|
return self._attach_cli(name, device, timeout_seconds=timeout_seconds, **kwargs)
|
|
131
128
|
|
|
132
|
-
if
|
|
129
|
+
if template_type == TemplateType.FEATURE:
|
|
133
130
|
return self._attach_feature(name, device, timeout_seconds=timeout_seconds, **kwargs)
|
|
134
131
|
|
|
135
132
|
raise NotImplementedError()
|
|
@@ -178,19 +175,17 @@ class TemplatesAPI:
|
|
|
178
175
|
}
|
|
179
176
|
|
|
180
177
|
invalid = False
|
|
181
|
-
msg = {}
|
|
182
178
|
for var in vars:
|
|
183
179
|
if var.property not in payload["deviceTemplateList"][0]["device"][0]:
|
|
184
180
|
pointer = payload["deviceTemplateList"][0]["device"][0]
|
|
185
181
|
if var.property not in kwargs["device_specific_vars"]:
|
|
186
182
|
invalid = True
|
|
187
|
-
msg[var.property] = "should be provided in attach method as device_specific_vars kwarg."
|
|
188
183
|
logger.error(f"{var.property} should be provided in attach method as device_specific_vars kwarg.")
|
|
189
184
|
else:
|
|
190
185
|
pointer[var.property] = kwargs["device_specific_vars"][var.property] # type: ignore
|
|
191
186
|
|
|
192
187
|
if invalid:
|
|
193
|
-
raise TypeError(
|
|
188
|
+
raise TypeError()
|
|
194
189
|
|
|
195
190
|
endpoint = "/dataservice/template/device/config/attachfeature"
|
|
196
191
|
logger.info(f"Attaching a template: {name} to the device: {device.hostname}.")
|
|
@@ -283,7 +278,7 @@ class TemplatesAPI:
|
|
|
283
278
|
def delete(self, template: Type[CLITemplate], name: str) -> bool: # type: ignore
|
|
284
279
|
...
|
|
285
280
|
|
|
286
|
-
def delete(self, template, name)
|
|
281
|
+
def delete(self, template, name):
|
|
287
282
|
status = False
|
|
288
283
|
|
|
289
284
|
if template is FeatureTemplate:
|
|
@@ -380,15 +375,12 @@ class TemplatesAPI:
|
|
|
380
375
|
if isinstance(template, DeviceTemplate):
|
|
381
376
|
return self._edit_device_template(template)
|
|
382
377
|
|
|
383
|
-
if isinstance(template, CLITemplate):
|
|
384
|
-
return self._edit_cli_template(template, template_info)
|
|
385
|
-
|
|
386
378
|
raise NotImplementedError()
|
|
387
379
|
|
|
388
380
|
def _edit_device_template(self, template: DeviceTemplate):
|
|
389
381
|
self._create_device_template(template, True)
|
|
390
382
|
|
|
391
|
-
def _edit_feature_template(self, template: FeatureTemplate, data:
|
|
383
|
+
def _edit_feature_template(self, template: FeatureTemplate, data: FeatureTemplateInfo) -> ManagerResponse:
|
|
392
384
|
if self.is_created_by_generator(template):
|
|
393
385
|
debug = False
|
|
394
386
|
schema = self.get_feature_template_schema(template, debug)
|
|
@@ -401,11 +393,6 @@ class TemplatesAPI:
|
|
|
401
393
|
response = self.session.put(f"/dataservice/template/feature/{data.id}", json=payload)
|
|
402
394
|
return response
|
|
403
395
|
|
|
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
|
-
|
|
409
396
|
@overload
|
|
410
397
|
def create(self, template: FeatureTemplate, debug=False) -> str:
|
|
411
398
|
...
|
|
@@ -450,9 +437,6 @@ class TemplatesAPI:
|
|
|
450
437
|
logger.info(f"Template {template.template_name} ({template_type}) was created successfully ({template_id}).")
|
|
451
438
|
return template_id
|
|
452
439
|
|
|
453
|
-
@deprecated(
|
|
454
|
-
"Obsolete way to use Feature Templates - only create_by_generator", category=CatalystwanDeprecationWarning
|
|
455
|
-
)
|
|
456
440
|
def _create_feature_template(self, template: FeatureTemplate) -> str:
|
|
457
441
|
payload = template.generate_payload(self.session)
|
|
458
442
|
response = self.session.post("/dataservice/template/feature", json=json.loads(payload))
|
|
@@ -469,8 +453,8 @@ class TemplatesAPI:
|
|
|
469
453
|
|
|
470
454
|
def _create_device_template(self, device_template: DeviceTemplate, edit: bool = False) -> str:
|
|
471
455
|
def get_general_template_info(
|
|
472
|
-
name: str, fr_templates: DataSequence[
|
|
473
|
-
) ->
|
|
456
|
+
name: str, fr_templates: DataSequence[FeatureTemplateInfo]
|
|
457
|
+
) -> FeatureTemplateInfo:
|
|
474
458
|
_template = fr_templates.filter(name=name).single_or_default()
|
|
475
459
|
|
|
476
460
|
if not _template:
|
|
@@ -480,19 +464,19 @@ class TemplatesAPI:
|
|
|
480
464
|
|
|
481
465
|
def parse_general_template(
|
|
482
466
|
general_template: GeneralTemplate,
|
|
483
|
-
fr_templates: DataSequence[
|
|
467
|
+
fr_templates: DataSequence[FeatureTemplateInfo],
|
|
484
468
|
) -> GeneralTemplate:
|
|
485
|
-
if general_template.
|
|
486
|
-
general_template.
|
|
487
|
-
parse_general_template(_t, fr_templates) for _t in general_template.
|
|
469
|
+
if general_template.subTemplates:
|
|
470
|
+
general_template.subTemplates = [
|
|
471
|
+
parse_general_template(_t, fr_templates) for _t in general_template.subTemplates
|
|
488
472
|
]
|
|
489
473
|
if general_template.name:
|
|
490
474
|
info = get_general_template_info(general_template.name, fr_templates)
|
|
491
475
|
return GeneralTemplate(
|
|
492
476
|
name=general_template.name,
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
477
|
+
subTemplates=general_template.subTemplates,
|
|
478
|
+
templateId=info.id,
|
|
479
|
+
templateType=info.template_type,
|
|
496
480
|
)
|
|
497
481
|
else:
|
|
498
482
|
return general_template
|
|
@@ -510,18 +494,13 @@ class TemplatesAPI:
|
|
|
510
494
|
.id
|
|
511
495
|
)
|
|
512
496
|
payload = json.loads(device_template.generate_payload())
|
|
513
|
-
response = self.session.
|
|
514
|
-
template_id=template_id, payload=payload
|
|
515
|
-
)
|
|
516
|
-
return response
|
|
497
|
+
response = self.session.put(f"/dataservice/template/device/{template_id}", json=payload)
|
|
517
498
|
else:
|
|
499
|
+
endpoint = "/dataservice/template/device/feature/"
|
|
518
500
|
payload = json.loads(device_template.generate_payload())
|
|
519
|
-
response = (
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
)
|
|
523
|
-
)
|
|
524
|
-
return response.template_id
|
|
501
|
+
response = self.session.post(endpoint, json=payload)
|
|
502
|
+
|
|
503
|
+
return response.text
|
|
525
504
|
|
|
526
505
|
def is_created_by_generator(self, template: FeatureTemplate) -> bool:
|
|
527
506
|
"""Checks if template is created by generator
|
|
@@ -529,7 +508,6 @@ class TemplatesAPI:
|
|
|
529
508
|
Method will be deleted if every template's payload will be generated dynamically.
|
|
530
509
|
"""
|
|
531
510
|
ported_templates = (
|
|
532
|
-
AAAModel,
|
|
533
511
|
CiscoAAAModel,
|
|
534
512
|
CiscoBFDModel,
|
|
535
513
|
CiscoBannerModel,
|
|
@@ -548,8 +526,6 @@ class TemplatesAPI:
|
|
|
548
526
|
CliTemplateModel,
|
|
549
527
|
CiscoSecureInternetGatewayModel,
|
|
550
528
|
CiscoOspfv3Model,
|
|
551
|
-
VpnVsmartModel,
|
|
552
|
-
VpnVsmartInterfaceModel,
|
|
553
529
|
)
|
|
554
530
|
|
|
555
531
|
return isinstance(template, ported_templates)
|
|
@@ -580,7 +556,7 @@ class TemplatesAPI:
|
|
|
580
556
|
name=template.template_name,
|
|
581
557
|
description=template.template_description,
|
|
582
558
|
template_type=template.type,
|
|
583
|
-
device_types=[device_model for device_model in template.device_models],
|
|
559
|
+
device_types=[device_model.value for device_model in template.device_models],
|
|
584
560
|
definition={},
|
|
585
561
|
) # type: ignore
|
|
586
562
|
|
|
@@ -590,7 +566,6 @@ class TemplatesAPI:
|
|
|
590
566
|
for field in fr_template_fields:
|
|
591
567
|
value = None
|
|
592
568
|
priority_order = None
|
|
593
|
-
json_dumped_value = None
|
|
594
569
|
# TODO How to discover Device specific variable
|
|
595
570
|
if field.key in template.device_specific_variables:
|
|
596
571
|
value = template.device_specific_variables[field.key]
|
|
@@ -628,7 +603,7 @@ class TemplatesAPI:
|
|
|
628
603
|
available_devices_for_template = [device["name"] for device in template_type.device_models]
|
|
629
604
|
|
|
630
605
|
provided_device_models = [
|
|
631
|
-
dev_mod if type(dev_mod) is DeviceModel else dev_mod for dev_mod in template.device_models
|
|
606
|
+
dev_mod.value if type(dev_mod) is DeviceModel else dev_mod for dev_mod in template.device_models
|
|
632
607
|
]
|
|
633
608
|
|
|
634
609
|
if not all(dev in available_devices_for_template for dev in provided_device_models):
|
|
@@ -723,47 +698,3 @@ class TemplatesAPI:
|
|
|
723
698
|
config = CiscoConfParse(response["config"].splitlines())
|
|
724
699
|
logger.debug(f"Template loaded from {device.hostname}.")
|
|
725
700
|
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,12 +3,10 @@
|
|
|
3
3
|
## Feature Template Creation
|
|
4
4
|
|
|
5
5
|
```python
|
|
6
|
-
from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
|
|
7
|
-
|
|
8
6
|
omp_vsmart = OMPvSmart(
|
|
9
7
|
name="my_first_template",
|
|
10
8
|
description="NA",
|
|
11
|
-
device_models=[
|
|
9
|
+
device_models=[DeviceModel.VSMART]
|
|
12
10
|
|
|
13
11
|
)
|
|
14
12
|
|
|
@@ -16,86 +14,74 @@ session.api.templates.create(omp_vsmart)
|
|
|
16
14
|
```
|
|
17
15
|
|
|
18
16
|
## 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.
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
1. Get your template type name and version.
|
|
19
|
+
1. Get your template type name and version.
|
|
23
20
|
>Note: display name is not template type name!
|
|
24
|
-
|
|
25
21
|
- 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.
|
|
26
22
|
|
|
27
23
|
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.
|
|
28
24
|
|
|
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)
|
|
25
|
+
```python
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import ClassVar
|
|
28
|
+
from pydantic import ConfigDict
|
|
29
|
+
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
38
30
|
|
|
39
|
-
payload_path: ClassVar[Path] = Path(__file__).parent / "DEPRECATED"
|
|
40
|
-
type: ClassVar[str] = "omp-vsmart"
|
|
41
|
-
```
|
|
42
31
|
|
|
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
|
+
```
|
|
43
38
|
3. (This step is temporary) Find `is_created_by_generator` method in `template_api` and add your new template class.
|
|
44
39
|
|
|
45
|
-
```python
|
|
46
|
-
ported_templates = (..., OMPvSmart)
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
NOTE: This step will be removed once all template payloads will be generated automatically.
|
|
50
|
-
|
|
40
|
+
```python
|
|
41
|
+
ported_templates = (..., OMPvSmart)
|
|
42
|
+
```
|
|
43
|
+
NOTE: This step will be removed once all template payloads will be generated automatically.
|
|
51
44
|
4. (This step is temporary) Find `available_models` definition in 'supported' and add your new template class.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
NOTE: This step will be removed once all template payloads will be generated dynamically.
|
|
61
|
-
|
|
45
|
+
```python
|
|
46
|
+
available_models = {
|
|
47
|
+
(...)
|
|
48
|
+
'omp_vsmart': OMPvSmart
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
NOTE: This step will be removed once all template payloads will be generated dynamically.
|
|
62
52
|
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
|
+
)
|
|
63
59
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
description="NA",
|
|
68
|
-
device_models=["vsmart"]
|
|
69
|
-
)
|
|
60
|
+
session.api.templates.create(omp_vsmart)
|
|
61
|
+
```
|
|
62
|
+
If everything went successfuly, we will get similar message
|
|
70
63
|
|
|
71
|
-
|
|
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).`
|
|
64
|
+
`Template my_first_template (FeatureTemplate) was created successfully (7e56acdd-640e-45dc-9335-87abc697995f).`
|
|
77
65
|
|
|
78
66
|
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.
|
|
79
|
-
|
|
80
|
-
### Customize Feature Template fields
|
|
81
|
-
|
|
67
|
+
|
|
68
|
+
### Customize Feature Template fields.
|
|
82
69
|
7. Run below code with already created session and changed corresponding variables.
|
|
83
70
|
|
|
84
|
-
```python
|
|
85
|
-
# TODO: Use 2nd layer.
|
|
86
|
-
import json
|
|
71
|
+
```python
|
|
72
|
+
# TODO: Use 2nd layer.
|
|
73
|
+
import json
|
|
87
74
|
|
|
88
75
|
|
|
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}"
|
|
76
|
+
template_type = "omp-vsmart" # Change this value
|
|
77
|
+
template_version = "15.0.0" # Change this value
|
|
78
|
+
endpoint = f"/dataservice/template/feature/types/definition/{template_type}/{template_version}"
|
|
92
79
|
|
|
93
|
-
schema = session.get(url=endpoint).json()
|
|
80
|
+
schema = session.get(url=endpoint).json()
|
|
94
81
|
|
|
95
|
-
with open(f"response_{template_type}.json", "w") as f:
|
|
96
|
-
|
|
97
|
-
```
|
|
82
|
+
with open(f"response_{template_type}.json", "w") as f:
|
|
83
|
+
f.write(json.dumps(schema, indent=4))
|
|
84
|
+
```
|
|
98
85
|
|
|
99
86
|
8. Open `response_{template_type}.json` file.
|
|
100
|
-
|
|
101
87
|
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.utils.device_model import DeviceModel
|
|
17
17
|
from catalystwan.utils.template_type import TemplateType
|
|
18
18
|
|
|
19
19
|
logger = logging.getLogger(__name__)
|
|
@@ -62,31 +62,21 @@ 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
|
-
|
|
75
65
|
def generate_payload(self) -> dict:
|
|
76
66
|
config_str = "\n".join(self.config.ioscfg)
|
|
77
67
|
payload = {
|
|
78
68
|
"templateName": self.template_name,
|
|
79
69
|
"templateDescription": self.template_description,
|
|
80
|
-
"deviceType": self.device_model,
|
|
70
|
+
"deviceType": self.device_model.value,
|
|
81
71
|
"templateConfiguration": config_str,
|
|
82
72
|
"factoryDefault": False,
|
|
83
73
|
"configType": "file",
|
|
84
74
|
}
|
|
85
75
|
if self.device_model not in [
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
76
|
+
DeviceModel.VEDGE,
|
|
77
|
+
DeviceModel.VSMART,
|
|
78
|
+
DeviceModel.VMANAGE,
|
|
79
|
+
DeviceModel.VBOND,
|
|
90
80
|
]:
|
|
91
81
|
payload["cliType"] = "device"
|
|
92
82
|
payload["draftMode"] = False
|
|
@@ -110,7 +100,7 @@ class CLITemplate:
|
|
|
110
100
|
"templateId": id,
|
|
111
101
|
"templateName": self.template_name,
|
|
112
102
|
"templateDescription": self.template_description,
|
|
113
|
-
"deviceType": self.device_model,
|
|
103
|
+
"deviceType": self.device_model.value,
|
|
114
104
|
"templateConfiguration": config_str,
|
|
115
105
|
"factoryDefault": False,
|
|
116
106
|
"configType": "file",
|