zscaler-sdk-python 1.3.0__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.3.0 → zscaler_sdk_python-1.4.0}/PKG-INFO +2 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/pyproject.toml +2 -2
- {zscaler_sdk_python-1.3.0 → 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.3.0 → zscaler_sdk_python-1.4.0}/zscaler/errors/zscaler_api_error.py +13 -23
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/exceptions/exceptions.py +1 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/helpers.py +16 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_http_client.py +1 -52
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_oauth_client.py +2 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/request_executor.py +11 -45
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/utils.py +125 -42
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/admin_user.py +7 -4
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/devices.py +24 -6
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/legacy.py +131 -45
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/secrets.py +1 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/bandwidth_control_rules.py +20 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall.py +77 -27
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/legacy.py +30 -35
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/url_categories.py +7 -6
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_protection.py +266 -180
- zscaler_sdk_python-1.3.0/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.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segments_inspection.py +83 -62
- {zscaler_sdk_python-1.3.0 → 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.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/legacy.py +38 -8
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connector_groups.py +15 -0
- {zscaler_sdk_python-1.3.0 → 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.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/common.py +4 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/policyset_controller_v2.py +6 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_console.py +0 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/segment_group.py +4 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/server_group.py +22 -3
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edge_groups.py +2 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/policies.py +896 -275
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/zpa_service.py +20 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/legacy.py +48 -40
- zscaler_sdk_python-1.3.0/zscaler/errors/http_error.py +0 -20
- zscaler_sdk_python-1.3.0/zscaler/zpa/models/app_protection.py +0 -317
- zscaler_sdk_python-1.3.0/zscaler/zpa/models/application_segment.py +0 -587
- zscaler_sdk_python-1.3.0/zscaler/zpa/models/application_segment_inspection.py +0 -173
- zscaler_sdk_python-1.3.0/zscaler/zpa/models/application_segment_pra.py +0 -211
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/LICENSE.md +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/README.md +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/api_client.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/cache.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/no_op_cache.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/zscaler_cache.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/config/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/config/config_setter.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/config/config_validator.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/constants.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/error_messages.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/errors/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/errors/error.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/exceptions/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/logger.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_client.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_collection.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_object.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_response.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ratelimiter/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ratelimiter/ratelimiter.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/user_agent.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/company.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/entitlements.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/fail_open_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/forwarding_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/admin_user.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/failopenpolicy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/forwardingprofile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/getcompanyinfo.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/manage_pass.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/secrets_otp.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/secrets_passwords.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/trustednetworks.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webappservice.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webpolicy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webprivacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_app_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_privacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/zcc_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/admin.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/alerts.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/apps.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/inventory.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/legacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/activeapplications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/administration.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/alerts.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/application_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/applications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/call_quality_metrics.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/software_inventory.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/zdx_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/activate.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/apptotal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/atp_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/audit_logs.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_applications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_dns.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_ips.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/device_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/end_user_notification.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/file_type_control_rule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/forwarding_control.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/gre_tunnel.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/iot_report.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/locations.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/malware_protection_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/activation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/advanced_threat_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/apptotal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_app_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/device_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/endusernotification.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/filetyperules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/forwarding_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_recommended_list.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_tunnel_info.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_tunnels.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_vips.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/iotreport.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/location_group.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/location_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/malware_protection_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/nss_servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/organization_information.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/pac_files.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/proxies.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/proxy_gatways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/remoteassistance.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/rule_labels.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/sandboxrules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/subclouds.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/system_audit.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/time_intervals.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_dc_exclusions.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/url_filtering_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/urlcategory.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/user_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/workload_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/nss_servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/organization_information.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/pac_files.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/policy_export.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/proxies.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/remote_assistance.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/rule_labels.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/sandbox.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/sandbox_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/sub_clouds.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/system_audit.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/time_intervals.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/url_filtering.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/user_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/workload_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/zia_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connectors.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segment_by_type.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_region.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/client_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/customer_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/emergency_access.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/enrollment_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/idp.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/lss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/machine_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/microtenants.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connectors.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/application_servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_region.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/client_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/customer_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/emergency_access.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/enrollment_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/idp.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/lss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/machine_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/microtenants.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_approval.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_credential.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_portal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/provisioning_keys.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/role_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/scim_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edges.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/trusted_network.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_approval.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_console.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_credential.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_credential_pool.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_portal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/provisioning.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/role_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/scim_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/segment_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/server_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edge_group.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edges.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/account_details.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/activation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/api_keys.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ec_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/location_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/location_template.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/activation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ec_group_vm.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ecgroup.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/location_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/location_templates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/nw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/zpa_resources.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/nw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ztw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/audit_logs.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/dlp_incidents.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/legacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/audit_logs.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/change_history.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/generated_tickets.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_details.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_evidence.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_group_search.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_search.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_trigger.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/zwa_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
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
|
|
@@ -23,7 +23,7 @@ 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"
|
|
@@ -30,7 +30,7 @@ packages = [
|
|
|
30
30
|
[tool.poetry.dependencies]
|
|
31
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,6 +8,8 @@ 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
|
|
@@ -117,7 +119,7 @@ class RequestExecutor:
|
|
|
117
119
|
zwa_legacy_client=self.zwa_legacy_client,
|
|
118
120
|
)
|
|
119
121
|
|
|
120
|
-
|
|
122
|
+
exceptions.raise_exception = self._config["client"].get("raiseException", False)
|
|
121
123
|
self._custom_headers = {}
|
|
122
124
|
|
|
123
125
|
def get_base_url(self, endpoint: str) -> str:
|
|
@@ -330,9 +332,6 @@ class RequestExecutor:
|
|
|
330
332
|
"""
|
|
331
333
|
try:
|
|
332
334
|
request, response, response_body, error = self.fire_request(request)
|
|
333
|
-
logger.debug(
|
|
334
|
-
f"[DEBUG] Got response: {response} (status: {getattr(response, 'status_code', 'N/A')}) | error: {error}"
|
|
335
|
-
)
|
|
336
335
|
except Exception as ex:
|
|
337
336
|
logger.error(f"Exception during HTTP request: {ex}")
|
|
338
337
|
return None, ex
|
|
@@ -353,7 +352,7 @@ class RequestExecutor:
|
|
|
353
352
|
return response, None
|
|
354
353
|
|
|
355
354
|
try:
|
|
356
|
-
response_data, error =
|
|
355
|
+
response_data, error = check_response_for_error(request["url"], response, response_body)
|
|
357
356
|
except Exception as ex:
|
|
358
357
|
logger.error(f"Exception while checking response for errors: {ex}")
|
|
359
358
|
return None, ex
|
|
@@ -517,45 +516,6 @@ class RequestExecutor:
|
|
|
517
516
|
# If we reach here, no further retries; return whatever we got
|
|
518
517
|
return request, response, response.text, None
|
|
519
518
|
|
|
520
|
-
# def fire_request_helper(self, request, attempts, request_start_time):
|
|
521
|
-
# """
|
|
522
|
-
# Helper method to perform HTTP call with retries if needed.
|
|
523
|
-
|
|
524
|
-
# Args:
|
|
525
|
-
# request (dict): HTTP request representation.
|
|
526
|
-
# attempts (int): Number of attempted HTTP calls so far.
|
|
527
|
-
# request_start_time (float): Original start time of request.
|
|
528
|
-
|
|
529
|
-
# Returns:
|
|
530
|
-
# Tuple of request, response object, response body, and error.
|
|
531
|
-
# """
|
|
532
|
-
# current_req_start_time = time.time()
|
|
533
|
-
# max_retries = self._max_retries
|
|
534
|
-
# req_timeout = self._request_timeout
|
|
535
|
-
|
|
536
|
-
# if req_timeout > 0 and (current_req_start_time - request_start_time) > req_timeout:
|
|
537
|
-
# logger.warning("Request Timeout exceeded.")
|
|
538
|
-
# return None, None, None, Exception("Request Timeout exceeded.")
|
|
539
|
-
|
|
540
|
-
# response, error = self._http_client.send_request(request)
|
|
541
|
-
|
|
542
|
-
# if error:
|
|
543
|
-
# # logger.error(f"Error sending request: {error}")
|
|
544
|
-
# return request, response, response.text if response else None, error
|
|
545
|
-
|
|
546
|
-
# headers = response.headers
|
|
547
|
-
|
|
548
|
-
# if attempts < max_retries and self.is_retryable_status(response.status_code):
|
|
549
|
-
# backoff_seconds = self.get_retry_after(headers, logger)
|
|
550
|
-
# if backoff_seconds is None:
|
|
551
|
-
# return None, response, response.text, Exception(ERROR_MESSAGE_429_MISSING_DATE_X_RESET)
|
|
552
|
-
# logger.info(f"Hit rate limit. Retrying request in {backoff_seconds} seconds.")
|
|
553
|
-
# time.sleep(backoff_seconds)
|
|
554
|
-
# attempts += 1
|
|
555
|
-
# return self.fire_request_helper(request, attempts, request_start_time)
|
|
556
|
-
|
|
557
|
-
# return request, response, response.text, None
|
|
558
|
-
|
|
559
519
|
def is_retryable_status(self, status):
|
|
560
520
|
"""
|
|
561
521
|
Checks if HTTP status is retryable.
|
|
@@ -634,7 +594,13 @@ class RequestExecutor:
|
|
|
634
594
|
|
|
635
595
|
def get_retry_after(self, headers, logger):
|
|
636
596
|
retry_limit_reset_header = (
|
|
637
|
-
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)
|
|
638
604
|
)
|
|
639
605
|
retry_after = headers.get("Retry-After") or headers.get("retry-after")
|
|
640
606
|
|
|
@@ -717,69 +717,144 @@ def format_url(base_string):
|
|
|
717
717
|
"""
|
|
718
718
|
return "".join([line.strip() for line in base_string.splitlines()])
|
|
719
719
|
|
|
720
|
+
# def zcc_param_mapper(func):
|
|
721
|
+
# @wraps(func)
|
|
722
|
+
# def wrapper(self, *args, **kwargs):
|
|
723
|
+
# query_params = kwargs.get("query_params", {}) or {}
|
|
724
|
+
# body = kwargs.copy()
|
|
725
|
+
# mapped_params = {}
|
|
726
|
+
|
|
727
|
+
# # -------------------------------
|
|
728
|
+
# # Detect source of raw inputs
|
|
729
|
+
# # -------------------------------
|
|
730
|
+
# raw_os = (
|
|
731
|
+
# query_params.get("os_type") or
|
|
732
|
+
# query_params.get("os_types") or
|
|
733
|
+
# body.get("os_type") or
|
|
734
|
+
# body.get("os_types")
|
|
735
|
+
# )
|
|
736
|
+
|
|
737
|
+
# if raw_os:
|
|
738
|
+
# raw_os = [raw_os] if isinstance(raw_os, str) else raw_os
|
|
739
|
+
# mapped = [
|
|
740
|
+
# str(zcc_param_map["os"].get(os.lower()))
|
|
741
|
+
# for os in raw_os
|
|
742
|
+
# if zcc_param_map["os"].get(os.lower())
|
|
743
|
+
# ]
|
|
744
|
+
# if not mapped:
|
|
745
|
+
# raise ValueError("Invalid `os_type` or `os_types` provided.")
|
|
746
|
+
# mapped_params["osTypes"] = ",".join(mapped)
|
|
747
|
+
|
|
748
|
+
# raw_reg = (
|
|
749
|
+
# query_params.get("registration_type") or
|
|
750
|
+
# query_params.get("registration_types") or
|
|
751
|
+
# body.get("registration_type") or
|
|
752
|
+
# body.get("registration_types")
|
|
753
|
+
# )
|
|
754
|
+
|
|
755
|
+
# if raw_reg:
|
|
756
|
+
# raw_reg = [raw_reg] if isinstance(raw_reg, str) else raw_reg
|
|
757
|
+
# mapped = [
|
|
758
|
+
# str(zcc_param_map["reg_type"].get(rt.lower()))
|
|
759
|
+
# for rt in raw_reg
|
|
760
|
+
# if zcc_param_map["reg_type"].get(rt.lower())
|
|
761
|
+
# ]
|
|
762
|
+
# if not mapped:
|
|
763
|
+
# raise ValueError("Invalid `registration_type(s)` provided.")
|
|
764
|
+
# mapped_params["registrationTypes"] = ",".join(mapped)
|
|
765
|
+
|
|
766
|
+
# # Clean aliases
|
|
767
|
+
# for key in [
|
|
768
|
+
# "os_type", "os_types",
|
|
769
|
+
# "registration_type", "registration_types",
|
|
770
|
+
# ]:
|
|
771
|
+
# query_params.pop(key, None)
|
|
772
|
+
# kwargs.pop(key, None)
|
|
773
|
+
|
|
774
|
+
# # Distribute to the appropriate location
|
|
775
|
+
# if "query_params" in kwargs:
|
|
776
|
+
# query_params.update(mapped_params)
|
|
777
|
+
# kwargs["query_params"] = query_params
|
|
778
|
+
# else:
|
|
779
|
+
# kwargs.update(mapped_params)
|
|
780
|
+
|
|
781
|
+
# return func(self, *args, **kwargs)
|
|
782
|
+
|
|
783
|
+
# return wrapper
|
|
784
|
+
|
|
720
785
|
def zcc_param_mapper(func):
|
|
721
786
|
@wraps(func)
|
|
722
787
|
def wrapper(self, *args, **kwargs):
|
|
723
788
|
query_params = kwargs.get("query_params", {}) or {}
|
|
789
|
+
body = kwargs.copy()
|
|
724
790
|
mapped_params = {}
|
|
725
791
|
|
|
726
|
-
#
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
if zcc_param_map["os"].get(os_type.lower())
|
|
736
|
-
]
|
|
737
|
-
if not mapped:
|
|
738
|
-
raise ValueError("Invalid `os_type` provided.")
|
|
739
|
-
mapped_params["osType"] = ",".join(mapped)
|
|
740
|
-
|
|
741
|
-
# Normalize and map os_types
|
|
742
|
-
if "device_type" in query_params:
|
|
743
|
-
os_raw = query_params["device_type"]
|
|
744
|
-
if isinstance(os_raw, str):
|
|
745
|
-
os_raw = [os_raw] # ✅ support single string value
|
|
792
|
+
# -------------------------------
|
|
793
|
+
# Detect source of raw inputs
|
|
794
|
+
# -------------------------------
|
|
795
|
+
raw_os = (
|
|
796
|
+
query_params.get("os_type") or
|
|
797
|
+
query_params.get("os_types") or
|
|
798
|
+
body.get("os_type") or
|
|
799
|
+
body.get("os_types")
|
|
800
|
+
)
|
|
746
801
|
|
|
802
|
+
if raw_os:
|
|
803
|
+
raw_os = [raw_os] if isinstance(raw_os, str) else raw_os
|
|
747
804
|
mapped = [
|
|
748
|
-
str(zcc_param_map["os"].get(
|
|
749
|
-
for
|
|
750
|
-
if zcc_param_map["os"].get(
|
|
805
|
+
str(zcc_param_map["os"].get(os.lower()))
|
|
806
|
+
for os in raw_os
|
|
807
|
+
if zcc_param_map["os"].get(os.lower())
|
|
751
808
|
]
|
|
752
809
|
if not mapped:
|
|
753
|
-
raise ValueError("Invalid `
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
810
|
+
raise ValueError("Invalid `os_type` or `os_types` provided.")
|
|
811
|
+
# Use singular key if original was singular, plural if original was plural
|
|
812
|
+
if "os_type" in query_params or "os_type" in body:
|
|
813
|
+
mapped_params["osType"] = ",".join(mapped)
|
|
814
|
+
else:
|
|
815
|
+
mapped_params["osTypes"] = ",".join(mapped)
|
|
816
|
+
|
|
817
|
+
raw_reg = (
|
|
818
|
+
query_params.get("registration_type") or
|
|
819
|
+
query_params.get("registration_types") or
|
|
820
|
+
body.get("registration_type") or
|
|
821
|
+
body.get("registration_types")
|
|
822
|
+
)
|
|
761
823
|
|
|
824
|
+
if raw_reg:
|
|
825
|
+
raw_reg = [raw_reg] if isinstance(raw_reg, str) else raw_reg
|
|
762
826
|
mapped = [
|
|
763
827
|
str(zcc_param_map["reg_type"].get(rt.lower()))
|
|
764
|
-
for rt in
|
|
828
|
+
for rt in raw_reg
|
|
765
829
|
if zcc_param_map["reg_type"].get(rt.lower())
|
|
766
830
|
]
|
|
767
831
|
if not mapped:
|
|
768
|
-
raise ValueError("Invalid `
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
832
|
+
raise ValueError("Invalid `registration_type(s)` provided.")
|
|
833
|
+
# Use singular key if original was singular, plural if original was plural
|
|
834
|
+
if "registration_type" in query_params or "registration_type" in body:
|
|
835
|
+
mapped_params["registrationType"] = ",".join(mapped)
|
|
836
|
+
else:
|
|
837
|
+
mapped_params["registrationTypes"] = ",".join(mapped)
|
|
838
|
+
|
|
839
|
+
# Clean aliases
|
|
840
|
+
for key in [
|
|
841
|
+
"os_type", "os_types",
|
|
842
|
+
"registration_type", "registration_types",
|
|
843
|
+
]:
|
|
844
|
+
query_params.pop(key, None)
|
|
845
|
+
kwargs.pop(key, None)
|
|
774
846
|
|
|
775
|
-
#
|
|
776
|
-
query_params
|
|
777
|
-
|
|
847
|
+
# Distribute to the appropriate location
|
|
848
|
+
if "query_params" in kwargs:
|
|
849
|
+
query_params.update(mapped_params)
|
|
850
|
+
kwargs["query_params"] = query_params
|
|
851
|
+
else:
|
|
852
|
+
kwargs.update(mapped_params)
|
|
778
853
|
|
|
779
854
|
return func(self, *args, **kwargs)
|
|
855
|
+
|
|
780
856
|
return wrapper
|
|
781
857
|
|
|
782
|
-
# Maps ZCC numeric os_type and registration_type arguments to a human-readable string
|
|
783
858
|
zcc_param_map = {
|
|
784
859
|
"os": {
|
|
785
860
|
"ios": 1,
|
|
@@ -798,6 +873,13 @@ zcc_param_map = {
|
|
|
798
873
|
},
|
|
799
874
|
}
|
|
800
875
|
|
|
876
|
+
class RateLimitExceededError(Exception):
|
|
877
|
+
def __init__(self, retry_at: datetime):
|
|
878
|
+
super().__init__(
|
|
879
|
+
f"/downloadDevices daily limit reached. Try again at {retry_at.isoformat()}."
|
|
880
|
+
)
|
|
881
|
+
self.retry_at = retry_at
|
|
882
|
+
|
|
801
883
|
|
|
802
884
|
def dump_request(logger, url: str, method: str, json, params, headers, request_uuid: str, body=True):
|
|
803
885
|
request_headers_filtered = {key: value for key, value in headers.items() if key != "Authorization"}
|
|
@@ -861,3 +943,4 @@ def dump_response(
|
|
|
861
943
|
log_lines.append(f"\n{response_body}")
|
|
862
944
|
log_lines.append("-" * 68)
|
|
863
945
|
logger.info("\n".join(log_lines))
|
|
946
|
+
|
|
@@ -44,9 +44,13 @@ class AdminUserAPI(APIClient):
|
|
|
44
44
|
Examples:
|
|
45
45
|
Prints all admins in the Client Connector Portal to the console:
|
|
46
46
|
|
|
47
|
-
>>>
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
>>> user_list, _, err = client.zcc.admin_user.list_admin_users()
|
|
48
|
+
>>> if err:
|
|
49
|
+
... print(f"Error listing admin users: {err}")
|
|
50
|
+
... return
|
|
51
|
+
... print(f"Total admin users found: {len(user_list)}")
|
|
52
|
+
... for user in user_list:
|
|
53
|
+
... print(user.as_dict())
|
|
50
54
|
"""
|
|
51
55
|
http_method = "get".upper()
|
|
52
56
|
api_url = format_url(
|
|
@@ -58,7 +62,6 @@ class AdminUserAPI(APIClient):
|
|
|
58
62
|
|
|
59
63
|
query_params = query_params or {}
|
|
60
64
|
|
|
61
|
-
# Prepare request body and headers
|
|
62
65
|
body = {}
|
|
63
66
|
headers = {}
|
|
64
67
|
|