catalystwan 0.40.2.dev1__py3-none-any.whl → 2.0.0a1__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/core/__init__.py +2 -0
- catalystwan/core/abstractions.py +26 -0
- catalystwan/{apigw_auth.py → core/apigw_auth.py} +27 -14
- catalystwan/core/client.py +71 -0
- catalystwan/core/encoder.py +12 -0
- catalystwan/{exceptions.py → core/exceptions.py} +29 -9
- catalystwan/core/loader.py +37 -0
- catalystwan/{__init__.py → core/metadata.py} +9 -22
- catalystwan/core/models/deserialize.py +204 -0
- catalystwan/core/models/serialize.py +137 -0
- catalystwan/core/request_adapter.py +246 -0
- catalystwan/{request_limiter.py → core/request_limiter.py} +1 -2
- catalystwan/{response.py → core/response.py} +41 -88
- catalystwan/{session.py → core/session.py} +84 -101
- catalystwan/core/types.py +33 -0
- catalystwan/{version.py → core/version.py} +3 -5
- catalystwan/{vmanage_auth.py → core/vmanage_auth.py} +46 -21
- catalystwan-2.0.0a1.dist-info/METADATA +239 -0
- catalystwan-2.0.0a1.dist-info/RECORD +24 -0
- {catalystwan-0.40.2.dev1.dist-info → catalystwan-2.0.0a1.dist-info}/WHEEL +2 -1
- catalystwan-2.0.0a1.dist-info/top_level.txt +1 -0
- catalystwan/abstractions.py +0 -77
- catalystwan/api/admin_tech_api.py +0 -176
- catalystwan/api/administration.py +0 -434
- catalystwan/api/alarms_api.py +0 -186
- catalystwan/api/api_container.py +0 -73
- catalystwan/api/basic_api.py +0 -338
- catalystwan/api/builders/__init__.py +0 -14
- 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/other.py +0 -79
- catalystwan/api/builders/feature_profiles/report.py +0 -137
- catalystwan/api/builders/feature_profiles/service.py +0 -213
- catalystwan/api/builders/feature_profiles/system.py +0 -80
- catalystwan/api/builders/feature_profiles/transport.py +0 -214
- catalystwan/api/builders/feature_profiles/uc_voice.py +0 -287
- catalystwan/api/config_device_inventory_api.py +0 -58
- catalystwan/api/config_group_api.py +0 -150
- catalystwan/api/configuration_groups/parcel.py +0 -206
- catalystwan/api/dashboard_api.py +0 -215
- catalystwan/api/device_action_api.py +0 -216
- catalystwan/api/feature_profile_api.py +0 -2401
- catalystwan/api/logs_api.py +0 -63
- catalystwan/api/monitoring_status_api.py +0 -76
- catalystwan/api/mtt_aaa_api.py +0 -197
- catalystwan/api/omp_api.py +0 -124
- catalystwan/api/packet_capture_api.py +0 -152
- catalystwan/api/parcel_api.py +0 -42
- catalystwan/api/partition_manager_api.py +0 -143
- catalystwan/api/policy_api.py +0 -1163
- catalystwan/api/resource_pool_api.py +0 -74
- catalystwan/api/software_action_api.py +0 -269
- catalystwan/api/speedtest_api.py +0 -153
- catalystwan/api/task_status_api.py +0 -171
- catalystwan/api/template_api.py +0 -761
- catalystwan/api/templates/README.md +0 -101
- catalystwan/api/templates/bool_str.py +0 -6
- catalystwan/api/templates/cli_template.py +0 -236
- catalystwan/api/templates/device_template/device_template.py +0 -189
- catalystwan/api/templates/device_variable.py +0 -7
- catalystwan/api/templates/feature_template.py +0 -133
- catalystwan/api/templates/feature_template_field.py +0 -175
- catalystwan/api/templates/feature_template_payload.py +0 -17
- catalystwan/api/templates/models/aaa_model.py +0 -387
- catalystwan/api/templates/models/cisco_aaa_model.py +0 -331
- catalystwan/api/templates/models/cisco_banner_model.py +0 -27
- catalystwan/api/templates/models/cisco_bfd_model.py +0 -61
- catalystwan/api/templates/models/cisco_bgp_model.py +0 -510
- catalystwan/api/templates/models/cisco_logging_model.py +0 -122
- catalystwan/api/templates/models/cisco_ntp_model.py +0 -60
- catalystwan/api/templates/models/cisco_omp_model.py +0 -121
- catalystwan/api/templates/models/cisco_ospf.py +0 -241
- catalystwan/api/templates/models/cisco_ospfv3.py +0 -498
- catalystwan/api/templates/models/cisco_secure_internet_gateway.py +0 -385
- catalystwan/api/templates/models/cisco_snmp_model.py +0 -102
- catalystwan/api/templates/models/cisco_system.py +0 -318
- catalystwan/api/templates/models/cisco_vpn_interface_model.py +0 -822
- catalystwan/api/templates/models/cisco_vpn_model.py +0 -603
- catalystwan/api/templates/models/cli_template.py +0 -18
- catalystwan/api/templates/models/omp_vsmart_model.py +0 -73
- catalystwan/api/templates/models/security_vsmart_model.py +0 -28
- catalystwan/api/templates/models/supported.py +0 -42
- catalystwan/api/templates/models/system_vsmart_model.py +0 -182
- catalystwan/api/templates/models/vpn_vsmart_interface_model.py +0 -198
- catalystwan/api/templates/models/vpn_vsmart_model.py +0 -124
- catalystwan/api/templates/payloads/aaa/aaa_model.py +0 -91
- catalystwan/api/templates/payloads/aaa/feature/aaa.json.j2 +0 -373
- catalystwan/api/templates/payloads/aaa/feature/accounting.json.j2 +0 -40
- catalystwan/api/templates/payloads/aaa/feature/radius.json.j2 +0 -107
- catalystwan/api/templates/payloads/aaa/feature/tacacs.json.j2 +0 -95
- catalystwan/api/templates/payloads/aaa/feature/user.json.j2 +0 -60
- catalystwan/api/templates/payloads/cisco_vpn/cisco_vpn_model.py +0 -92
- catalystwan/api/templates/payloads/cisco_vpn/feature/cisco_vpn.json.j2 +0 -224
- catalystwan/api/templates/payloads/cisco_vpn/feature/dns.json.j2 +0 -86
- catalystwan/api/templates/payloads/cisco_vpn/feature/ipv4route.json.j2 +0 -59
- catalystwan/api/templates/payloads/cisco_vpn/feature/ipv6route.json.j2 +0 -58
- catalystwan/api/templates/payloads/cisco_vpn/feature/mapping.json.j2 +0 -24
- catalystwan/api/templates/payloads/tenant/tenant.json.j2 +0 -127
- catalystwan/api/templates/payloads/tenant/tenant_model.py +0 -43
- catalystwan/api/tenant_backup_restore_api.py +0 -154
- catalystwan/api/tenant_management_api.py +0 -127
- catalystwan/api/tenant_migration_api.py +0 -121
- catalystwan/api/versions_utils.py +0 -414
- catalystwan/api/virtual_image_action_api.py +0 -200
- catalystwan/dataclasses.py +0 -493
- catalystwan/endpoints/__init__.py +0 -606
- catalystwan/endpoints/administration_user_and_group.py +0 -341
- catalystwan/endpoints/api_gateway.py +0 -24
- catalystwan/endpoints/certificate_management_device.py +0 -141
- catalystwan/endpoints/certificate_management_vmanage.py +0 -48
- catalystwan/endpoints/client.py +0 -96
- catalystwan/endpoints/cluster_management.py +0 -130
- catalystwan/endpoints/configuration/device/software_update.py +0 -31
- catalystwan/endpoints/configuration/disaster_recovery.py +0 -305
- 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/policy_object.py +0 -105
- catalystwan/endpoints/configuration/feature_profile/sdwan/service.py +0 -137
- catalystwan/endpoints/configuration/feature_profile/sdwan/sig_security.py +0 -88
- catalystwan/endpoints/configuration/feature_profile/sdwan/system.py +0 -205
- catalystwan/endpoints/configuration/feature_profile/sdwan/topology.py +0 -93
- catalystwan/endpoints/configuration/feature_profile/sdwan/transport.py +0 -214
- catalystwan/endpoints/configuration/feature_profile/sdwan/uc_voice.py +0 -77
- catalystwan/endpoints/configuration/network_hierarchy.py +0 -32
- catalystwan/endpoints/configuration/policy/abstractions.py +0 -49
- catalystwan/endpoints/configuration/policy/definition/access_control_list.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/access_control_list_ipv6.py +0 -57
- 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/control.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/device_access.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/device_access_ipv6.py +0 -59
- 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/hub_and_spoke.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/intrusion_prevention.py +0 -52
- catalystwan/endpoints/configuration/policy/definition/mesh.py +0 -53
- catalystwan/endpoints/configuration/policy/definition/pri_isdn_port.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/qos_map.py +0 -53
- catalystwan/endpoints/configuration/policy/definition/rewrite.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/route_policy.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/rule_set.py +0 -53
- catalystwan/endpoints/configuration/policy/definition/security_group.py +0 -57
- 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/traffic_data.py +0 -58
- catalystwan/endpoints/configuration/policy/definition/url_filtering.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/vpn_membership.py +0 -57
- catalystwan/endpoints/configuration/policy/definition/vpn_qos_map.py +0 -50
- catalystwan/endpoints/configuration/policy/definition/zone_based_firewall.py +0 -57
- catalystwan/endpoints/configuration/policy/list/app.py +0 -48
- catalystwan/endpoints/configuration/policy/list/app_probe.py +0 -52
- catalystwan/endpoints/configuration/policy/list/as_path.py +0 -48
- catalystwan/endpoints/configuration/policy/list/class_map.py +0 -48
- catalystwan/endpoints/configuration/policy/list/color.py +0 -48
- catalystwan/endpoints/configuration/policy/list/community.py +0 -48
- catalystwan/endpoints/configuration/policy/list/data_ipv6_prefix.py +0 -52
- catalystwan/endpoints/configuration/policy/list/data_prefix.py +0 -48
- catalystwan/endpoints/configuration/policy/list/expanded_community.py +0 -52
- 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/fqdn.py +0 -48
- catalystwan/endpoints/configuration/policy/list/geo_location.py +0 -48
- catalystwan/endpoints/configuration/policy/list/identity.py +0 -48
- catalystwan/endpoints/configuration/policy/list/ips_signature.py +0 -52
- catalystwan/endpoints/configuration/policy/list/ipv6_prefix.py +0 -48
- catalystwan/endpoints/configuration/policy/list/local_app.py +0 -48
- catalystwan/endpoints/configuration/policy/list/local_domain.py +0 -48
- catalystwan/endpoints/configuration/policy/list/media_profile.py +0 -52
- catalystwan/endpoints/configuration/policy/list/mirror.py +0 -48
- catalystwan/endpoints/configuration/policy/list/modem_pass_through.py +0 -52
- catalystwan/endpoints/configuration/policy/list/policer.py +0 -48
- catalystwan/endpoints/configuration/policy/list/port.py +0 -48
- catalystwan/endpoints/configuration/policy/list/preferred_color_group.py +0 -52
- catalystwan/endpoints/configuration/policy/list/prefix.py +0 -49
- catalystwan/endpoints/configuration/policy/list/protocol_name.py +0 -52
- catalystwan/endpoints/configuration/policy/list/region.py +0 -47
- catalystwan/endpoints/configuration/policy/list/scalable_group_tag.py +0 -52
- catalystwan/endpoints/configuration/policy/list/site.py +0 -52
- catalystwan/endpoints/configuration/policy/list/sla.py +0 -48
- 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/tloc.py +0 -48
- 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/list/url_allow_list.py +0 -48
- catalystwan/endpoints/configuration/policy/list/url_block_list.py +0 -48
- catalystwan/endpoints/configuration/policy/list/vpn.py +0 -50
- catalystwan/endpoints/configuration/policy/list/zone.py +0 -48
- catalystwan/endpoints/configuration/policy/security_template.py +0 -55
- catalystwan/endpoints/configuration/policy/vedge_template.py +0 -52
- catalystwan/endpoints/configuration/policy/voice_template.py +0 -39
- catalystwan/endpoints/configuration/policy/vsmart_template.py +0 -79
- catalystwan/endpoints/configuration/policy_group.py +0 -30
- catalystwan/endpoints/configuration/software_actions.py +0 -201
- catalystwan/endpoints/configuration/topology_group.py +0 -51
- catalystwan/endpoints/configuration_dashboard_status.py +0 -127
- catalystwan/endpoints/configuration_device_actions.py +0 -385
- catalystwan/endpoints/configuration_device_inventory.py +0 -309
- catalystwan/endpoints/configuration_device_template.py +0 -39
- catalystwan/endpoints/configuration_feature_profile.py +0 -135
- catalystwan/endpoints/configuration_general_template.py +0 -31
- catalystwan/endpoints/configuration_group.py +0 -197
- catalystwan/endpoints/configuration_settings.py +0 -753
- catalystwan/endpoints/configuration_template_master.py +0 -48
- catalystwan/endpoints/endpoints_container.py +0 -279
- catalystwan/endpoints/misc.py +0 -21
- catalystwan/endpoints/monitoring/device_details.py +0 -246
- catalystwan/endpoints/monitoring/security_policy.py +0 -12
- catalystwan/endpoints/monitoring/server_info.py +0 -12
- catalystwan/endpoints/monitoring/status.py +0 -76
- catalystwan/endpoints/real_time_monitoring/reboot_history.py +0 -35
- catalystwan/endpoints/sdavc_cloud_connector.py +0 -43
- catalystwan/endpoints/tenant_backup_restore.py +0 -40
- catalystwan/endpoints/tenant_management.py +0 -215
- catalystwan/endpoints/tenant_migration.py +0 -102
- catalystwan/endpoints/troubleshooting_tools/device_connectivity.py +0 -128
- catalystwan/endpoints/url_monitoring.py +0 -26
- catalystwan/integration_tests/__init__.py +0 -0
- 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_transport.py +0 -1700
- catalystwan/integration_tests/feature_profile/sdwan/topology/test_topology.py +0 -93
- catalystwan/integration_tests/profile_builder/__init__.py +0 -0
- catalystwan/integration_tests/profile_builder/test_pb_service.py +0 -78
- catalystwan/integration_tests/profile_builder/test_pb_transport.py +0 -56
- 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_find_template_values.py +0 -38
- catalystwan/integration_tests/test_network_hierarchy.py +0 -82
- catalystwan/integration_tests/test_settings.py +0 -30
- catalystwan/logging.conf +0 -37
- catalystwan/models/common.py +0 -1508
- catalystwan/models/configuration/common.py +0 -11
- catalystwan/models/configuration/feature_profile/README.md +0 -344
- catalystwan/models/configuration/feature_profile/builder.py +0 -22
- catalystwan/models/configuration/feature_profile/common.py +0 -790
- catalystwan/models/configuration/feature_profile/parcel.py +0 -232
- 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 -1054
- 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 -915
- 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/__init__.py +0 -178
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/app_probe.py +0 -56
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/application_list.py +0 -31
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/as_path.py +0 -22
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/color_list.py +0 -21
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/data_prefix.py +0 -35
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/expanded_community_list.py +0 -25
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/extended_community.py +0 -34
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/fowarding_class.py +0 -26
- 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/ipv6_data_prefix.py +0 -28
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/ipv6_prefix_list.py +0 -38
- 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/policer.py +0 -42
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefered_group_color.py +0 -83
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/prefix_list.py +0 -28
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/service_object_group.py +0 -21
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/sla_class.py +0 -130
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/standard_community.py +0 -30
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/policy/tloc_list.py +0 -44
- 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/application_list.py +0 -31
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/data_prefix.py +0 -22
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/fqdn.py +0 -24
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/geolocation_list.py +0 -32
- 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/ips_signature.py +0 -44
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/local_domain.py +0 -24
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/protocol_list.py +0 -21
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/scalable_group_tag.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/security_port.py +0 -45
- 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.py +0 -32
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/url_filtering.py +0 -148
- catalystwan/models/configuration/feature_profile/sdwan/policy_object/security/zone.py +0 -44
- 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/routing/ospf.py +0 -173
- catalystwan/models/configuration/feature_profile/sdwan/routing/ospfv3.py +0 -301
- catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +0 -91
- catalystwan/models/configuration/feature_profile/sdwan/service/appqoe.py +0 -270
- catalystwan/models/configuration/feature_profile/sdwan/service/dhcp_server.py +0 -127
- catalystwan/models/configuration/feature_profile/sdwan/service/dual_router_ha.py +0 -26
- catalystwan/models/configuration/feature_profile/sdwan/service/eigrp.py +0 -103
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/common.py +0 -33
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ethernet.py +0 -404
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/gre.py +0 -136
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/ipsec.py +0 -119
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/multilink.py +0 -101
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/svi.py +0 -182
- catalystwan/models/configuration/feature_profile/sdwan/service/lan/vpn.py +0 -627
- catalystwan/models/configuration/feature_profile/sdwan/service/multicast.py +0 -242
- catalystwan/models/configuration/feature_profile/sdwan/service/object_tracker.py +0 -84
- catalystwan/models/configuration/feature_profile/sdwan/service/route_policy.py +0 -419
- catalystwan/models/configuration/feature_profile/sdwan/service/service_chain.py +0 -38
- catalystwan/models/configuration/feature_profile/sdwan/service/service_insertion_attachment.py +0 -184
- catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +0 -110
- catalystwan/models/configuration/feature_profile/sdwan/service/tracker.py +0 -92
- catalystwan/models/configuration/feature_profile/sdwan/service/wireless_lan.py +0 -216
- 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/aaa.py +0 -406
- 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/transport/__init__.py +0 -93
- catalystwan/models/configuration/feature_profile/sdwan/transport/cellular_controller.py +0 -58
- 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 -98
- 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 -375
- 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 -25
- 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 -68
- 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 -55
- catalystwan/models/configuration/feature_profile/sdwan/uc_voice/voice_tenant.py +0 -40
- catalystwan/models/configuration/network_hierarchy/__init__.py +0 -22
- catalystwan/models/configuration/network_hierarchy/cflowd.py +0 -120
- catalystwan/models/configuration/network_hierarchy/node.py +0 -88
- catalystwan/models/configuration/policy_group.py +0 -74
- catalystwan/models/configuration/profile_type.py +0 -5
- catalystwan/models/configuration/topology_group.py +0 -52
- catalystwan/models/device_inventory.py +0 -30
- catalystwan/models/feature_profile_parcel.py +0 -15
- catalystwan/models/misc/application_protocols.py +0 -29
- catalystwan/models/monitoring/security_policy.py +0 -16
- catalystwan/models/monitoring/server_info.py +0 -12
- catalystwan/models/policy/__init__.py +0 -392
- catalystwan/models/policy/centralized.py +0 -265
- catalystwan/models/policy/definition/access_control_list.py +0 -193
- catalystwan/models/policy/definition/access_control_list_ipv6.py +0 -187
- 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/control.py +0 -366
- catalystwan/models/policy/definition/device_access.py +0 -117
- catalystwan/models/policy/definition/device_access_ipv6.py +0 -115
- 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/hub_and_spoke.py +0 -87
- catalystwan/models/policy/definition/intrusion_prevention.py +0 -55
- catalystwan/models/policy/definition/mesh.py +0 -47
- catalystwan/models/policy/definition/pri_isdn_port.py +0 -48
- catalystwan/models/policy/definition/qos_map.py +0 -111
- catalystwan/models/policy/definition/rewrite.py +0 -47
- catalystwan/models/policy/definition/route_policy.py +0 -187
- catalystwan/models/policy/definition/rule_set.py +0 -270
- catalystwan/models/policy/definition/security_group.py +0 -93
- 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 -87
- catalystwan/models/policy/definition/traffic_data.py +0 -496
- catalystwan/models/policy/definition/url_filtering.py +0 -70
- catalystwan/models/policy/definition/vpn_membership.py +0 -42
- catalystwan/models/policy/definition/vpn_qos_map.py +0 -46
- catalystwan/models/policy/definition/zone_based_firewall.py +0 -301
- 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 -45
- catalystwan/models/policy/localized.py +0 -154
- catalystwan/models/policy/policy.py +0 -100
- catalystwan/models/policy/policy_definition.py +0 -1624
- catalystwan/models/policy/policy_list.py +0 -47
- catalystwan/models/policy/security.py +0 -279
- catalystwan/models/policy/voice.py +0 -77
- catalystwan/models/settings.py +0 -41
- catalystwan/models/templates.py +0 -79
- catalystwan/models/tenant.py +0 -105
- catalystwan/models/url_monitoring.py +0 -28
- catalystwan/tests/__init__.py +0 -0
- catalystwan/tests/builders/uc_voice.py +0 -85
- catalystwan/tests/models/__init__.py +0 -0
- catalystwan/tests/models/test_digital_interface.py +0 -56
- catalystwan/tests/templates/__init__.py +0 -0
- catalystwan/tests/templates/definitions/__init__.py +0 -0
- catalystwan/tests/templates/definitions/aaa_basic.json +0 -96
- catalystwan/tests/templates/definitions/aaa_complex.json +0 -464
- catalystwan/tests/templates/definitions/basic/__init__.py +0 -0
- catalystwan/tests/templates/definitions/basic/alias.json +0 -7
- catalystwan/tests/templates/definitions/basic/basic.json +0 -7
- catalystwan/tests/templates/definitions/basic/basic_no_value.json +0 -7
- catalystwan/tests/templates/definitions/basic/children.json +0 -39
- catalystwan/tests/templates/definitions/basic/children_nested.json +0 -72
- catalystwan/tests/templates/definitions/basic/children_nested_datapath.json +0 -72
- catalystwan/tests/templates/definitions/basic/data_path.json +0 -13
- catalystwan/tests/templates/definitions/cisco_aaa.json +0 -178
- catalystwan/tests/templates/definitions/cisco_aaa_complex.json +0 -361
- catalystwan/tests/templates/definitions/cisco_banner.json +0 -20
- catalystwan/tests/templates/definitions/cisco_bfd.json +0 -90
- 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_basic.json +0 -17
- catalystwan/tests/templates/definitions/cisco_vpn_complex.json +0 -1081
- catalystwan/tests/templates/definitions/cisco_vpn_interface_complex.json +0 -821
- catalystwan/tests/templates/definitions/default_cisco_system.json +0 -184
- catalystwan/tests/templates/definitions/omp_vsmart_1.json +0 -26
- catalystwan/tests/templates/definitions/omp_vsmart_2.json +0 -48
- catalystwan/tests/templates/definitions/omp_vsmart_3.json +0 -71
- 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/__init__.py +0 -53
- catalystwan/tests/templates/models/aaa.py +0 -106
- catalystwan/tests/templates/models/cisco_aaa.py +0 -124
- catalystwan/tests/templates/models/cisco_banner.py +0 -7
- catalystwan/tests/templates/models/cisco_bfd.py +0 -15
- 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_system.py +0 -113
- catalystwan/tests/templates/models/cisco_vpn.py +0 -240
- catalystwan/tests/templates/models/cisco_vpn_interface.py +0 -200
- catalystwan/tests/templates/models/omp_vsmart.py +0 -53
- 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/basic/alias.json +0 -24
- catalystwan/tests/templates/schemas/basic/basic.json +0 -23
- catalystwan/tests/templates/schemas/basic/children.json +0 -59
- catalystwan/tests/templates/schemas/basic/children_nested.json +0 -112
- catalystwan/tests/templates/schemas/basic/children_nested_datapath.json +0 -112
- catalystwan/tests/templates/schemas/basic/data_path.json +0 -29
- catalystwan/tests/templates/schemas/cedge_aaa.json +0 -1185
- catalystwan/tests/templates/schemas/cisco_banner.json +0 -44
- catalystwan/tests/templates/schemas/cisco_bfd.json +0 -266
- 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_system.json +0 -3099
- catalystwan/tests/templates/schemas/cisco_vpn.json +0 -2504
- catalystwan/tests/templates/schemas/cisco_vpn_interface.json +0 -3348
- catalystwan/tests/templates/schemas/omp-vsmart.json +0 -222
- 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_chose_model.py +0 -32
- catalystwan/tests/templates/test_deserialize_model.py +0 -69
- catalystwan/tests/templates/test_find_template_values.py +0 -193
- catalystwan/tests/templates/test_find_template_values_2.py +0 -193
- catalystwan/tests/templates/test_generate_payload.py +0 -137
- catalystwan/tests/templates/test_serialize_model.py +0 -52
- catalystwan/tests/test_admin_tech_api.py +0 -198
- catalystwan/tests/test_administration.py +0 -470
- catalystwan/tests/test_alarms_api.py +0 -251
- catalystwan/tests/test_cli_template.py +0 -218
- catalystwan/tests/test_creation_tools.py +0 -155
- catalystwan/tests/test_device_action_api.py +0 -117
- catalystwan/tests/test_devices_api.py +0 -674
- catalystwan/tests/test_endpoints.py +0 -907
- catalystwan/tests/test_feature_profile_api.py +0 -282
- catalystwan/tests/test_feature_template_field.py +0 -33
- catalystwan/tests/test_logs_api.py +0 -40
- catalystwan/tests/test_models_common.py +0 -53
- catalystwan/tests/test_monitoring_security_policy.py +0 -65
- catalystwan/tests/test_monitoring_server_info.py +0 -49
- catalystwan/tests/test_monitoring_status_api.py +0 -118
- catalystwan/tests/test_mtt_aaa_api.py +0 -293
- catalystwan/tests/test_omp_api.py +0 -438
- catalystwan/tests/test_packet_capture.py +0 -125
- catalystwan/tests/test_partition_manager_api.py +0 -121
- catalystwan/tests/test_response.py +0 -183
- catalystwan/tests/test_session.py +0 -102
- catalystwan/tests/test_software_action_api.py +0 -154
- catalystwan/tests/test_speed_test_api.py +0 -143
- catalystwan/tests/test_task_status_api.py +0 -381
- catalystwan/tests/test_templates.py +0 -405
- catalystwan/tests/test_tenant_backup_restore_api.py +0 -88
- catalystwan/tests/test_tenant_management_api.py +0 -153
- catalystwan/tests/test_tenant_migration_api.py +0 -102
- catalystwan/tests/test_typed_list.py +0 -426
- catalystwan/tests/test_url_monitoring.py +0 -80
- catalystwan/tests/test_version.py +0 -99
- catalystwan/tests/test_version_utils.py +0 -240
- catalystwan/tests/test_vmanage_auth.py +0 -149
- catalystwan/typed_list.py +0 -288
- catalystwan/utils/__init__.py +0 -0
- catalystwan/utils/alarm_status.py +0 -16
- catalystwan/utils/certificate_status.py +0 -13
- catalystwan/utils/colors.py +0 -12
- catalystwan/utils/config_status.py +0 -8
- catalystwan/utils/creation_tools.py +0 -136
- catalystwan/utils/dashboard.py +0 -255
- catalystwan/utils/device_model.py +0 -322
- catalystwan/utils/dict.py +0 -61
- catalystwan/utils/feature_template/choose_model.py +0 -30
- catalystwan/utils/feature_template/find_template_values.py +0 -111
- catalystwan/utils/model.py +0 -45
- catalystwan/utils/operation_status.py +0 -22
- catalystwan/utils/persona.py +0 -5
- catalystwan/utils/personality.py +0 -10
- catalystwan/utils/pydantic_field.py +0 -12
- catalystwan/utils/reachability.py +0 -14
- catalystwan/utils/session_type.py +0 -17
- catalystwan/utils/template_type.py +0 -8
- catalystwan/utils/type_check.py +0 -22
- catalystwan/utils/upgrades_helper.py +0 -95
- catalystwan/utils/validate_status.py +0 -8
- catalystwan/workflows/backup_restore_device_templates.py +0 -467
- catalystwan/workflows/tenant_migration.py +0 -203
- catalystwan-0.40.2.dev1.dist-info/METADATA +0 -539
- catalystwan-0.40.2.dev1.dist-info/RECORD +0 -628
- /catalystwan/{api → core/models}/__init__.py +0 -0
- /catalystwan/{api/builders/feature_profiles/__init__.py → core/py.typed} +0 -0
- {catalystwan-0.40.2.dev1.dist-info → catalystwan-2.0.0a1.dist-info}/LICENSE +0 -0
catalystwan/api/template_api.py
DELETED
|
@@ -1,761 +0,0 @@
|
|
|
1
|
-
# Copyright 2022 Cisco Systems, Inc. and its affiliates
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import json
|
|
6
|
-
import logging
|
|
7
|
-
from enum import Enum
|
|
8
|
-
from typing import TYPE_CHECKING, Any, List, Optional, Type, overload
|
|
9
|
-
|
|
10
|
-
from ciscoconfparse import CiscoConfParse # type: ignore
|
|
11
|
-
from typing_extensions import deprecated
|
|
12
|
-
|
|
13
|
-
from catalystwan.api.task_status_api import Task
|
|
14
|
-
from catalystwan.api.templates.cli_template import CLITemplate
|
|
15
|
-
from catalystwan.api.templates.device_template.device_template import (
|
|
16
|
-
CreateDeviceInputPayload,
|
|
17
|
-
DeviceInputValues,
|
|
18
|
-
DeviceSpecificValue,
|
|
19
|
-
DeviceTemplate,
|
|
20
|
-
GeneralTemplate,
|
|
21
|
-
)
|
|
22
|
-
from catalystwan.api.templates.feature_template import FeatureTemplate
|
|
23
|
-
from catalystwan.api.templates.feature_template_field import FeatureTemplateField
|
|
24
|
-
from catalystwan.api.templates.feature_template_payload import FeatureTemplatePayload
|
|
25
|
-
from catalystwan.api.templates.models.aaa_model import AAAModel
|
|
26
|
-
from catalystwan.api.templates.models.cisco_aaa_model import CiscoAAAModel
|
|
27
|
-
from catalystwan.api.templates.models.cisco_banner_model import CiscoBannerModel
|
|
28
|
-
from catalystwan.api.templates.models.cisco_bfd_model import CiscoBFDModel
|
|
29
|
-
from catalystwan.api.templates.models.cisco_bgp_model import CiscoBGPModel
|
|
30
|
-
from catalystwan.api.templates.models.cisco_logging_model import CiscoLoggingModel
|
|
31
|
-
from catalystwan.api.templates.models.cisco_ntp_model import CiscoNTPModel
|
|
32
|
-
from catalystwan.api.templates.models.cisco_omp_model import CiscoOMPModel
|
|
33
|
-
from catalystwan.api.templates.models.cisco_ospf import CiscoOSPFModel
|
|
34
|
-
from catalystwan.api.templates.models.cisco_ospfv3 import CiscoOspfv3Model
|
|
35
|
-
from catalystwan.api.templates.models.cisco_secure_internet_gateway import CiscoSecureInternetGatewayModel
|
|
36
|
-
from catalystwan.api.templates.models.cisco_snmp_model import CiscoSNMPModel
|
|
37
|
-
from catalystwan.api.templates.models.cisco_system import CiscoSystemModel
|
|
38
|
-
from catalystwan.api.templates.models.cisco_vpn_interface_model import CiscoVpnInterfaceModel
|
|
39
|
-
from catalystwan.api.templates.models.cisco_vpn_model import CiscoVPNModel
|
|
40
|
-
from catalystwan.api.templates.models.cli_template import CliTemplateModel
|
|
41
|
-
from catalystwan.api.templates.models.omp_vsmart_model import OMPvSmart
|
|
42
|
-
from catalystwan.api.templates.models.security_vsmart_model import SecurityvSmart
|
|
43
|
-
from catalystwan.api.templates.models.system_vsmart_model import SystemVsmart
|
|
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
|
|
47
|
-
from catalystwan.endpoints.configuration_device_template import FeatureToCLIPayload
|
|
48
|
-
from catalystwan.exceptions import AttachedError, CatalystwanDeprecationWarning, TemplateNotFoundError
|
|
49
|
-
from catalystwan.models.common import DeviceModel
|
|
50
|
-
from catalystwan.models.templates import DeviceTemplateInformation, FeatureTemplateInformation, TemplateInformation
|
|
51
|
-
from catalystwan.response import ManagerResponse
|
|
52
|
-
from catalystwan.typed_list import DataSequence
|
|
53
|
-
from catalystwan.utils.dict import merge
|
|
54
|
-
from catalystwan.utils.pydantic_field import get_extra_field
|
|
55
|
-
from catalystwan.utils.template_type import TemplateType
|
|
56
|
-
|
|
57
|
-
if TYPE_CHECKING:
|
|
58
|
-
from catalystwan.session import ManagerSession
|
|
59
|
-
|
|
60
|
-
logger = logging.getLogger(__name__)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class DeviceModelError(Exception):
|
|
64
|
-
"""Used when unsupported device model used in template."""
|
|
65
|
-
|
|
66
|
-
def __init__(self, template, device_models):
|
|
67
|
-
self.message = f"Provided template type '{template.type}' not available for device models: {device_models}"
|
|
68
|
-
super().__init__(self.message)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
class DeviceTemplateFeature(Enum):
|
|
72
|
-
LAWFUL_INTERCEPTION = "lawful-interception"
|
|
73
|
-
CLOUD_DOCK = "cloud-dock"
|
|
74
|
-
NETWORK_DESIGN = "network-design"
|
|
75
|
-
VMANAGE_DEFAULT = "vmanage-default"
|
|
76
|
-
ALL = "all"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class TemplatesAPI:
|
|
80
|
-
def __init__(self, session: ManagerSession) -> None:
|
|
81
|
-
self.session = session
|
|
82
|
-
|
|
83
|
-
@overload
|
|
84
|
-
def get(self, template: Type[DeviceTemplate]) -> DataSequence[DeviceTemplateInformation]:
|
|
85
|
-
...
|
|
86
|
-
|
|
87
|
-
@overload
|
|
88
|
-
def get(self, template: Type[FeatureTemplate]) -> DataSequence[FeatureTemplateInformation]:
|
|
89
|
-
...
|
|
90
|
-
|
|
91
|
-
@overload
|
|
92
|
-
def get(self, template: Type[CLITemplate]) -> DataSequence[TemplateInformation]:
|
|
93
|
-
...
|
|
94
|
-
|
|
95
|
-
def get(self, template):
|
|
96
|
-
if isinstance(template, FeatureTemplate):
|
|
97
|
-
return self._get_feature_templates()
|
|
98
|
-
if template is FeatureTemplate:
|
|
99
|
-
return self._get_feature_templates()
|
|
100
|
-
if isinstance(template, (DeviceTemplate, CLITemplate)):
|
|
101
|
-
return self._get_device_templates()
|
|
102
|
-
if template in [DeviceTemplate, CLITemplate]:
|
|
103
|
-
return self._get_device_templates()
|
|
104
|
-
|
|
105
|
-
raise NotImplementedError()
|
|
106
|
-
|
|
107
|
-
def _get_feature_templates(
|
|
108
|
-
self,
|
|
109
|
-
summary: bool = True,
|
|
110
|
-
) -> DataSequence[FeatureTemplateInformation]:
|
|
111
|
-
"""In a multitenant vManage system, this API is only available in the Provider view."""
|
|
112
|
-
return self.session.endpoints.configuration_general_template.get_feature_template_list(
|
|
113
|
-
params={"summary": summary}
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
def _get_device_templates(
|
|
117
|
-
self, feature: DeviceTemplateFeature = DeviceTemplateFeature.ALL
|
|
118
|
-
) -> DataSequence[DeviceTemplateInformation]:
|
|
119
|
-
"""In a multitenant vManage system, this API is only available in the Provider view."""
|
|
120
|
-
return self.session.endpoints.configuration_template_master.get_device_template_list(
|
|
121
|
-
params={"feature": feature.value}
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
def attach(self, name: str, device: Device, timeout_seconds: int = 300, **kwargs):
|
|
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:
|
|
130
|
-
return self._attach_cli(name, device, timeout_seconds=timeout_seconds, **kwargs)
|
|
131
|
-
|
|
132
|
-
if template_info.config_type == TemplateType.FEATURE.value:
|
|
133
|
-
return self._attach_feature(name, device, timeout_seconds=timeout_seconds, **kwargs)
|
|
134
|
-
|
|
135
|
-
raise NotImplementedError()
|
|
136
|
-
|
|
137
|
-
def _attach_feature(self, name: str, device: Device, timeout_seconds: int = 300, **kwargs):
|
|
138
|
-
"""Attach Device Template created with Feature Templates.
|
|
139
|
-
|
|
140
|
-
Args:
|
|
141
|
-
name: Name of the Device Template to be attached.
|
|
142
|
-
device: Device object under which the template should be attached.
|
|
143
|
-
**device_specific_vars: For parameters in a feature template that you configure as device-specific,
|
|
144
|
-
when you attach a device template to a device, Cisco vManage prompts you for the values to use
|
|
145
|
-
for these parameters. Entering device-specific values in this manner is useful in test or POC networks,
|
|
146
|
-
or if you are deploying a small network. This method generally does not scale well for larger networks.
|
|
147
|
-
"""
|
|
148
|
-
|
|
149
|
-
def get_device_specific_variables(name: str):
|
|
150
|
-
endpoint = "/dataservice/template/device/config/exportcsv"
|
|
151
|
-
template_id = self.get(DeviceTemplate).filter(name=name).single_or_default().id
|
|
152
|
-
body = {
|
|
153
|
-
"templateId": template_id,
|
|
154
|
-
"isEdited": False,
|
|
155
|
-
"isMasterEdited": False,
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
values = self.session.post(endpoint, json=body).json()["header"]["columns"]
|
|
159
|
-
return [DeviceSpecificValue(**value) for value in values]
|
|
160
|
-
|
|
161
|
-
vars = get_device_specific_variables(name)
|
|
162
|
-
template_id = self.get(DeviceTemplate).filter(name=name).single_or_default().id
|
|
163
|
-
payload = {
|
|
164
|
-
"deviceTemplateList": [
|
|
165
|
-
{
|
|
166
|
-
"templateId": template_id,
|
|
167
|
-
"device": [
|
|
168
|
-
{
|
|
169
|
-
"csv-status": "complete",
|
|
170
|
-
"csv-deviceId": device.uuid,
|
|
171
|
-
"csv-deviceIP": device.id,
|
|
172
|
-
"csv-host-name": device.hostname,
|
|
173
|
-
"csv-templateId": template_id,
|
|
174
|
-
}
|
|
175
|
-
],
|
|
176
|
-
}
|
|
177
|
-
]
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
invalid = False
|
|
181
|
-
msg = {}
|
|
182
|
-
for var in vars:
|
|
183
|
-
if var.property not in payload["deviceTemplateList"][0]["device"][0]:
|
|
184
|
-
pointer = payload["deviceTemplateList"][0]["device"][0]
|
|
185
|
-
if var.property not in kwargs["device_specific_vars"]:
|
|
186
|
-
invalid = True
|
|
187
|
-
msg[var.property] = "should be provided in attach method as device_specific_vars kwarg."
|
|
188
|
-
logger.error(f"{var.property} should be provided in attach method as device_specific_vars kwarg.")
|
|
189
|
-
else:
|
|
190
|
-
pointer[var.property] = kwargs["device_specific_vars"][var.property] # type: ignore
|
|
191
|
-
|
|
192
|
-
if invalid:
|
|
193
|
-
raise TypeError(f"{msg}")
|
|
194
|
-
|
|
195
|
-
endpoint = "/dataservice/template/device/config/attachfeature"
|
|
196
|
-
logger.info(f"Attaching a template: {name} to the device: {device.hostname}.")
|
|
197
|
-
response = self.session.post(url=endpoint, json=payload).json()
|
|
198
|
-
task = Task(session=self.session, task_id=response["id"]).wait_for_completed(timeout_seconds=timeout_seconds)
|
|
199
|
-
if task.result:
|
|
200
|
-
return True
|
|
201
|
-
logger.warning(f"Failed to attach template: {name} to the device: {device.hostname}.")
|
|
202
|
-
logger.warning(f"Task activity information: {task.sub_tasks_data[0].activity}")
|
|
203
|
-
return False
|
|
204
|
-
|
|
205
|
-
def _attach_cli(self, name: str, device: Device, is_edited: bool = False, timeout_seconds: int = 300) -> bool:
|
|
206
|
-
"""
|
|
207
|
-
|
|
208
|
-
Args:
|
|
209
|
-
name (str): Template name to attached.
|
|
210
|
-
device (Device): Device to attach template.
|
|
211
|
-
is_edited (bool): Flag to indicate whether template is being attached as part of edit
|
|
212
|
-
|
|
213
|
-
Returns:
|
|
214
|
-
bool: True if attaching template is successful, otherwise - False.
|
|
215
|
-
"""
|
|
216
|
-
try:
|
|
217
|
-
template_id = self.get(CLITemplate).filter(name=name).single_or_default().id
|
|
218
|
-
self.template_validation(template_id, device=device)
|
|
219
|
-
except TemplateNotFoundError:
|
|
220
|
-
logger.error(f"Error, Template with name {name} not found on {device}.")
|
|
221
|
-
return False
|
|
222
|
-
payload = {
|
|
223
|
-
"deviceTemplateList": [
|
|
224
|
-
{
|
|
225
|
-
"templateId": template_id,
|
|
226
|
-
"device": [
|
|
227
|
-
{
|
|
228
|
-
"csv-status": "complete",
|
|
229
|
-
"csv-deviceId": device.uuid,
|
|
230
|
-
"csv-deviceIP": device.id,
|
|
231
|
-
"csv-host-name": device.hostname,
|
|
232
|
-
"csv-templateId": template_id,
|
|
233
|
-
}
|
|
234
|
-
],
|
|
235
|
-
}
|
|
236
|
-
]
|
|
237
|
-
}
|
|
238
|
-
if is_edited:
|
|
239
|
-
payload["deviceTemplateList"][0]["isEdited"] = True # type: ignore
|
|
240
|
-
endpoint = "/dataservice/template/device/config/attachcli"
|
|
241
|
-
logger.info(f"Attaching a template: {name} to the device: {device.hostname}.")
|
|
242
|
-
response = self.session.post(url=endpoint, json=payload).json()
|
|
243
|
-
task = Task(session=self.session, task_id=response["id"]).wait_for_completed(timeout_seconds=timeout_seconds)
|
|
244
|
-
if task.result:
|
|
245
|
-
return True
|
|
246
|
-
logger.warning(f"Failed to attach tempate: {name} to the device: {device.hostname}.")
|
|
247
|
-
logger.warning(f"Task activity information: {task.sub_tasks_data[0].activity}")
|
|
248
|
-
return False
|
|
249
|
-
|
|
250
|
-
def deatach(self, device: Device) -> bool:
|
|
251
|
-
"""
|
|
252
|
-
Deatach it`s the same to change device mode to CLI mode.
|
|
253
|
-
|
|
254
|
-
Args:
|
|
255
|
-
device (Device): Device to deatach template (change mode).
|
|
256
|
-
|
|
257
|
-
Returns:
|
|
258
|
-
bool: True if change deatach template (mode to CLI) is successful, otherwise - False.
|
|
259
|
-
"""
|
|
260
|
-
payload = {
|
|
261
|
-
"deviceType": device.personality.value,
|
|
262
|
-
"devices": [{"deviceId": device.uuid, "deviceIP": device.id}],
|
|
263
|
-
}
|
|
264
|
-
endpoint = "/dataservice/template/config/device/mode/cli"
|
|
265
|
-
logger.info(f"Changing mode to cli mode for {device.hostname}.")
|
|
266
|
-
response = self.session.post(url=endpoint, json=payload).json()
|
|
267
|
-
task = Task(session=self.session, task_id=response["id"]).wait_for_completed()
|
|
268
|
-
if task.result:
|
|
269
|
-
return True
|
|
270
|
-
logger.warning(f"Failed to change to cli mode for device: {device.hostname}.")
|
|
271
|
-
logger.warning(f"Task activity information: {task.sub_tasks_data[0].activity}")
|
|
272
|
-
return False
|
|
273
|
-
|
|
274
|
-
@overload
|
|
275
|
-
def delete(self, template: Type[DeviceTemplate], name: str) -> bool: # type: ignore
|
|
276
|
-
...
|
|
277
|
-
|
|
278
|
-
@overload
|
|
279
|
-
def delete(self, template: Type[FeatureTemplate], name: str) -> bool: # type: ignore
|
|
280
|
-
...
|
|
281
|
-
|
|
282
|
-
@overload
|
|
283
|
-
def delete(self, template: Type[CLITemplate], name: str) -> bool: # type: ignore
|
|
284
|
-
...
|
|
285
|
-
|
|
286
|
-
def delete(self, template, name) -> bool:
|
|
287
|
-
status = False
|
|
288
|
-
|
|
289
|
-
if template is FeatureTemplate:
|
|
290
|
-
status = self._delete_feature_template(name)
|
|
291
|
-
|
|
292
|
-
if template is DeviceTemplate and name:
|
|
293
|
-
status = self._delete_device_template(name)
|
|
294
|
-
|
|
295
|
-
if isinstance(template, CLITemplate):
|
|
296
|
-
status = self._delete_cli_template(name)
|
|
297
|
-
|
|
298
|
-
if template is CLITemplate and name:
|
|
299
|
-
status = self._delete_cli_template(name)
|
|
300
|
-
|
|
301
|
-
if status:
|
|
302
|
-
logger.info(f"Template {name} was successfuly deleted.")
|
|
303
|
-
return status
|
|
304
|
-
|
|
305
|
-
raise NotImplementedError(f"Not implemented for {template}")
|
|
306
|
-
|
|
307
|
-
def _delete_feature_template(self, name: str) -> bool:
|
|
308
|
-
template = self.get(FeatureTemplate).filter(name=name).single_or_default() # type: ignore
|
|
309
|
-
if template:
|
|
310
|
-
endpoint = f"/dataservice/template/feature/{template.id}"
|
|
311
|
-
self.session.delete(url=endpoint)
|
|
312
|
-
return True
|
|
313
|
-
|
|
314
|
-
def _delete_device_template(self, name: str) -> bool:
|
|
315
|
-
"""
|
|
316
|
-
|
|
317
|
-
Args:
|
|
318
|
-
name (str): Name template to delete.
|
|
319
|
-
|
|
320
|
-
Raises:
|
|
321
|
-
AttachedError: If template is attached to device.
|
|
322
|
-
|
|
323
|
-
Returns:
|
|
324
|
-
bool: True if deletion is successful, otherwise - False.
|
|
325
|
-
"""
|
|
326
|
-
template = self.get(DeviceTemplate).filter(name=name).single_or_default() # type: ignore
|
|
327
|
-
if template:
|
|
328
|
-
endpoint = f"/dataservice/template/device/{template.id}"
|
|
329
|
-
if template.devices_attached == 0:
|
|
330
|
-
response = self.session.delete(url=endpoint)
|
|
331
|
-
logger.info(f"Template with name: {name} - deleted.")
|
|
332
|
-
return response.ok
|
|
333
|
-
logger.warning(f"Template: {template} is attached to device - cannot be deleted.")
|
|
334
|
-
raise AttachedError(template.name)
|
|
335
|
-
return True
|
|
336
|
-
|
|
337
|
-
def _delete_cli_template(self, name: str) -> bool:
|
|
338
|
-
"""
|
|
339
|
-
|
|
340
|
-
Args:
|
|
341
|
-
name (str): Name template to delete.
|
|
342
|
-
|
|
343
|
-
Raises:
|
|
344
|
-
AttachedError: If template is attached to device.
|
|
345
|
-
|
|
346
|
-
Returns:
|
|
347
|
-
bool: True if deletion is successful, otherwise - False.
|
|
348
|
-
"""
|
|
349
|
-
template = self.get(CLITemplate).filter(name=name).single_or_default() # type: ignore
|
|
350
|
-
if template:
|
|
351
|
-
endpoint = f"/dataservice/template/device/{template.id}"
|
|
352
|
-
if template.devices_attached == 0:
|
|
353
|
-
response = self.session.delete(url=endpoint)
|
|
354
|
-
logger.info(f"Template with name: {name} - deleted.")
|
|
355
|
-
return response.ok
|
|
356
|
-
logger.warning(f"Template: {template} is attached to device - cannot be deleted.")
|
|
357
|
-
raise AttachedError(template.name)
|
|
358
|
-
return True
|
|
359
|
-
|
|
360
|
-
@overload
|
|
361
|
-
def edit(self, template: FeatureTemplate) -> Any:
|
|
362
|
-
...
|
|
363
|
-
|
|
364
|
-
@overload
|
|
365
|
-
def edit(self, template: CLITemplate) -> Any:
|
|
366
|
-
...
|
|
367
|
-
|
|
368
|
-
@overload
|
|
369
|
-
def edit(self, template: DeviceTemplate) -> Any:
|
|
370
|
-
...
|
|
371
|
-
|
|
372
|
-
def edit(self, template):
|
|
373
|
-
template_info = self.get(template).filter(name=template.template_name).single_or_default()
|
|
374
|
-
if not template_info:
|
|
375
|
-
raise TemplateNotFoundError(f"Template with name [{template.template_name}] does not exists.")
|
|
376
|
-
|
|
377
|
-
if isinstance(template, FeatureTemplate):
|
|
378
|
-
return self._edit_feature_template(template, template_info)
|
|
379
|
-
|
|
380
|
-
if isinstance(template, DeviceTemplate):
|
|
381
|
-
return self._edit_device_template(template)
|
|
382
|
-
|
|
383
|
-
raise NotImplementedError()
|
|
384
|
-
|
|
385
|
-
def _edit_device_template(self, template: DeviceTemplate):
|
|
386
|
-
self._create_device_template(template, True)
|
|
387
|
-
|
|
388
|
-
def _edit_feature_template(self, template: FeatureTemplate, data: FeatureTemplateInformation) -> ManagerResponse:
|
|
389
|
-
if self.is_created_by_generator(template):
|
|
390
|
-
debug = False
|
|
391
|
-
schema = self.get_feature_template_schema(template, debug)
|
|
392
|
-
payload = self.generate_feature_template_payload(template, schema, debug).model_dump(
|
|
393
|
-
by_alias=True, mode="json"
|
|
394
|
-
)
|
|
395
|
-
else:
|
|
396
|
-
payload = json.loads(template.generate_payload(self.session))
|
|
397
|
-
|
|
398
|
-
response = self.session.put(f"/dataservice/template/feature/{data.id}", json=payload)
|
|
399
|
-
return response
|
|
400
|
-
|
|
401
|
-
@overload
|
|
402
|
-
def create(self, template: FeatureTemplate, debug=False) -> str:
|
|
403
|
-
...
|
|
404
|
-
|
|
405
|
-
@overload
|
|
406
|
-
def create(self, template: DeviceTemplate) -> str:
|
|
407
|
-
...
|
|
408
|
-
|
|
409
|
-
@overload
|
|
410
|
-
def create(self, template: CLITemplate) -> str:
|
|
411
|
-
...
|
|
412
|
-
|
|
413
|
-
def create(self, template, debug: bool = False):
|
|
414
|
-
if isinstance(template, list):
|
|
415
|
-
return [self.create(t) for t in template]
|
|
416
|
-
|
|
417
|
-
template_id: Optional[str] = None # type: ignore
|
|
418
|
-
template_type = None
|
|
419
|
-
|
|
420
|
-
# exists = self.get(template).filter(name=template.name)
|
|
421
|
-
# if exists:
|
|
422
|
-
# raise AlreadyExistsError(f"Template with name [{template.name}] already exists.")
|
|
423
|
-
|
|
424
|
-
if isinstance(template, FeatureTemplate):
|
|
425
|
-
if self.is_created_by_generator(template):
|
|
426
|
-
template_id = self.create_by_generator(template, debug)
|
|
427
|
-
else:
|
|
428
|
-
template_id = self._create_feature_template(template)
|
|
429
|
-
template_type = FeatureTemplate.__name__
|
|
430
|
-
|
|
431
|
-
if isinstance(template, DeviceTemplate):
|
|
432
|
-
template_id = self._create_device_template(template)
|
|
433
|
-
template_type = DeviceTemplate.__name__
|
|
434
|
-
|
|
435
|
-
if isinstance(template, CLITemplate):
|
|
436
|
-
template_id = self._create_cli_template(template)
|
|
437
|
-
template_type = CLITemplate.__name__
|
|
438
|
-
|
|
439
|
-
if not template_id:
|
|
440
|
-
raise NotImplementedError()
|
|
441
|
-
|
|
442
|
-
logger.info(f"Template {template.template_name} ({template_type}) was created successfully ({template_id}).")
|
|
443
|
-
return template_id
|
|
444
|
-
|
|
445
|
-
@deprecated(
|
|
446
|
-
"Obsolete way to use Feature Templates - only create_by_generator", category=CatalystwanDeprecationWarning
|
|
447
|
-
)
|
|
448
|
-
def _create_feature_template(self, template: FeatureTemplate) -> str:
|
|
449
|
-
payload = template.generate_payload(self.session)
|
|
450
|
-
response = self.session.post("/dataservice/template/feature", json=json.loads(payload))
|
|
451
|
-
template_id = response.json()["templateId"]
|
|
452
|
-
|
|
453
|
-
return template_id
|
|
454
|
-
|
|
455
|
-
def _create_cli_template(self, template: CLITemplate) -> str:
|
|
456
|
-
payload = template.generate_payload()
|
|
457
|
-
response = self.session.post("/dataservice/template/device/cli/", json=payload)
|
|
458
|
-
template_id = response.json()["templateId"]
|
|
459
|
-
|
|
460
|
-
return template_id
|
|
461
|
-
|
|
462
|
-
def _create_device_template(self, device_template: DeviceTemplate, edit: bool = False) -> str:
|
|
463
|
-
def get_general_template_info(
|
|
464
|
-
name: str, fr_templates: DataSequence[FeatureTemplateInformation]
|
|
465
|
-
) -> FeatureTemplateInformation:
|
|
466
|
-
_template = fr_templates.filter(name=name).single_or_default()
|
|
467
|
-
|
|
468
|
-
if not _template:
|
|
469
|
-
raise TypeError(f"{name} does not exists. Device Template is invalid.")
|
|
470
|
-
|
|
471
|
-
return _template
|
|
472
|
-
|
|
473
|
-
def parse_general_template(
|
|
474
|
-
general_template: GeneralTemplate,
|
|
475
|
-
fr_templates: DataSequence[FeatureTemplateInformation],
|
|
476
|
-
) -> GeneralTemplate:
|
|
477
|
-
if general_template.sub_templates:
|
|
478
|
-
general_template.sub_templates = [
|
|
479
|
-
parse_general_template(_t, fr_templates) for _t in general_template.sub_templates
|
|
480
|
-
]
|
|
481
|
-
if general_template.name:
|
|
482
|
-
info = get_general_template_info(general_template.name, fr_templates)
|
|
483
|
-
return GeneralTemplate(
|
|
484
|
-
name=general_template.name,
|
|
485
|
-
sub_templates=general_template.sub_templates,
|
|
486
|
-
template_id=info.id,
|
|
487
|
-
template_type=info.template_type,
|
|
488
|
-
)
|
|
489
|
-
else:
|
|
490
|
-
return general_template
|
|
491
|
-
|
|
492
|
-
fr_templates = self.get(FeatureTemplate) # type: ignore
|
|
493
|
-
device_template.general_templates = list(
|
|
494
|
-
map(lambda x: parse_general_template(x, fr_templates), device_template.general_templates) # type: ignore
|
|
495
|
-
)
|
|
496
|
-
|
|
497
|
-
if edit:
|
|
498
|
-
template_id = (
|
|
499
|
-
self.session.api.templates.get(DeviceTemplate)
|
|
500
|
-
.filter(name=device_template.template_name)
|
|
501
|
-
.single_or_default()
|
|
502
|
-
.id
|
|
503
|
-
)
|
|
504
|
-
payload = json.loads(device_template.generate_payload())
|
|
505
|
-
response = self.session.endpoints.configuration_template_master.edit_template(
|
|
506
|
-
template_id=template_id, payload=payload
|
|
507
|
-
)
|
|
508
|
-
return response
|
|
509
|
-
else:
|
|
510
|
-
payload = json.loads(device_template.generate_payload())
|
|
511
|
-
response = (
|
|
512
|
-
self.session.endpoints.configuration_template_master.create_device_template_from_feature_templates(
|
|
513
|
-
payload=payload
|
|
514
|
-
)
|
|
515
|
-
)
|
|
516
|
-
return response.template_id
|
|
517
|
-
|
|
518
|
-
def is_created_by_generator(self, template: FeatureTemplate) -> bool:
|
|
519
|
-
"""Checks if template is created by generator
|
|
520
|
-
|
|
521
|
-
Method will be deleted if every template's payload will be generated dynamically.
|
|
522
|
-
"""
|
|
523
|
-
ported_templates = (
|
|
524
|
-
AAAModel,
|
|
525
|
-
CiscoAAAModel,
|
|
526
|
-
CiscoBFDModel,
|
|
527
|
-
CiscoBannerModel,
|
|
528
|
-
CiscoNTPModel,
|
|
529
|
-
CiscoLoggingModel,
|
|
530
|
-
CiscoOMPModel,
|
|
531
|
-
OMPvSmart,
|
|
532
|
-
SecurityvSmart,
|
|
533
|
-
SystemVsmart,
|
|
534
|
-
CiscoVpnInterfaceModel,
|
|
535
|
-
CiscoSystemModel,
|
|
536
|
-
CiscoSNMPModel,
|
|
537
|
-
CiscoVPNModel,
|
|
538
|
-
CiscoBGPModel,
|
|
539
|
-
CiscoOSPFModel,
|
|
540
|
-
CliTemplateModel,
|
|
541
|
-
CiscoSecureInternetGatewayModel,
|
|
542
|
-
CiscoOspfv3Model,
|
|
543
|
-
VpnVsmartModel,
|
|
544
|
-
VpnVsmartInterfaceModel,
|
|
545
|
-
)
|
|
546
|
-
|
|
547
|
-
return isinstance(template, ported_templates)
|
|
548
|
-
|
|
549
|
-
def get_feature_template_schema(self, template: FeatureTemplate, debug: bool = False) -> Any:
|
|
550
|
-
endpoint = f"/dataservice/template/feature/types/definition/{template.type}/15.0.0"
|
|
551
|
-
schema = self.session.get(url=endpoint).json()
|
|
552
|
-
|
|
553
|
-
if debug:
|
|
554
|
-
with open(f"response_{template.type}.json", "w") as f:
|
|
555
|
-
f.write(json.dumps(schema, indent=4))
|
|
556
|
-
|
|
557
|
-
return schema
|
|
558
|
-
|
|
559
|
-
def create_by_generator(self, template: FeatureTemplate, debug: bool) -> str:
|
|
560
|
-
schema = self.get_feature_template_schema(template, debug)
|
|
561
|
-
payload = self.generate_feature_template_payload(template, schema, debug)
|
|
562
|
-
|
|
563
|
-
endpoint = "/dataservice/template/feature"
|
|
564
|
-
response = self.session.post(endpoint, json=payload.model_dump(by_alias=True, exclude_none=True, mode="json"))
|
|
565
|
-
|
|
566
|
-
return response.json()["templateId"]
|
|
567
|
-
|
|
568
|
-
def generate_feature_template_payload(
|
|
569
|
-
self, template: FeatureTemplate, schema: Any, debug: bool = False
|
|
570
|
-
) -> FeatureTemplatePayload:
|
|
571
|
-
payload = FeatureTemplatePayload(
|
|
572
|
-
name=template.template_name,
|
|
573
|
-
description=template.template_description,
|
|
574
|
-
template_type=template.type,
|
|
575
|
-
device_types=[device_model for device_model in template.device_models],
|
|
576
|
-
definition={},
|
|
577
|
-
) # type: ignore
|
|
578
|
-
|
|
579
|
-
fr_template_fields = [FeatureTemplateField(**field) for field in schema["fields"]] # TODO
|
|
580
|
-
json_dumped_template = template.model_dump(mode="json")
|
|
581
|
-
# "name"
|
|
582
|
-
for field in fr_template_fields:
|
|
583
|
-
value = None
|
|
584
|
-
priority_order = None
|
|
585
|
-
json_dumped_value = None
|
|
586
|
-
# TODO How to discover Device specific variable
|
|
587
|
-
if field.key in template.device_specific_variables:
|
|
588
|
-
value = template.device_specific_variables[field.key]
|
|
589
|
-
else:
|
|
590
|
-
for field_name, field_value in template.model_fields.items():
|
|
591
|
-
data_path = get_extra_field(field_value, "data_path", default=[])
|
|
592
|
-
vmanage_key = get_extra_field(field_value, "vmanage_key")
|
|
593
|
-
if field.dataPath == data_path and ( # type: ignore
|
|
594
|
-
(field.key == field_value.alias or field.key == field_name)
|
|
595
|
-
or field.key == vmanage_key # type: ignore
|
|
596
|
-
):
|
|
597
|
-
priority_order = get_extra_field(field_value, "priority_order") # type: ignore
|
|
598
|
-
value = getattr(template, field_name)
|
|
599
|
-
json_dumped_value = json_dumped_template.get(field_name)
|
|
600
|
-
break
|
|
601
|
-
if value is None:
|
|
602
|
-
continue
|
|
603
|
-
|
|
604
|
-
payload.definition = merge(
|
|
605
|
-
payload.definition,
|
|
606
|
-
field.payload_scheme(value, json_dumped_value=json_dumped_value, priority_order=priority_order),
|
|
607
|
-
)
|
|
608
|
-
|
|
609
|
-
if debug:
|
|
610
|
-
with open(f"payload_{template.type}.json", "w") as f:
|
|
611
|
-
f.write(json.dumps(payload.model_dump(by_alias=True, mode="json"), indent=4))
|
|
612
|
-
|
|
613
|
-
return payload
|
|
614
|
-
|
|
615
|
-
def validate_device_model(self, template: FeatureTemplate) -> bool:
|
|
616
|
-
"""Verify if selected template can be used with provided device model"""
|
|
617
|
-
|
|
618
|
-
template_type = self._get_feature_template_types().filter(name=template.type).single_or_default()
|
|
619
|
-
|
|
620
|
-
available_devices_for_template = [device["name"] for device in template_type.device_models]
|
|
621
|
-
|
|
622
|
-
provided_device_models = [
|
|
623
|
-
dev_mod if type(dev_mod) is DeviceModel else dev_mod for dev_mod in template.device_models
|
|
624
|
-
]
|
|
625
|
-
|
|
626
|
-
if not all(dev in available_devices_for_template for dev in provided_device_models):
|
|
627
|
-
logger.debug(f"Available devices for template '{template.type}': {available_devices_for_template}")
|
|
628
|
-
raise DeviceModelError(template, provided_device_models)
|
|
629
|
-
return True
|
|
630
|
-
|
|
631
|
-
def _get_feature_template_types(self, type: str = "all") -> DataSequence[FeatureTemplatesTypes]:
|
|
632
|
-
"""Gets list off all templates and devices associated with these templates"""
|
|
633
|
-
|
|
634
|
-
endpoint = "/dataservice/template/feature/types"
|
|
635
|
-
params = {"type": type}
|
|
636
|
-
response = self.session.get(endpoint, params=params)
|
|
637
|
-
|
|
638
|
-
return response.dataseq(FeatureTemplatesTypes)
|
|
639
|
-
|
|
640
|
-
def template_validation(self, id: str, device: Device) -> str:
|
|
641
|
-
"""Checking the template of the configuration on the machine.
|
|
642
|
-
|
|
643
|
-
Args:
|
|
644
|
-
id (str): template id to check.
|
|
645
|
-
device (Device): The device on which the configuration is to be validate.
|
|
646
|
-
|
|
647
|
-
Returns:
|
|
648
|
-
str: Validated config.
|
|
649
|
-
"""
|
|
650
|
-
payload = {
|
|
651
|
-
"templateId": id,
|
|
652
|
-
"device": {
|
|
653
|
-
"csv-status": "complete",
|
|
654
|
-
"csv-deviceId": device.uuid,
|
|
655
|
-
"csv-deviceIP": device.id,
|
|
656
|
-
"csv-host-name": device.hostname,
|
|
657
|
-
"csv-templateId": id,
|
|
658
|
-
},
|
|
659
|
-
"isEdited": False,
|
|
660
|
-
"isMasterEdited": False,
|
|
661
|
-
"isRFSRequired": True,
|
|
662
|
-
}
|
|
663
|
-
endpoint = "/dataservice/template/device/config/config/"
|
|
664
|
-
response = self.session.post(url=endpoint, json=payload)
|
|
665
|
-
return response.text
|
|
666
|
-
|
|
667
|
-
def edit_before_push(self, name: str, device: Device) -> bool:
|
|
668
|
-
"""
|
|
669
|
-
Edits device / CLI template before pushing modified config to device(s)
|
|
670
|
-
|
|
671
|
-
Args:
|
|
672
|
-
name (str): Template name to edit.
|
|
673
|
-
device (Device): Device to attach template.
|
|
674
|
-
|
|
675
|
-
Returns:
|
|
676
|
-
bool: True if edit template is successful, otherwise - False.
|
|
677
|
-
"""
|
|
678
|
-
try:
|
|
679
|
-
template_id = self.get(CLITemplate).filter(name=name).single_or_default().id
|
|
680
|
-
self.template_validation(template_id, device=device)
|
|
681
|
-
except TemplateNotFoundError:
|
|
682
|
-
logger.error(f"Error, Template with name {name} not found on {device}.")
|
|
683
|
-
return False
|
|
684
|
-
payload = {
|
|
685
|
-
"templateId": template_id,
|
|
686
|
-
"deviceIds": [device.uuid],
|
|
687
|
-
"isEdited": True,
|
|
688
|
-
"isMasterEdited": True,
|
|
689
|
-
}
|
|
690
|
-
endpoint = "/dataservice/template/device/config/input/"
|
|
691
|
-
logger.info(f"Editing template: {name} of device: {device.hostname}.")
|
|
692
|
-
response = self.session.post(url=endpoint, json=payload).json()
|
|
693
|
-
if (response.get("data") is not None) and (response["data"][0].get("csv-status") == "complete"):
|
|
694
|
-
return True
|
|
695
|
-
logger.warning(f"Failed to edit tempate: {name} of device: {device.hostname}.")
|
|
696
|
-
return False
|
|
697
|
-
|
|
698
|
-
def get_device_configuration_preview(self, payload: FeatureToCLIPayload) -> CiscoConfParse:
|
|
699
|
-
text_config = self.session.endpoints.configuration_device_template.get_device_configuration_preview(payload)
|
|
700
|
-
|
|
701
|
-
return CiscoConfParse(text_config.splitlines())
|
|
702
|
-
|
|
703
|
-
def load_running(self, device: Device) -> CiscoConfParse:
|
|
704
|
-
"""Load running config from device.
|
|
705
|
-
|
|
706
|
-
Args:
|
|
707
|
-
device: The device from which load config.
|
|
708
|
-
|
|
709
|
-
Returns:
|
|
710
|
-
CiscoConfParse: A working configuration on the machine.
|
|
711
|
-
"""
|
|
712
|
-
encoded_uuid = device.uuid.replace("/", "%2F")
|
|
713
|
-
endpoint = f"/dataservice/template/config/running/{encoded_uuid}"
|
|
714
|
-
response = self.session.get_json(endpoint)
|
|
715
|
-
config = CiscoConfParse(response["config"].splitlines())
|
|
716
|
-
logger.debug(f"Template loaded from {device.hostname}.")
|
|
717
|
-
return config
|
|
718
|
-
|
|
719
|
-
def get_feature_templates(self) -> DataSequence[FeatureTemplateInformation]:
|
|
720
|
-
endpoint = "/dataservice/template/feature"
|
|
721
|
-
fr_templates = self.session.get(endpoint)
|
|
722
|
-
return fr_templates.dataseq(FeatureTemplateInformation)
|
|
723
|
-
|
|
724
|
-
def get_device_templates(self) -> DataSequence[DeviceTemplateInformation]:
|
|
725
|
-
endpoint = "/dataservice/template/device"
|
|
726
|
-
params = {"feature": "all"}
|
|
727
|
-
templates = self.session.get(url=endpoint, params=params)
|
|
728
|
-
return templates.dataseq(DeviceTemplateInformation)
|
|
729
|
-
|
|
730
|
-
def get_device_template(self, template_id: str) -> DeviceTemplate:
|
|
731
|
-
endpoint = f"/dataservice/template/device/object/{template_id}"
|
|
732
|
-
response = self.session.get(endpoint)
|
|
733
|
-
return DeviceTemplate(**response.json())
|
|
734
|
-
|
|
735
|
-
def get_device_template_attached_devices_variables(self, template_id: str) -> List[DeviceInputValues]:
|
|
736
|
-
"""
|
|
737
|
-
Fetches and processes attached device variables for a given device template.
|
|
738
|
-
|
|
739
|
-
Args:
|
|
740
|
-
template_id (str): The ID of the device template.
|
|
741
|
-
|
|
742
|
-
Returns:
|
|
743
|
-
List[DeviceInputValues]: A list of DeviceInputValues objects containing device variables.
|
|
744
|
-
"""
|
|
745
|
-
api = self.session.endpoints.configuration_device_template
|
|
746
|
-
|
|
747
|
-
# Fetch attached devices for the template
|
|
748
|
-
attached_devices = api.get_device_config_attached(template_id)
|
|
749
|
-
|
|
750
|
-
# Prepare payload for fetching device variables
|
|
751
|
-
payload = CreateDeviceInputPayload(
|
|
752
|
-
template_id=template_id,
|
|
753
|
-
device_ids=[d.uuid for d in attached_devices if d.uuid],
|
|
754
|
-
is_edited=False,
|
|
755
|
-
is_master_edited=False,
|
|
756
|
-
)
|
|
757
|
-
|
|
758
|
-
# Fetch device variables
|
|
759
|
-
result = api.create_device_input(payload).data
|
|
760
|
-
|
|
761
|
-
return result
|