catalystwan 0.40.1.dev7__py3-none-any.whl → 2.0.0a0__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} +29 -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 +203 -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} +38 -85
- 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.0a0.dist-info/METADATA +327 -0
- catalystwan-2.0.0a0.dist-info/RECORD +24 -0
- {catalystwan-0.40.1.dev7.dist-info → catalystwan-2.0.0a0.dist-info}/WHEEL +2 -1
- catalystwan-2.0.0a0.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 -181
- 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 -137
- 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 -749
- 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 -749
- 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 -215
- 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 -107
- 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 -23
- 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 -175
- 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/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/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/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 -594
- catalystwan/models/configuration/feature_profile/sdwan/routing/ospf.py +0 -170
- catalystwan/models/configuration/feature_profile/sdwan/routing/ospfv3.py +0 -298
- catalystwan/models/configuration/feature_profile/sdwan/service/__init__.py +0 -85
- 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/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 -275
- 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 -172
- 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_insertion_attachment.py +0 -184
- catalystwan/models/configuration/feature_profile/sdwan/service/switchport.py +0 -112
- 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 -149
- 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 -111
- 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 -166
- catalystwan/models/configuration/feature_profile/sdwan/transport/wan/interface/ethernet.py +0 -281
- 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 -329
- 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 -71
- 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/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.1.dev7.dist-info/METADATA +0 -539
- catalystwan-0.40.1.dev7.dist-info/RECORD +0 -618
- /catalystwan/{api → core/models}/__init__.py +0 -0
- /catalystwan/{api/builders/feature_profiles/__init__.py → core/py.typed} +0 -0
- {catalystwan-0.40.1.dev7.dist-info → catalystwan-2.0.0a0.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from typing import Optional, Protocol, TypeVar
|
|
2
|
+
|
|
3
|
+
from catalystwan.abc import SessionInterface, SessionType
|
|
4
|
+
from requests import PreparedRequest # type: ignore
|
|
5
|
+
|
|
6
|
+
T = TypeVar("T")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
ProviderView = SessionType.PROVIDER
|
|
10
|
+
TenantView = SessionType.TENANT
|
|
11
|
+
ProviderAsTenantView = SessionType.PROVIDER_AS_TENANT
|
|
12
|
+
SingleTenantView = SessionType.SINGLE_TENANT
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AuthProtocol(Protocol):
|
|
16
|
+
"""
|
|
17
|
+
Additional interface for Auth to handle login/logout for multiple auth types by common ManagerSession
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def logout(self, client: SessionInterface) -> None: ...
|
|
21
|
+
|
|
22
|
+
def clear(self, last_request: Optional[PreparedRequest]) -> None: ...
|
|
23
|
+
|
|
24
|
+
def increase_session_count(self) -> None: ...
|
|
25
|
+
|
|
26
|
+
def decrease_session_count(self) -> None: ...
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# Copyright 2024 Cisco Systems, Inc. and its affiliates
|
|
2
1
|
import logging
|
|
2
|
+
from dataclasses import asdict, dataclass, field
|
|
3
3
|
from threading import RLock
|
|
4
4
|
from typing import Literal, Optional
|
|
5
5
|
from urllib.parse import urlparse
|
|
6
6
|
|
|
7
|
-
from
|
|
7
|
+
from catalystwan.abc import SessionInterface
|
|
8
|
+
from catalystwan.core.abstractions import AuthProtocol
|
|
9
|
+
from catalystwan.core.exceptions import CatalystwanException
|
|
10
|
+
from catalystwan.core.response import auth_response_debug
|
|
8
11
|
from requests import HTTPError, PreparedRequest, post
|
|
9
12
|
from requests.auth import AuthBase
|
|
10
13
|
from requests.exceptions import JSONDecodeError
|
|
11
14
|
|
|
12
|
-
from catalystwan.abstractions import APIEndpointClient, AuthProtocol
|
|
13
|
-
from catalystwan.exceptions import CatalystwanException
|
|
14
|
-
from catalystwan.response import auth_response_debug
|
|
15
|
-
|
|
16
15
|
LoginMode = Literal["machine", "user", "session"]
|
|
17
16
|
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
@dataclass
|
|
19
|
+
class ApiGwLogin:
|
|
20
20
|
client_id: str
|
|
21
21
|
client_secret: str
|
|
22
22
|
org_name: str
|
|
@@ -24,7 +24,7 @@ class ApiGwLogin(BaseModel):
|
|
|
24
24
|
username: Optional[str] = None
|
|
25
25
|
session: Optional[str] = None
|
|
26
26
|
tenant_user: Optional[bool] = None
|
|
27
|
-
token_duration:
|
|
27
|
+
token_duration: int = field(default=10)
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class ApiGwAuth(AuthBase, AuthProtocol):
|
|
@@ -34,7 +34,12 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
34
34
|
2. Use the token in the Authorization header for subsequent requests.
|
|
35
35
|
"""
|
|
36
36
|
|
|
37
|
-
def __init__(
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
login: ApiGwLogin,
|
|
40
|
+
logger: Optional[logging.Logger] = None,
|
|
41
|
+
verify: bool = False,
|
|
42
|
+
):
|
|
38
43
|
self.login = login
|
|
39
44
|
self.token = ""
|
|
40
45
|
self.logger = logger or logging.getLogger(__name__)
|
|
@@ -70,13 +75,19 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
70
75
|
|
|
71
76
|
@staticmethod
|
|
72
77
|
def get_token(
|
|
73
|
-
base_url: str,
|
|
78
|
+
base_url: str,
|
|
79
|
+
apigw_login: ApiGwLogin,
|
|
80
|
+
logger: Optional[logging.Logger] = None,
|
|
81
|
+
verify: bool = False,
|
|
74
82
|
) -> str:
|
|
75
83
|
try:
|
|
76
84
|
response = post(
|
|
77
85
|
url=f"{base_url}/apigw/login",
|
|
78
86
|
verify=verify,
|
|
79
|
-
json=
|
|
87
|
+
json=asdict(
|
|
88
|
+
apigw_login,
|
|
89
|
+
dict_factory=lambda d: {k: v for (k, v) in d if v is not None},
|
|
90
|
+
),
|
|
80
91
|
timeout=10,
|
|
81
92
|
)
|
|
82
93
|
if logger is not None:
|
|
@@ -84,9 +95,13 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
84
95
|
response.raise_for_status()
|
|
85
96
|
token = response.json()["token"]
|
|
86
97
|
except JSONDecodeError:
|
|
87
|
-
raise CatalystwanException(
|
|
98
|
+
raise CatalystwanException(
|
|
99
|
+
f"Incorrect response type from ApiGateway login request, ({response.text})"
|
|
100
|
+
)
|
|
88
101
|
except HTTPError as ex:
|
|
89
|
-
raise CatalystwanException(
|
|
102
|
+
raise CatalystwanException(
|
|
103
|
+
f"Problem with connection to ApiGateway login endpoint, ({ex})"
|
|
104
|
+
)
|
|
90
105
|
except KeyError as ex:
|
|
91
106
|
raise CatalystwanException(f"Not found token in login response from ApiGateway, ({ex})")
|
|
92
107
|
else:
|
|
@@ -94,7 +109,7 @@ class ApiGwAuth(AuthBase, AuthProtocol):
|
|
|
94
109
|
raise CatalystwanException("Failed to get bearer token")
|
|
95
110
|
return token
|
|
96
111
|
|
|
97
|
-
def logout(self, client:
|
|
112
|
+
def logout(self, client: SessionInterface) -> None:
|
|
98
113
|
return None
|
|
99
114
|
|
|
100
115
|
def _clear(self) -> None:
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from contextlib import contextmanager
|
|
5
|
+
from copy import copy
|
|
6
|
+
from typing import TYPE_CHECKING, Generator, Optional, Union
|
|
7
|
+
|
|
8
|
+
from catalystwan.core.apigw_auth import ApiGwAuth
|
|
9
|
+
from catalystwan.core.loader import load_client
|
|
10
|
+
from catalystwan.core.request_adapter import RequestAdapter
|
|
11
|
+
from catalystwan.core.request_limiter import RequestLimiter
|
|
12
|
+
from catalystwan.core.session import ManagerSession, create_base_url, create_manager_session
|
|
13
|
+
from catalystwan.core.vmanage_auth import vManageAuth
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from catalystwan.core.loader import ApiClient
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@contextmanager
|
|
20
|
+
def create_thread_client(
|
|
21
|
+
url: str,
|
|
22
|
+
auth: Union[vManageAuth, ApiGwAuth],
|
|
23
|
+
port: Optional[int] = None,
|
|
24
|
+
subdomain: Optional[str] = None,
|
|
25
|
+
logger: Optional[logging.Logger] = None,
|
|
26
|
+
request_limiter: Optional[RequestLimiter] = None,
|
|
27
|
+
) -> Generator[ApiClient, None, None]:
|
|
28
|
+
if logger is None:
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
session = ManagerSession(
|
|
31
|
+
base_url=create_base_url(url, port),
|
|
32
|
+
auth=auth,
|
|
33
|
+
subdomain=subdomain,
|
|
34
|
+
logger=logger,
|
|
35
|
+
request_limiter=request_limiter,
|
|
36
|
+
)
|
|
37
|
+
with session.login():
|
|
38
|
+
version = session.api_version.base_version
|
|
39
|
+
logger.debug(f"Choosing client for version {version}...")
|
|
40
|
+
client = load_client(session.api_version.base_version)
|
|
41
|
+
logger.debug(f"Client for version {version} loaded")
|
|
42
|
+
yield client(RequestAdapter(session=session, logger=logger))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@contextmanager
|
|
46
|
+
def create_client(
|
|
47
|
+
url: str,
|
|
48
|
+
username: str,
|
|
49
|
+
password: str,
|
|
50
|
+
port: Optional[int] = None,
|
|
51
|
+
subdomain: Optional[str] = None,
|
|
52
|
+
logger: Optional[logging.Logger] = None,
|
|
53
|
+
) -> Generator[ApiClient, None, None]:
|
|
54
|
+
if logger is None:
|
|
55
|
+
logger = logging.getLogger(__name__)
|
|
56
|
+
with create_manager_session(url, username, password, port, subdomain, logger) as session:
|
|
57
|
+
version = session.api_version.base_version
|
|
58
|
+
logger.debug(f"Choosing client for version {version}...")
|
|
59
|
+
client = load_client(session.api_version.base_version)
|
|
60
|
+
logger.debug(f"Client for version {version} loaded")
|
|
61
|
+
yield client(RequestAdapter(session=session, logger=logger))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@contextmanager
|
|
65
|
+
def copy_client(client: ApiClient) -> Generator[ApiClient, None, None]:
|
|
66
|
+
request_adapter = copy(client._request_adapter)
|
|
67
|
+
session = request_adapter.session
|
|
68
|
+
with session.login():
|
|
69
|
+
new_client = load_client(session.api_version.base_version)(request_adapter)
|
|
70
|
+
assert new_client.api_version == client.api_version
|
|
71
|
+
yield new_client
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
from dataclasses import dataclass
|
|
3
2
|
from typing import Union
|
|
4
3
|
|
|
5
|
-
from pydantic import BaseModel
|
|
6
4
|
from requests import HTTPError, RequestException
|
|
7
5
|
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
@dataclass
|
|
8
|
+
class ManagerErrorInfo:
|
|
9
|
+
message: Union[str, None]
|
|
10
|
+
details: Union[str, None]
|
|
11
|
+
code: Union[str, None]
|
|
12
|
+
type: Union[str, None]
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class CatalystwanException(Exception):
|
|
@@ -19,6 +19,10 @@ class CatalystwanException(Exception):
|
|
|
19
19
|
class ManagerRequestException(RequestException, CatalystwanException):
|
|
20
20
|
"""Exception raised when there is ambigous problem during sending of request to Manager"""
|
|
21
21
|
|
|
22
|
+
def __init__(self, *args, **kwargs):
|
|
23
|
+
"""Initialize RequestException with `request` and `response` objects."""
|
|
24
|
+
super().__init__(*args, **kwargs)
|
|
25
|
+
|
|
22
26
|
|
|
23
27
|
class ManagerHTTPError(HTTPError, ManagerRequestException):
|
|
24
28
|
def __init__(self, *args, error_info: ManagerErrorInfo, **kwargs):
|
|
@@ -39,7 +43,9 @@ class ManagerHTTPError(HTTPError, ManagerRequestException):
|
|
|
39
43
|
f"Headers: {self.request.headers}, Body: {self.request.body}"
|
|
40
44
|
)
|
|
41
45
|
response_str = (
|
|
42
|
-
f"Response: {str(self.response.json())}"
|
|
46
|
+
f"Response: {str(self.response.json())}"
|
|
47
|
+
if self.response
|
|
48
|
+
else "Response: No response information"
|
|
43
49
|
)
|
|
44
50
|
return f"{error_info_str}\n\n {request_str}\n\n {response_str}"
|
|
45
51
|
|
|
@@ -114,7 +120,9 @@ class APIVersionError(CatalystwanException):
|
|
|
114
120
|
"""Raised when API is unsupported in running vManage version."""
|
|
115
121
|
|
|
116
122
|
def __init__(self, item, supported, current):
|
|
117
|
-
self.message =
|
|
123
|
+
self.message = (
|
|
124
|
+
f"vManage is running: {current} but {item} only supported in API version: {supported}"
|
|
125
|
+
)
|
|
118
126
|
|
|
119
127
|
|
|
120
128
|
class APIViewError(CatalystwanException):
|
|
@@ -210,3 +218,15 @@ class CatalystwanDeprecationWarning(DeprecationWarning):
|
|
|
210
218
|
f" The public API SHOULD NOT be considered stable."
|
|
211
219
|
)
|
|
212
220
|
return message
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class CatalystwanModelInputException(CatalystwanException): ...
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class CatalystwanModelValidationError(CatalystwanException): ...
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class CatalystwanResponseTypeError(CatalystwanException):
|
|
230
|
+
"""Raised when SDWAN response does not match expected type."""
|
|
231
|
+
|
|
232
|
+
...
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# This file is autogenerated and cannot be modified manually.
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import typing as t
|
|
6
|
+
|
|
7
|
+
if t.TYPE_CHECKING:
|
|
8
|
+
from catalystwan.versions.v20_15.api_client import ApiClient as ApiClientV20_15
|
|
9
|
+
from catalystwan.versions.v20_16.api_client import ApiClient as ApiClientV20_16
|
|
10
|
+
|
|
11
|
+
ApiClient = t.Union[ApiClientV20_15, ApiClientV20_16]
|
|
12
|
+
|
|
13
|
+
VERSIONS = ["20.15", "20.16"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@t.overload
|
|
17
|
+
def load_client(version: t.Literal["20.15"]) -> t.Type[ApiClientV20_15]: ...
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@t.overload
|
|
21
|
+
def load_client(version: t.Literal["20.16"]) -> t.Type[ApiClientV20_16]: ...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@t.overload
|
|
25
|
+
def load_client(version: str) -> t.Type[t.Union[ApiClientV20_15, ApiClientV20_16]]: ...
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def load_client(version: t.Union[str, t.Literal["20.15", "20.16"]]) -> t.Type[ApiClient]:
|
|
29
|
+
if version == "20.15":
|
|
30
|
+
from catalystwan.versions.v20_15.api_client import ApiClient as ApiClientV20_15
|
|
31
|
+
|
|
32
|
+
return ApiClientV20_15
|
|
33
|
+
if version == "20.16":
|
|
34
|
+
from catalystwan.versions.v20_16.api_client import ApiClient as ApiClientV20_16
|
|
35
|
+
|
|
36
|
+
return ApiClientV20_16
|
|
37
|
+
raise RuntimeError("Unsupported version: {}".format(version))
|
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
# Copyright 2022 Cisco Systems, Inc. and its affiliates
|
|
2
|
-
|
|
3
|
-
import logging
|
|
4
|
-
import logging.config
|
|
5
1
|
import multiprocessing
|
|
6
2
|
from functools import lru_cache, wraps
|
|
7
3
|
from importlib import metadata
|
|
8
4
|
from importlib.machinery import PathFinder
|
|
9
|
-
from os import environ
|
|
10
5
|
from pathlib import Path
|
|
11
6
|
from traceback import FrameSummary, StackSummary, extract_stack
|
|
12
|
-
from typing import Callable,
|
|
13
|
-
|
|
14
|
-
import urllib3
|
|
7
|
+
from typing import Callable, List, Optional
|
|
15
8
|
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
PACKAGE_NAME = "catalystwan"
|
|
10
|
+
PACKAGE_VERSION = metadata.version(PACKAGE_NAME)
|
|
11
|
+
USER_AGENT = f"{PACKAGE_NAME}/{PACKAGE_VERSION}"
|
|
18
12
|
|
|
19
13
|
|
|
20
14
|
def with_proc_info_header(method: Callable[..., str]) -> Callable[..., str]:
|
|
@@ -59,25 +53,18 @@ def is_file_in_package(fname: str) -> bool:
|
|
|
59
53
|
return Path(fname) in pkg_src_list
|
|
60
54
|
|
|
61
55
|
|
|
62
|
-
def list_package_sources() -> List[Path]:
|
|
56
|
+
def list_package_sources(package: Optional[str] = None) -> List[Path]:
|
|
63
57
|
"""
|
|
64
58
|
Creates a list containing paths to all python source files
|
|
65
59
|
for current package
|
|
66
60
|
"""
|
|
61
|
+
if package is None:
|
|
62
|
+
package = __package__
|
|
67
63
|
pkg_srcs: List[Path] = []
|
|
68
|
-
if pkg_spec := PathFinder.find_spec(
|
|
64
|
+
if pkg_spec := PathFinder.find_spec(package):
|
|
69
65
|
if pkg_origin := pkg_spec.origin:
|
|
70
66
|
pkg_srcs = list(Path(pkg_origin).parent.glob("**/*.py"))
|
|
71
67
|
return pkg_srcs
|
|
72
68
|
|
|
73
69
|
|
|
74
|
-
|
|
75
|
-
__version__ = metadata.version(__package__)
|
|
76
|
-
pkg_src_list = list_package_sources()
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if environ.get("catalystwan_devel") is not None or environ.get("CATALYSTWAN_DEVEL") is not None:
|
|
80
|
-
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
81
|
-
catalystwan_logger = logging.getLogger(__name__)
|
|
82
|
-
logging.config.fileConfig(LOGGING_CONF_DIR, disable_existing_loggers=False)
|
|
83
|
-
catalystwan_logger.debug(f"catalystwan {__version__}")
|
|
70
|
+
pkg_src_list = list_package_sources(PACKAGE_NAME)
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
from collections import deque
|
|
2
|
+
from copy import deepcopy
|
|
3
|
+
from dataclasses import fields, is_dataclass
|
|
4
|
+
from functools import reduce
|
|
5
|
+
from inspect import isclass, unwrap
|
|
6
|
+
from typing import Any, Dict, List, Literal, Protocol, Tuple, Type, TypeVar, Union
|
|
7
|
+
|
|
8
|
+
from catalystwan.core.exceptions import (
|
|
9
|
+
CatalystwanModelInputException,
|
|
10
|
+
CatalystwanModelValidationError,
|
|
11
|
+
)
|
|
12
|
+
from catalystwan.core.types import MODEL_TYPES, AliasPath, DataclassInstance
|
|
13
|
+
from typing_extensions import Annotated, get_args, get_origin, get_type_hints
|
|
14
|
+
|
|
15
|
+
T = TypeVar("T", bound=DataclassInstance)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ValueExtractorCallable(Protocol):
|
|
19
|
+
def __call__(self, field_value: Any) -> Any: ...
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ModelDeserializer:
|
|
23
|
+
def __init__(self, model: Type[T]) -> None:
|
|
24
|
+
self.model = model
|
|
25
|
+
try:
|
|
26
|
+
self.model_type: MODEL_TYPES = model._catalystwan_model_type # type: ignore[attr-defined]
|
|
27
|
+
except AttributeError:
|
|
28
|
+
self.model_type = "base"
|
|
29
|
+
self._exceptions: List[
|
|
30
|
+
Union[CatalystwanModelInputException, CatalystwanModelValidationError]
|
|
31
|
+
] = []
|
|
32
|
+
# different models wrap their values in different ways, hence
|
|
33
|
+
# the need for multiple extractors
|
|
34
|
+
self.VALUE_EXTRACTORS: Dict[MODEL_TYPES, ValueExtractorCallable] = {
|
|
35
|
+
"base": self.__value_extractor_base,
|
|
36
|
+
"feature_template": self.__value_extractor_ft,
|
|
37
|
+
"parcel": self.__value_extractor_parcel,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def deserialize(self, *args, **kwargs) -> Tuple[List[Any], Dict[str, Any]]:
|
|
41
|
+
new_args, new_kwargs = self.__transform_model_input(
|
|
42
|
+
self.model, self.__value_extractor, *args, **kwargs
|
|
43
|
+
)
|
|
44
|
+
# Input errors are aggregated and thrown out as a bundle
|
|
45
|
+
self.__check_errors()
|
|
46
|
+
return new_args, new_kwargs
|
|
47
|
+
|
|
48
|
+
def __check_errors(self):
|
|
49
|
+
if self._exceptions:
|
|
50
|
+
# Put exceptions from current model first
|
|
51
|
+
self._exceptions.sort(key=lambda x: isinstance(x, CatalystwanModelValidationError))
|
|
52
|
+
current_model_errors = sum(
|
|
53
|
+
isinstance(x, CatalystwanModelInputException) for x in self._exceptions
|
|
54
|
+
)
|
|
55
|
+
message = f"{current_model_errors} validation errors for {self.model.__name__}\n"
|
|
56
|
+
for exc in self._exceptions:
|
|
57
|
+
message += f"{exc}\n"
|
|
58
|
+
raise CatalystwanModelValidationError(message)
|
|
59
|
+
|
|
60
|
+
def __is_optional(self, t: Any) -> bool:
|
|
61
|
+
if get_origin(t) is Union and type(None) in get_args(t):
|
|
62
|
+
return True
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
def __extract_type(self, field_type: Any, field_value: Any, field_name: str) -> Any:
|
|
66
|
+
origin = get_origin(field_type)
|
|
67
|
+
# check for simple types and classes
|
|
68
|
+
if origin is None:
|
|
69
|
+
if field_type is Any:
|
|
70
|
+
return field_value
|
|
71
|
+
if isinstance(field_value, field_type):
|
|
72
|
+
return field_value
|
|
73
|
+
elif is_dataclass(field_type):
|
|
74
|
+
assert isinstance(field_type, type)
|
|
75
|
+
return deserialize(field_type, **field_value)
|
|
76
|
+
elif isclass(unwrap(field_type)):
|
|
77
|
+
if isinstance(field_value, dict):
|
|
78
|
+
return field_type(**field_value)
|
|
79
|
+
else:
|
|
80
|
+
try:
|
|
81
|
+
return field_type(field_value)
|
|
82
|
+
except ValueError:
|
|
83
|
+
raise CatalystwanModelInputException(
|
|
84
|
+
f"Unable to match or cast input value for {field_name} [expected_type={unwrap(field_type)}, input={field_value}, input_type={type(field_value)}]"
|
|
85
|
+
)
|
|
86
|
+
elif origin is list:
|
|
87
|
+
if isinstance(field_value, list):
|
|
88
|
+
return [
|
|
89
|
+
self.__extract_type(get_args(field_type)[0], value, field_name)
|
|
90
|
+
for value in field_value
|
|
91
|
+
]
|
|
92
|
+
elif self.__is_optional(field_type):
|
|
93
|
+
if field_value is None:
|
|
94
|
+
return None
|
|
95
|
+
else:
|
|
96
|
+
try:
|
|
97
|
+
return self.__extract_type(get_args(field_type)[0], field_value, field_name)
|
|
98
|
+
except CatalystwanModelInputException as e:
|
|
99
|
+
if not field_value:
|
|
100
|
+
return None
|
|
101
|
+
raise e
|
|
102
|
+
elif origin is Literal:
|
|
103
|
+
for arg in get_args(field_type):
|
|
104
|
+
try:
|
|
105
|
+
if type(arg)(field_value) == arg:
|
|
106
|
+
return type(arg)(field_value)
|
|
107
|
+
except Exception:
|
|
108
|
+
continue
|
|
109
|
+
elif origin is Annotated:
|
|
110
|
+
validator, caster = field_type.__metadata__
|
|
111
|
+
if validator(field_value):
|
|
112
|
+
return field_value
|
|
113
|
+
return caster(field_value)
|
|
114
|
+
# TODO: Currently, casting is done left-to-right. Searching deeper for a better match may be the way to go.
|
|
115
|
+
elif origin is Union:
|
|
116
|
+
for arg in get_args(field_type):
|
|
117
|
+
try:
|
|
118
|
+
return self.__extract_type(arg, field_value, field_name)
|
|
119
|
+
except Exception:
|
|
120
|
+
continue
|
|
121
|
+
# Correct type not found, add exception
|
|
122
|
+
raise CatalystwanModelInputException(
|
|
123
|
+
f"Unable to match or cast input value for {field_name} [expected_type={unwrap(field_type)}, input={field_value}, input_type={type(field_value)}]"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def __transform_model_input(
|
|
127
|
+
self, cls: Type[T], value_extractor: ValueExtractorCallable, *args, **kwargs
|
|
128
|
+
):
|
|
129
|
+
args_copy = deque(deepcopy(args))
|
|
130
|
+
kwargs_copy = deepcopy(kwargs)
|
|
131
|
+
new_args = []
|
|
132
|
+
new_kwargs = {}
|
|
133
|
+
field_types = get_type_hints(cls)
|
|
134
|
+
for field in fields(cls):
|
|
135
|
+
if not field.init:
|
|
136
|
+
continue
|
|
137
|
+
field_type = field_types[field.name]
|
|
138
|
+
# check args first
|
|
139
|
+
if len(args_copy) > 0:
|
|
140
|
+
field_value = args_copy.popleft()
|
|
141
|
+
try:
|
|
142
|
+
new_args.append(
|
|
143
|
+
self.__extract_type(field_type, value_extractor(field_value), field.name)
|
|
144
|
+
)
|
|
145
|
+
except (
|
|
146
|
+
CatalystwanModelInputException,
|
|
147
|
+
CatalystwanModelValidationError,
|
|
148
|
+
) as e:
|
|
149
|
+
self._exceptions.append(e)
|
|
150
|
+
continue
|
|
151
|
+
|
|
152
|
+
alias = field.metadata.get("alias", None)
|
|
153
|
+
alias_path = alias if isinstance(alias, AliasPath) else [alias]
|
|
154
|
+
try:
|
|
155
|
+
# get value from given dict path
|
|
156
|
+
field_value = reduce(dict.get, alias_path, kwargs_copy) # type: ignore[arg-type]
|
|
157
|
+
except TypeError:
|
|
158
|
+
field_value = None
|
|
159
|
+
if field_value is None:
|
|
160
|
+
if field.name in kwargs_copy:
|
|
161
|
+
field_value = kwargs_copy[field.name]
|
|
162
|
+
else:
|
|
163
|
+
continue
|
|
164
|
+
try:
|
|
165
|
+
new_kwargs[field.name] = self.__extract_type(
|
|
166
|
+
field_type, value_extractor(field_value), field.name
|
|
167
|
+
)
|
|
168
|
+
except (
|
|
169
|
+
CatalystwanModelInputException,
|
|
170
|
+
CatalystwanModelValidationError,
|
|
171
|
+
) as e:
|
|
172
|
+
self._exceptions.append(e)
|
|
173
|
+
return new_args, new_kwargs
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def __value_extractor(self) -> ValueExtractorCallable:
|
|
177
|
+
return self.VALUE_EXTRACTORS[self.model_type]
|
|
178
|
+
|
|
179
|
+
def __value_extractor_base(self, field_value: Any) -> Any:
|
|
180
|
+
return field_value
|
|
181
|
+
|
|
182
|
+
def __value_extractor_ft(self, field_value: Any) -> Any:
|
|
183
|
+
if isinstance(field_value, dict):
|
|
184
|
+
if "vipType" in field_value and field_value["vipType"] == "ignore":
|
|
185
|
+
return None
|
|
186
|
+
if "vipValue" in field_value:
|
|
187
|
+
return field_value["vipValue"]
|
|
188
|
+
return field_value
|
|
189
|
+
|
|
190
|
+
def __value_extractor_parcel(self, field_value: Any) -> Any:
|
|
191
|
+
if (
|
|
192
|
+
isinstance(field_value, dict)
|
|
193
|
+
and "option_type" in field_value
|
|
194
|
+
and "value" in field_value
|
|
195
|
+
):
|
|
196
|
+
return field_value["value"]
|
|
197
|
+
return field_value
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def deserialize(catalystwan_model: Type[T], *args, **kwargs) -> T:
|
|
201
|
+
new_args, new_kwargs = ModelDeserializer(catalystwan_model).deserialize(*args, **kwargs)
|
|
202
|
+
|
|
203
|
+
return catalystwan_model(*new_args, **new_kwargs)
|