zscaler-sdk-python 1.2.4__tar.gz → 1.4.0__tar.gz
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.
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/PKG-INFO +4 -4
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/pyproject.toml +3 -3
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/__init__.py +1 -1
- zscaler_sdk_python-1.4.0/zscaler/errors/http_error.py +10 -0
- zscaler_sdk_python-1.4.0/zscaler/errors/response_checker.py +57 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/errors/zscaler_api_error.py +13 -23
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/exceptions/exceptions.py +1 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/helpers.py +16 -2
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_http_client.py +1 -52
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_oauth_client.py +2 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/request_executor.py +42 -12
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/utils.py +126 -109
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/admin_user.py +7 -4
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/devices.py +25 -7
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/legacy.py +131 -45
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/devices.py +3 -3
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/secrets.py +1 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/bandwidth_control_rules.py +20 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall.py +77 -27
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/legacy.py +30 -35
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_web_rules.py +7 -4
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/url_filtering_rules.py +10 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/url_categories.py +7 -6
- zscaler_sdk_python-1.4.0/zscaler/zpa/administrator_controller.py +304 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_protection.py +266 -180
- zscaler_sdk_python-1.2.4/zscaler/zpa/application_segment.py → zscaler_sdk_python-1.4.0/zscaler/zpa/app_segments_ba.py +91 -195
- zscaler_sdk_python-1.4.0/zscaler/zpa/app_segments_ba_v2.py +479 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segments_inspection.py +83 -62
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segments_pra.py +49 -41
- zscaler_sdk_python-1.4.0/zscaler/zpa/application_segment.py +939 -0
- zscaler_sdk_python-1.4.0/zscaler/zpa/client_settings.py +210 -0
- zscaler_sdk_python-1.4.0/zscaler/zpa/enrollment_certificates.py +457 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/legacy.py +59 -29
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connector_groups.py +15 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_protection_predefined_controls.py +45 -8
- zscaler_sdk_python-1.4.0/zscaler/zpa/models/app_protection_profile.py +943 -0
- zscaler_sdk_python-1.4.0/zscaler/zpa/models/application_segment.py +1053 -0
- zscaler_sdk_python-1.4.0/zscaler/zpa/models/application_segment_lb.py +104 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/common.py +4 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/enrollment_certificates.py +6 -6
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/policyset_controller_v1.py +15 -3
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/policyset_controller_v2.py +72 -29
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_console.py +0 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/role_controller.py +3 -2
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/segment_group.py +4 -1
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/server_group.py +22 -3
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edge_groups.py +2 -2
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/policies.py +925 -298
- zscaler_sdk_python-1.4.0/zscaler/zpa/role_controller.py +409 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/saml_attributes.py +144 -138
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/zpa_service.py +41 -21
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/legacy.py +48 -40
- zscaler_sdk_python-1.2.4/zscaler/errors/http_error.py +0 -20
- zscaler_sdk_python-1.2.4/zscaler/zpa/administrator_controller.py +0 -295
- zscaler_sdk_python-1.2.4/zscaler/zpa/client_settings.py +0 -209
- zscaler_sdk_python-1.2.4/zscaler/zpa/enrollment_certificates.py +0 -320
- zscaler_sdk_python-1.2.4/zscaler/zpa/models/app_protection.py +0 -317
- zscaler_sdk_python-1.2.4/zscaler/zpa/models/application_segment.py +0 -587
- zscaler_sdk_python-1.2.4/zscaler/zpa/models/application_segment_inspection.py +0 -173
- zscaler_sdk_python-1.2.4/zscaler/zpa/models/application_segment_pra.py +0 -211
- zscaler_sdk_python-1.2.4/zscaler/zpa/role_controller.py +0 -285
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/LICENSE.md +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/README.md +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/api_client.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/cache/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/cache/cache.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/cache/no_op_cache.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/cache/zscaler_cache.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/config/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/config/config_setter.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/config/config_validator.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/constants.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/error_messages.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/errors/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/errors/error.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/exceptions/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/logger.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_client.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_collection.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_object.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_response.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ratelimiter/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ratelimiter/ratelimiter.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/user_agent.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/company.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/entitlements.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/fail_open_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/forwarding_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/admin_user.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/failopenpolicy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/forwardingprofile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/getcompanyinfo.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/manage_pass.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/secrets_otp.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/secrets_passwords.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/trustednetworks.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webappservice.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webpolicy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webprivacy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_app_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_privacy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zcc/zcc_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/admin.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/alerts.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/apps.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/devices.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/inventory.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/legacy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/activeapplications.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/administration.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/alerts.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/application_users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/applications.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/call_quality_metrics.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/common.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/devices.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/software_inventory.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zdx/zdx_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/activate.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/admin_roles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/admin_users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/apptotal.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/atp_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/audit_logs.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_applications.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_dns.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_ips.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/device_management.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/end_user_notification.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/file_type_control_rule.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/forwarding_control.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/gre_tunnel.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/iot_report.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/locations.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/malware_protection_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/activation.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/advanced_threat_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/apptotal.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_app_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/common.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/device_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/devices.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/endusernotification.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/filetyperules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/forwarding_control_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_recommended_list.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_tunnel_info.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_tunnels.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_vips.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/iotreport.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/location_group.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/location_management.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/malware_protection_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/nss_servers.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/organization_information.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/pac_files.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/proxies.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/proxy_gatways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/remoteassistance.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/rule_labels.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/sandboxrules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/subclouds.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/system_audit.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/time_intervals.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_dc_exclusions.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/urlcategory.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/user_management.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/workload_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/nss_servers.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/organization_information.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/pac_files.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/policy_export.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/proxies.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/remote_assistance.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/rule_labels.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/sandbox.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/sandbox_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/sub_clouds.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/system_audit.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/time_intervals.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/url_filtering.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/user_management.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/workload_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/zia_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zia/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connectors.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segment_by_type.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_region.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/certificates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/customer_controller.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/emergency_access.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/idp.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/lss.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/machine_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/microtenants.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connectors.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/application_servers.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_region.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/certificates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/client_settings.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/customer_controller.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/emergency_access.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/idp.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/lss.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/machine_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/microtenants.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_approval.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_credential.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_portal.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/provisioning_keys.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/scim_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edges.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/trusted_network.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_approval.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_console.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_credential.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_credential_pool.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_portal.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/provisioning.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/scim_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/segment_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/server_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/servers.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edge_group.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edges.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zpa/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/account_details.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/activation.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/admin_roles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/admin_users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/api_keys.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ec_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/location_management.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/location_template.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/activation.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/common.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ec_group_vm.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ecgroup.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/location_management.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/location_templates.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/nw_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/zpa_resources.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/nw_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ztw_service.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/__init__.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/audit_logs.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/dlp_incidents.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/legacy.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/audit_logs.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/change_history.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/common.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/generated_tickets.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_details.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_evidence.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_group_search.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_search.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_trigger.py +0 -0
- {zscaler_sdk_python-1.2.4 → zscaler_sdk_python-1.4.0}/zscaler/zwa/zwa_service.py +0 -0
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: zscaler-sdk-python
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Official Python SDK for the Zscaler Products
|
|
5
5
|
Home-page: https://github.com/zscaler/zscaler-sdk-python
|
|
6
6
|
License: MIT
|
|
7
7
|
Keywords: zscaler,sdk,zpa,zia,zdx,zcc,ztw,zwa
|
|
8
8
|
Author: Zscaler, Inc.
|
|
9
9
|
Author-email: devrel@zscaler.com
|
|
10
|
-
Requires-Python: >=3.9,<4.0
|
|
10
|
+
Requires-Python: >=3.9.2,<4.0
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
14
14
|
Classifier: Operating System :: OS Independent
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.8
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
21
|
Classifier: Topic :: Security
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
23
|
Provides-Extra: dev
|
|
24
24
|
Requires-Dist: aenum (>=3.1.11)
|
|
25
25
|
Requires-Dist: arrow (>=1.3.0)
|
|
26
|
-
Requires-Dist: cryptography (>=
|
|
26
|
+
Requires-Dist: cryptography (>=45.0.2)
|
|
27
27
|
Requires-Dist: flatdict (>=4.0.0)
|
|
28
28
|
Requires-Dist: pydash (>=8.0.3)
|
|
29
29
|
Requires-Dist: pyjwt (>=2.8.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "zscaler-sdk-python"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.4.0"
|
|
4
4
|
description = "Official Python SDK for the Zscaler Products"
|
|
5
5
|
authors = ["Zscaler, Inc. <devrel@zscaler.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -28,9 +28,9 @@ packages = [
|
|
|
28
28
|
"Bug Tracker" = "https://github.com/zscaler/zscaler-sdk-python/issues"
|
|
29
29
|
|
|
30
30
|
[tool.poetry.dependencies]
|
|
31
|
-
python = ">=3.9,<4.0"
|
|
31
|
+
python = ">=3.9.2,<4.0"
|
|
32
32
|
requests = ">=2.32.3"
|
|
33
|
-
cryptography = ">=
|
|
33
|
+
cryptography = ">=45.0.2"
|
|
34
34
|
pyyaml = ">=6.0.0"
|
|
35
35
|
pytz = ">=2024.2"
|
|
36
36
|
python-box = ">=7.3.0"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class HTTPError(Exception):
|
|
2
|
+
def __init__(self, url, response_details, response_body):
|
|
3
|
+
self.status_code = response_details.status_code
|
|
4
|
+
self.url = url
|
|
5
|
+
self.response_headers = response_details.headers
|
|
6
|
+
self.message = f"HTTP {self.status_code} {response_body}"
|
|
7
|
+
super().__init__(self.message) # ✅ important
|
|
8
|
+
|
|
9
|
+
def __str__(self):
|
|
10
|
+
return self.message
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from zscaler.errors.http_error import HTTPError
|
|
4
|
+
from zscaler.errors.zscaler_api_error import ZscalerAPIError
|
|
5
|
+
from zscaler.exceptions import HTTPException, ZscalerAPIException
|
|
6
|
+
from zscaler.exceptions import exceptions
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
@staticmethod
|
|
11
|
+
def check_response_for_error(url, response_details, response_body):
|
|
12
|
+
"""
|
|
13
|
+
Checks HTTP response for errors in the response body.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
url (str): URL of the response
|
|
17
|
+
response_details (requests.Response): Response object with details
|
|
18
|
+
response_body (str): Response body in JSON or plain string
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
Tuple(dict or None, error or None)
|
|
22
|
+
"""
|
|
23
|
+
# Defensive check: if response_details is not a real HTTP response, skip
|
|
24
|
+
if not hasattr(response_details, "headers"):
|
|
25
|
+
logger.debug(f"[SKIP] check_response_for_error received non-Response object: {type(response_details)}")
|
|
26
|
+
return response_details, None
|
|
27
|
+
|
|
28
|
+
content_type = response_details.headers.get("Content-Type", "")
|
|
29
|
+
is_json = "application/json" in content_type
|
|
30
|
+
body_text = response_body if isinstance(response_body, str) else str(response_body)
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
formatted_response = json.loads(response_body) if is_json else response_body
|
|
34
|
+
except json.JSONDecodeError as e:
|
|
35
|
+
logger.warning(f"Non-JSON response from {url}: {body_text}")
|
|
36
|
+
if exceptions.raise_exception:
|
|
37
|
+
raise HTTPException(url, response_details, body_text)
|
|
38
|
+
return None, HTTPError(url, response_details, body_text)
|
|
39
|
+
|
|
40
|
+
# ✅ Only now we are confident it's safe to access .status_code
|
|
41
|
+
status_code = response_details.status_code
|
|
42
|
+
|
|
43
|
+
if 200 <= status_code < 300:
|
|
44
|
+
return formatted_response, None
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
error = ZscalerAPIError(url, response_details, formatted_response)
|
|
48
|
+
if exceptions.raise_exception:
|
|
49
|
+
raise ZscalerAPIException(error)
|
|
50
|
+
return None, error
|
|
51
|
+
|
|
52
|
+
except Exception as e:
|
|
53
|
+
logger.exception("Failed to construct ZscalerAPIError.")
|
|
54
|
+
generic_error = HTTPError(url, response_details, formatted_response)
|
|
55
|
+
if exceptions.raise_exception:
|
|
56
|
+
raise HTTPException(str(generic_error)) from e
|
|
57
|
+
return None, generic_error
|
|
@@ -1,50 +1,40 @@
|
|
|
1
|
-
from zscaler.errors.error import Error
|
|
2
1
|
import json
|
|
3
2
|
|
|
4
3
|
|
|
5
|
-
class ZscalerAPIError(
|
|
4
|
+
class ZscalerAPIError(Exception):
|
|
6
5
|
def __init__(self, url, response_details, response_body, service_type=""):
|
|
7
6
|
self.status_code = response_details.status_code
|
|
8
7
|
self.url = url
|
|
8
|
+
self.service_type = service_type.lower()
|
|
9
9
|
self.headers = response_details.headers
|
|
10
10
|
self.stack = ""
|
|
11
|
-
self.service_type = service_type.lower()
|
|
12
11
|
|
|
13
|
-
# Ensure response_body is a dict
|
|
14
12
|
if not isinstance(response_body, dict):
|
|
15
13
|
response_body = {"message": str(response_body)}
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
self.
|
|
19
|
-
self.
|
|
20
|
-
self.params = None
|
|
21
|
-
self.path = None
|
|
22
|
-
|
|
23
|
-
# Populate based on service type
|
|
24
|
-
if self.service_type == "zpa":
|
|
25
|
-
self.error_code = response_body.get("id")
|
|
26
|
-
self.error_message = response_body.get("reason")
|
|
27
|
-
self.params = response_body.get("params")
|
|
28
|
-
else: # default to ZIA/others
|
|
29
|
-
self.error_code = response_body.get("code") or response_body.get("id")
|
|
30
|
-
self.error_message = response_body.get("message") or response_body.get("reason")
|
|
31
|
-
|
|
32
|
-
self.params = self.params or []
|
|
15
|
+
self.error_code = response_body.get("code") or response_body.get("id")
|
|
16
|
+
self.error_message = response_body.get("message") or response_body.get("reason")
|
|
17
|
+
self.params = response_body.get("params", [])
|
|
33
18
|
self.path = response_body.get("path")
|
|
34
19
|
|
|
35
|
-
# Construct message string
|
|
36
20
|
message_parts = [f"HTTP {self.status_code}"]
|
|
37
21
|
if self.error_code:
|
|
38
|
-
message_parts.append(self.error_code)
|
|
22
|
+
message_parts.append(str(self.error_code))
|
|
39
23
|
if self.error_message:
|
|
40
24
|
message_parts.append(self.error_message)
|
|
41
25
|
if self.params:
|
|
42
26
|
message_parts.append(f"Parameters: {', '.join(self.params)}")
|
|
43
27
|
|
|
44
28
|
self.message = " ".join(message_parts)
|
|
29
|
+
super().__init__(self.message) # ✅ This is what makes it raise-able
|
|
45
30
|
|
|
46
31
|
def __str__(self):
|
|
47
|
-
error_payload = {
|
|
32
|
+
error_payload = {
|
|
33
|
+
"status": self.status_code,
|
|
34
|
+
"code": self.error_code,
|
|
35
|
+
"message": self.error_message,
|
|
36
|
+
"url": self.url,
|
|
37
|
+
}
|
|
48
38
|
if self.params:
|
|
49
39
|
error_payload["params"] = self.params
|
|
50
40
|
if self.path:
|
|
@@ -117,7 +117,14 @@ def to_snake_case(string):
|
|
|
117
117
|
"truncate_large_udpdns_response": "truncateLargeUDPDNSResponse",
|
|
118
118
|
"enableZCCRevert": "enable_zcc_revert",
|
|
119
119
|
"enableZiaDR": "enable_zia_dr",
|
|
120
|
-
"
|
|
120
|
+
"purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache",
|
|
121
|
+
|
|
122
|
+
# ZPA Edge Cases
|
|
123
|
+
"serverGroupDTOs": "server_group_dtos",
|
|
124
|
+
"extranetDTO": "extranet_dto",
|
|
125
|
+
"locationGroupDTO": "location_group_dto",
|
|
126
|
+
"locationDTO": "location_dto",
|
|
127
|
+
"predefinedADPControls": "predefined_adp_controls"
|
|
121
128
|
}
|
|
122
129
|
|
|
123
130
|
if string in FIELD_EXCEPTIONS:
|
|
@@ -242,7 +249,14 @@ def to_lower_camel_case(string):
|
|
|
242
249
|
"enable_zcc_revert": "enableZCCRevert",
|
|
243
250
|
"delete_dhcp_option121_routes": "deleteDHCPOption121Routes",
|
|
244
251
|
"enableZiaDR": "enable_zia_dr",
|
|
245
|
-
"purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache"
|
|
252
|
+
"purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache",
|
|
253
|
+
|
|
254
|
+
# ZPA Edge Cases
|
|
255
|
+
"server_group_dtos": "serverGroupDTOs",
|
|
256
|
+
"extranet_dto": "extranetDTO",
|
|
257
|
+
"location_group_dto": "locationGroupDTO",
|
|
258
|
+
"location_dto": "locationDTO",
|
|
259
|
+
"predefined_adp_controls": "predefinedADPControls"
|
|
246
260
|
}
|
|
247
261
|
|
|
248
262
|
if string in FIELD_EXCEPTIONS:
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import json
|
|
2
1
|
import requests
|
|
3
2
|
import logging
|
|
4
3
|
import os
|
|
5
4
|
import time
|
|
6
|
-
from zscaler.errors.http_error import HTTPError
|
|
7
|
-
from zscaler.errors.zscaler_api_error import ZscalerAPIError
|
|
8
|
-
from zscaler.exceptions import HTTPException, ZscalerAPIException
|
|
9
|
-
from http import HTTPStatus
|
|
10
5
|
from zscaler.logger import dump_request, dump_response
|
|
11
6
|
from zscaler.zcc.legacy import LegacyZCCClientHelper
|
|
12
7
|
from zscaler.ztw.legacy import LegacyZTWClientHelper
|
|
@@ -25,7 +20,7 @@ class HTTPClient:
|
|
|
25
20
|
Custom HTTP clients should inherit from this class.
|
|
26
21
|
"""
|
|
27
22
|
|
|
28
|
-
raise_exception = False
|
|
23
|
+
# raise_exception = False
|
|
29
24
|
|
|
30
25
|
def __init__(
|
|
31
26
|
self,
|
|
@@ -335,52 +330,6 @@ class HTTPClient:
|
|
|
335
330
|
# logger.error(f"Unexpected error during request execution: {error}")
|
|
336
331
|
return (None, error)
|
|
337
332
|
|
|
338
|
-
@staticmethod
|
|
339
|
-
def check_response_for_error(url, response_details, response_body):
|
|
340
|
-
"""
|
|
341
|
-
Checks HTTP response for errors in the response body.
|
|
342
|
-
|
|
343
|
-
Args:
|
|
344
|
-
url (str): URL of the response
|
|
345
|
-
response_details (requests.Response): Response object with details
|
|
346
|
-
response_body (str): Response body in JSON or plain string
|
|
347
|
-
|
|
348
|
-
Returns:
|
|
349
|
-
Tuple(dict or None, error or None)
|
|
350
|
-
"""
|
|
351
|
-
content_type = response_details.headers.get("Content-Type", "")
|
|
352
|
-
is_json = "application/json" in content_type
|
|
353
|
-
|
|
354
|
-
# Attempt to parse JSON safely
|
|
355
|
-
try:
|
|
356
|
-
formatted_response = json.loads(response_body) if is_json else response_body
|
|
357
|
-
except json.JSONDecodeError as e:
|
|
358
|
-
logger.error(f"Failed to parse JSON response: {e}")
|
|
359
|
-
if HTTPClient.raise_exception:
|
|
360
|
-
raise HTTPException(f"Invalid JSON response from {url}: {response_body}")
|
|
361
|
-
return None, HTTPError(url, response_details, response_body)
|
|
362
|
-
|
|
363
|
-
status_code = response_details.status_code
|
|
364
|
-
|
|
365
|
-
if 200 <= status_code < 300:
|
|
366
|
-
return formatted_response, None
|
|
367
|
-
|
|
368
|
-
# Defensive error handling block (minimal, correct)
|
|
369
|
-
try:
|
|
370
|
-
error = ZscalerAPIError(url, response_details, formatted_response)
|
|
371
|
-
# logger.debug(f"Raw API Error JSON: {json.dumps(formatted_response, indent=2)}")
|
|
372
|
-
if HTTPClient.raise_exception:
|
|
373
|
-
raise ZscalerAPIException(error)
|
|
374
|
-
return None, error
|
|
375
|
-
|
|
376
|
-
except Exception as e:
|
|
377
|
-
# Catch-all in case ZscalerAPIError constructor fails
|
|
378
|
-
logger.exception("Failed to construct ZscalerAPIError.")
|
|
379
|
-
generic_error = HTTPError(url, response_details, formatted_response)
|
|
380
|
-
if HTTPClient.raise_exception:
|
|
381
|
-
raise HTTPException(str(generic_error)) from e
|
|
382
|
-
return None, generic_error
|
|
383
|
-
|
|
384
333
|
@staticmethod
|
|
385
334
|
def format_binary_data(data):
|
|
386
335
|
"""Formats binary data for multipart uploads."""
|
|
@@ -7,6 +7,7 @@ from cryptography.hazmat.backends import default_backend
|
|
|
7
7
|
from cryptography.hazmat.primitives import serialization
|
|
8
8
|
from zscaler.user_agent import UserAgent
|
|
9
9
|
from zscaler.oneapi_http_client import HTTPClient
|
|
10
|
+
from zscaler.errors.response_checker import check_response_for_error
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
12
13
|
|
|
@@ -193,7 +194,7 @@ class OAuth:
|
|
|
193
194
|
response = self.authenticate()
|
|
194
195
|
|
|
195
196
|
# Check the response body for error messages using check_response_for_error
|
|
196
|
-
parsed_response, err =
|
|
197
|
+
parsed_response, err = check_response_for_error(response.url, response, response.text)
|
|
197
198
|
|
|
198
199
|
if err:
|
|
199
200
|
logging.error(f"Error during authentication: {err}")
|
|
@@ -8,13 +8,14 @@ from zscaler.user_agent import UserAgent
|
|
|
8
8
|
from zscaler.error_messages import ERROR_MESSAGE_429_MISSING_DATE_X_RESET
|
|
9
9
|
from http import HTTPStatus
|
|
10
10
|
from zscaler.helpers import convert_keys_to_snake_case, convert_keys_to_camel_case
|
|
11
|
+
from zscaler.errors.response_checker import check_response_for_error
|
|
12
|
+
from zscaler.exceptions import exceptions
|
|
11
13
|
from zscaler.zcc.legacy import LegacyZCCClientHelper
|
|
12
14
|
from zscaler.ztw.legacy import LegacyZTWClientHelper
|
|
13
15
|
from zscaler.zdx.legacy import LegacyZDXClientHelper
|
|
14
16
|
from zscaler.zpa.legacy import LegacyZPAClientHelper
|
|
15
17
|
from zscaler.zia.legacy import LegacyZIAClientHelper
|
|
16
18
|
from zscaler.zwa.legacy import LegacyZWAClientHelper
|
|
17
|
-
# from zscaler.logger import setup_logging # ✅ Import here
|
|
18
19
|
|
|
19
20
|
logger = logging.getLogger('zscaler-sdk-python')
|
|
20
21
|
|
|
@@ -118,7 +119,7 @@ class RequestExecutor:
|
|
|
118
119
|
zwa_legacy_client=self.zwa_legacy_client,
|
|
119
120
|
)
|
|
120
121
|
|
|
121
|
-
|
|
122
|
+
exceptions.raise_exception = self._config["client"].get("raiseException", False)
|
|
122
123
|
self._custom_headers = {}
|
|
123
124
|
|
|
124
125
|
def get_base_url(self, endpoint: str) -> str:
|
|
@@ -331,9 +332,6 @@ class RequestExecutor:
|
|
|
331
332
|
"""
|
|
332
333
|
try:
|
|
333
334
|
request, response, response_body, error = self.fire_request(request)
|
|
334
|
-
logger.debug(
|
|
335
|
-
f"[DEBUG] Got response: {response} (status: {getattr(response, 'status_code', 'N/A')}) | error: {error}"
|
|
336
|
-
)
|
|
337
335
|
except Exception as ex:
|
|
338
336
|
logger.error(f"Exception during HTTP request: {ex}")
|
|
339
337
|
return None, ex
|
|
@@ -354,7 +352,7 @@ class RequestExecutor:
|
|
|
354
352
|
return response, None
|
|
355
353
|
|
|
356
354
|
try:
|
|
357
|
-
response_data, error =
|
|
355
|
+
response_data, error = check_response_for_error(request["url"], response, response_body)
|
|
358
356
|
except Exception as ex:
|
|
359
357
|
logger.error(f"Exception while checking response for errors: {ex}")
|
|
360
358
|
return None, ex
|
|
@@ -463,33 +461,59 @@ class RequestExecutor:
|
|
|
463
461
|
request_start_time (float): Original start time of request.
|
|
464
462
|
|
|
465
463
|
Returns:
|
|
466
|
-
Tuple of request, response object, response body,
|
|
464
|
+
Tuple of (request, response object, response body, error).
|
|
467
465
|
"""
|
|
468
466
|
current_req_start_time = time.time()
|
|
469
467
|
max_retries = self._max_retries
|
|
470
468
|
req_timeout = self._request_timeout
|
|
471
469
|
|
|
470
|
+
# Check if total elapsed time exceeds the configured request timeout
|
|
472
471
|
if req_timeout > 0 and (current_req_start_time - request_start_time) > req_timeout:
|
|
473
472
|
logger.warning("Request Timeout exceeded.")
|
|
474
473
|
return None, None, None, Exception("Request Timeout exceeded.")
|
|
475
474
|
|
|
475
|
+
# Perform the actual HTTP request
|
|
476
476
|
response, error = self._http_client.send_request(request)
|
|
477
477
|
|
|
478
|
+
# If a low-level error occurred (network, request construction, etc.)
|
|
478
479
|
if error:
|
|
479
|
-
# logger.error(f"Error sending request: {error}")
|
|
480
480
|
return request, response, response.text if response else None, error
|
|
481
481
|
|
|
482
|
-
|
|
482
|
+
# Check for 401 -> Trigger re-auth if we still have retries left
|
|
483
|
+
if response.status_code == 401:
|
|
484
|
+
# We only want to attempt refreshing the token if we haven't hit max_retries
|
|
485
|
+
if attempts < max_retries:
|
|
486
|
+
logger.info("Got 401 response; clearing token and re-authenticating.")
|
|
487
|
+
self._oauth.clear_access_token()
|
|
488
|
+
|
|
489
|
+
try:
|
|
490
|
+
fresh_token = self._oauth._get_access_token()
|
|
491
|
+
except Exception as e:
|
|
492
|
+
# If re-auth fails, return immediately
|
|
493
|
+
logger.error(f"Token refresh failed after 401: {e}")
|
|
494
|
+
return request, response, response.text, e
|
|
495
|
+
|
|
496
|
+
# Update the request with the new token
|
|
497
|
+
request["headers"]["Authorization"] = f"Bearer {fresh_token}"
|
|
498
|
+
attempts += 1
|
|
499
|
+
return self.fire_request_helper(request, attempts, request_start_time)
|
|
500
|
+
else:
|
|
501
|
+
logger.error("401 Unauthorized - token refresh attempts exhausted.")
|
|
502
|
+
return request, response, response.text, Exception("401 Unauthorized - token refresh attempts exhausted.")
|
|
483
503
|
|
|
504
|
+
# Handle “retryable” statuses such as 429, 503, etc.
|
|
484
505
|
if attempts < max_retries and self.is_retryable_status(response.status_code):
|
|
485
|
-
backoff_seconds = self.get_retry_after(headers, logger)
|
|
506
|
+
backoff_seconds = self.get_retry_after(response.headers, logger)
|
|
486
507
|
if backoff_seconds is None:
|
|
487
508
|
return None, response, response.text, Exception(ERROR_MESSAGE_429_MISSING_DATE_X_RESET)
|
|
488
|
-
|
|
509
|
+
|
|
510
|
+
logger.info(f"Hit rate limit or retryable status {response.status_code}. "
|
|
511
|
+
f"Retrying request in {backoff_seconds} seconds.")
|
|
489
512
|
time.sleep(backoff_seconds)
|
|
490
513
|
attempts += 1
|
|
491
514
|
return self.fire_request_helper(request, attempts, request_start_time)
|
|
492
515
|
|
|
516
|
+
# If we reach here, no further retries; return whatever we got
|
|
493
517
|
return request, response, response.text, None
|
|
494
518
|
|
|
495
519
|
def is_retryable_status(self, status):
|
|
@@ -570,7 +594,13 @@ class RequestExecutor:
|
|
|
570
594
|
|
|
571
595
|
def get_retry_after(self, headers, logger):
|
|
572
596
|
retry_limit_reset_header = (
|
|
573
|
-
headers.get("x-ratelimit-reset") or
|
|
597
|
+
headers.get("x-ratelimit-reset") or
|
|
598
|
+
headers.get("X-RateLimit-Reset") or
|
|
599
|
+
headers.get("RateLimit-Reset") or
|
|
600
|
+
|
|
601
|
+
# ZCC Specific Rate Limiting Headers (LegacyZCCClientHelper)
|
|
602
|
+
headers.get("X-Rate-Limit-Retry-After-Seconds") or # ZCC /downloadDevices Rate Limiting Header (LegacyZCCClientHelper)
|
|
603
|
+
headers.get("X-Rate-Limit-Remaining") # (LegacyZCCClientHelper)
|
|
574
604
|
)
|
|
575
605
|
retry_after = headers.get("Retry-After") or headers.get("retry-after")
|
|
576
606
|
|