zscaler-sdk-python 1.3.0__tar.gz → 1.4.1__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.1}/PKG-INFO +2 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/pyproject.toml +2 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/__init__.py +1 -1
- zscaler_sdk_python-1.4.1/zscaler/errors/http_error.py +10 -0
- zscaler_sdk_python-1.4.1/zscaler/errors/response_checker.py +57 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/errors/zscaler_api_error.py +13 -23
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/exceptions/exceptions.py +1 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/helpers.py +16 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/oneapi_http_client.py +1 -52
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/oneapi_oauth_client.py +2 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/request_executor.py +11 -45
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/utils.py +128 -43
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/admin_user.py +7 -4
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/devices.py +24 -6
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/legacy.py +131 -45
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/secrets.py +1 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/bandwidth_control_rules.py +20 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_firewall.py +77 -27
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/legacy.py +30 -35
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/url_categories.py +7 -6
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_protection.py +266 -180
- zscaler_sdk_python-1.3.0/zscaler/zpa/application_segment.py → zscaler_sdk_python-1.4.1/zscaler/zpa/app_segments_ba.py +91 -195
- zscaler_sdk_python-1.4.1/zscaler/zpa/app_segments_ba_v2.py +479 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_segments_inspection.py +83 -62
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_segments_pra.py +49 -41
- zscaler_sdk_python-1.4.1/zscaler/zpa/application_segment.py +939 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/legacy.py +38 -8
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/app_connector_groups.py +15 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/app_protection_predefined_controls.py +45 -8
- zscaler_sdk_python-1.4.1/zscaler/zpa/models/app_protection_profile.py +943 -0
- zscaler_sdk_python-1.4.1/zscaler/zpa/models/application_segment.py +1057 -0
- zscaler_sdk_python-1.4.1/zscaler/zpa/models/application_segment_lb.py +104 -0
- zscaler_sdk_python-1.4.1/zscaler/zpa/models/cbi_profile.py +560 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/common.py +4 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/policyset_controller_v2.py +6 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/pra_console.py +0 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/segment_group.py +4 -1
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/server_group.py +22 -3
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/service_edge_groups.py +2 -2
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/policies.py +896 -275
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/zpa_service.py +20 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/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/zpa/models/cbi_profile.py +0 -216
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/LICENSE.md +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/README.md +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/api_client.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/cache/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/cache/cache.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/cache/no_op_cache.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/cache/zscaler_cache.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/config/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/config/config_setter.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/config/config_validator.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/constants.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/error_messages.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/errors/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/errors/error.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/exceptions/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/logger.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/oneapi_client.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/oneapi_collection.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/oneapi_object.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/oneapi_response.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ratelimiter/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ratelimiter/ratelimiter.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/user_agent.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/company.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/entitlements.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/fail_open_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/forwarding_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/admin_user.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/failopenpolicy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/forwardingprofile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/getcompanyinfo.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/manage_pass.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/secrets_otp.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/secrets_passwords.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/trustednetworks.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/webappservice.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/webpolicy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/webprivacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/web_app_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/web_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/web_privacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zcc/zcc_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/admin.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/alerts.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/apps.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/inventory.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/legacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/activeapplications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/administration.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/alerts.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/application_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/applications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/call_quality_metrics.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/software_inventory.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/models/users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zdx/zdx_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/activate.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/apptotal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/atp_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/audit_logs.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_applications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_firewall_dns.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_firewall_ips.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/device_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/end_user_notification.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/file_type_control_rule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/forwarding_control.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/gre_tunnel.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/iot_report.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/locations.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/malware_protection_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/activation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/advanced_threat_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/alert_subscriptions.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/apptotal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_app_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/device_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/devices.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/endusernotification.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/filetyperules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/forwarding_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/gre_recommended_list.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/gre_tunnel_info.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/gre_tunnels.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/gre_vips.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/iotreport.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/location_group.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/location_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/malware_protection_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/nss_servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/organization_information.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/pac_files.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/proxies.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/proxy_gatways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/remoteassistance.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/rule_labels.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/sandboxrules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/subclouds.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/system_audit.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/time_intervals.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/traffic_dc_exclusions.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/url_filtering_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/urlcategory.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/user_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/workload_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/models/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/nat_control_policy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/nss_servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/organization_information.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/pac_files.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/policy_export.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/proxies.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/remote_assistance.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/rule_labels.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/sandbox.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/sandbox_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/sub_clouds.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/system_audit.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/time_intervals.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/url_filtering.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/user_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/workload_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/zia_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zia/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_connectors.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/app_segment_by_type.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/cbi_region.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/client_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/customer_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/emergency_access.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/enrollment_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/idp.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/lss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/machine_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/microtenants.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/administrator_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/app_connectors.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/application_servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/cbi_region.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/client_settings.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/customer_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/emergency_access.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/enrollment_certificates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/idp.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/lss.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/machine_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/microtenants.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/pra_approval.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/pra_credential.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/pra_portal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/provisioning_keys.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/role_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/scim_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/service_edges.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/models/trusted_network.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/pra_approval.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/pra_console.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/pra_credential.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/pra_credential_pool.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/pra_portal.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/provisioning.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/role_controller.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/scim_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/segment_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/server_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/servers.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/service_edge_group.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/service_edges.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zpa/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/account_details.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/activation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/api_keys.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/ec_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/ip_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/location_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/location_template.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/activation.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/ec_group_vm.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/ecgroup.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/ip_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/location_management.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/location_templates.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/nw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/models/zpa_resources.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/nw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/ztw/ztw_service.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/__init__.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/audit_logs.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/dlp_incidents.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/legacy.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/audit_logs.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/change_history.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/common.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/generated_tickets.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/incident_details.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/incident_evidence.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/incident_group_search.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/incident_search.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/zscaler/zwa/models/incident_trigger.py +0 -0
- {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.1}/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.1
|
|
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.1"
|
|
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
|
|
|
@@ -51,7 +51,6 @@ reformat_params = [
|
|
|
51
51
|
("excluded_departments", "excludedDepartments"),
|
|
52
52
|
("excluded_groups", "excludedGroups"),
|
|
53
53
|
("excluded_users", "excludedUsers"),
|
|
54
|
-
("source_ip_groups", "source_ip_groups"),
|
|
55
54
|
("dest_ip_groups", "destIpGroups"),
|
|
56
55
|
("dest_ipv6_groups", "destIpv6Groups"),
|
|
57
56
|
("groups", "groups"),
|
|
@@ -62,6 +61,9 @@ reformat_params = [
|
|
|
62
61
|
("location_groups", "locationGroups"),
|
|
63
62
|
("nw_application_groups", "nwApplicationGroups"),
|
|
64
63
|
("nw_service_groups", "nwServiceGroups"),
|
|
64
|
+
("nw_services", "nwServices"),
|
|
65
|
+
("source_ip_groups", "source_ip_groups"),
|
|
66
|
+
("source_ip_groups", "sourceIpGroups"),
|
|
65
67
|
("src_ip_groups", "srcIpGroups"),
|
|
66
68
|
("src_ipv6_groups", "srcIpv6Groups"),
|
|
67
69
|
("proxy_gateway", "proxyGateway"),
|
|
@@ -717,69 +719,144 @@ def format_url(base_string):
|
|
|
717
719
|
"""
|
|
718
720
|
return "".join([line.strip() for line in base_string.splitlines()])
|
|
719
721
|
|
|
722
|
+
# def zcc_param_mapper(func):
|
|
723
|
+
# @wraps(func)
|
|
724
|
+
# def wrapper(self, *args, **kwargs):
|
|
725
|
+
# query_params = kwargs.get("query_params", {}) or {}
|
|
726
|
+
# body = kwargs.copy()
|
|
727
|
+
# mapped_params = {}
|
|
728
|
+
|
|
729
|
+
# # -------------------------------
|
|
730
|
+
# # Detect source of raw inputs
|
|
731
|
+
# # -------------------------------
|
|
732
|
+
# raw_os = (
|
|
733
|
+
# query_params.get("os_type") or
|
|
734
|
+
# query_params.get("os_types") or
|
|
735
|
+
# body.get("os_type") or
|
|
736
|
+
# body.get("os_types")
|
|
737
|
+
# )
|
|
738
|
+
|
|
739
|
+
# if raw_os:
|
|
740
|
+
# raw_os = [raw_os] if isinstance(raw_os, str) else raw_os
|
|
741
|
+
# mapped = [
|
|
742
|
+
# str(zcc_param_map["os"].get(os.lower()))
|
|
743
|
+
# for os in raw_os
|
|
744
|
+
# if zcc_param_map["os"].get(os.lower())
|
|
745
|
+
# ]
|
|
746
|
+
# if not mapped:
|
|
747
|
+
# raise ValueError("Invalid `os_type` or `os_types` provided.")
|
|
748
|
+
# mapped_params["osTypes"] = ",".join(mapped)
|
|
749
|
+
|
|
750
|
+
# raw_reg = (
|
|
751
|
+
# query_params.get("registration_type") or
|
|
752
|
+
# query_params.get("registration_types") or
|
|
753
|
+
# body.get("registration_type") or
|
|
754
|
+
# body.get("registration_types")
|
|
755
|
+
# )
|
|
756
|
+
|
|
757
|
+
# if raw_reg:
|
|
758
|
+
# raw_reg = [raw_reg] if isinstance(raw_reg, str) else raw_reg
|
|
759
|
+
# mapped = [
|
|
760
|
+
# str(zcc_param_map["reg_type"].get(rt.lower()))
|
|
761
|
+
# for rt in raw_reg
|
|
762
|
+
# if zcc_param_map["reg_type"].get(rt.lower())
|
|
763
|
+
# ]
|
|
764
|
+
# if not mapped:
|
|
765
|
+
# raise ValueError("Invalid `registration_type(s)` provided.")
|
|
766
|
+
# mapped_params["registrationTypes"] = ",".join(mapped)
|
|
767
|
+
|
|
768
|
+
# # Clean aliases
|
|
769
|
+
# for key in [
|
|
770
|
+
# "os_type", "os_types",
|
|
771
|
+
# "registration_type", "registration_types",
|
|
772
|
+
# ]:
|
|
773
|
+
# query_params.pop(key, None)
|
|
774
|
+
# kwargs.pop(key, None)
|
|
775
|
+
|
|
776
|
+
# # Distribute to the appropriate location
|
|
777
|
+
# if "query_params" in kwargs:
|
|
778
|
+
# query_params.update(mapped_params)
|
|
779
|
+
# kwargs["query_params"] = query_params
|
|
780
|
+
# else:
|
|
781
|
+
# kwargs.update(mapped_params)
|
|
782
|
+
|
|
783
|
+
# return func(self, *args, **kwargs)
|
|
784
|
+
|
|
785
|
+
# return wrapper
|
|
786
|
+
|
|
720
787
|
def zcc_param_mapper(func):
|
|
721
788
|
@wraps(func)
|
|
722
789
|
def wrapper(self, *args, **kwargs):
|
|
723
790
|
query_params = kwargs.get("query_params", {}) or {}
|
|
791
|
+
body = kwargs.copy()
|
|
724
792
|
mapped_params = {}
|
|
725
793
|
|
|
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
|
|
794
|
+
# -------------------------------
|
|
795
|
+
# Detect source of raw inputs
|
|
796
|
+
# -------------------------------
|
|
797
|
+
raw_os = (
|
|
798
|
+
query_params.get("os_type") or
|
|
799
|
+
query_params.get("os_types") or
|
|
800
|
+
body.get("os_type") or
|
|
801
|
+
body.get("os_types")
|
|
802
|
+
)
|
|
746
803
|
|
|
804
|
+
if raw_os:
|
|
805
|
+
raw_os = [raw_os] if isinstance(raw_os, str) else raw_os
|
|
747
806
|
mapped = [
|
|
748
|
-
str(zcc_param_map["os"].get(
|
|
749
|
-
for
|
|
750
|
-
if zcc_param_map["os"].get(
|
|
807
|
+
str(zcc_param_map["os"].get(os.lower()))
|
|
808
|
+
for os in raw_os
|
|
809
|
+
if zcc_param_map["os"].get(os.lower())
|
|
751
810
|
]
|
|
752
811
|
if not mapped:
|
|
753
|
-
raise ValueError("Invalid `
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
812
|
+
raise ValueError("Invalid `os_type` or `os_types` provided.")
|
|
813
|
+
# Use singular key if original was singular, plural if original was plural
|
|
814
|
+
if "os_type" in query_params or "os_type" in body:
|
|
815
|
+
mapped_params["osType"] = ",".join(mapped)
|
|
816
|
+
else:
|
|
817
|
+
mapped_params["osTypes"] = ",".join(mapped)
|
|
818
|
+
|
|
819
|
+
raw_reg = (
|
|
820
|
+
query_params.get("registration_type") or
|
|
821
|
+
query_params.get("registration_types") or
|
|
822
|
+
body.get("registration_type") or
|
|
823
|
+
body.get("registration_types")
|
|
824
|
+
)
|
|
761
825
|
|
|
826
|
+
if raw_reg:
|
|
827
|
+
raw_reg = [raw_reg] if isinstance(raw_reg, str) else raw_reg
|
|
762
828
|
mapped = [
|
|
763
829
|
str(zcc_param_map["reg_type"].get(rt.lower()))
|
|
764
|
-
for rt in
|
|
830
|
+
for rt in raw_reg
|
|
765
831
|
if zcc_param_map["reg_type"].get(rt.lower())
|
|
766
832
|
]
|
|
767
833
|
if not mapped:
|
|
768
|
-
raise ValueError("Invalid `
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
834
|
+
raise ValueError("Invalid `registration_type(s)` provided.")
|
|
835
|
+
# Use singular key if original was singular, plural if original was plural
|
|
836
|
+
if "registration_type" in query_params or "registration_type" in body:
|
|
837
|
+
mapped_params["registrationType"] = ",".join(mapped)
|
|
838
|
+
else:
|
|
839
|
+
mapped_params["registrationTypes"] = ",".join(mapped)
|
|
840
|
+
|
|
841
|
+
# Clean aliases
|
|
842
|
+
for key in [
|
|
843
|
+
"os_type", "os_types",
|
|
844
|
+
"registration_type", "registration_types",
|
|
845
|
+
]:
|
|
846
|
+
query_params.pop(key, None)
|
|
847
|
+
kwargs.pop(key, None)
|
|
774
848
|
|
|
775
|
-
#
|
|
776
|
-
query_params
|
|
777
|
-
|
|
849
|
+
# Distribute to the appropriate location
|
|
850
|
+
if "query_params" in kwargs:
|
|
851
|
+
query_params.update(mapped_params)
|
|
852
|
+
kwargs["query_params"] = query_params
|
|
853
|
+
else:
|
|
854
|
+
kwargs.update(mapped_params)
|
|
778
855
|
|
|
779
856
|
return func(self, *args, **kwargs)
|
|
857
|
+
|
|
780
858
|
return wrapper
|
|
781
859
|
|
|
782
|
-
# Maps ZCC numeric os_type and registration_type arguments to a human-readable string
|
|
783
860
|
zcc_param_map = {
|
|
784
861
|
"os": {
|
|
785
862
|
"ios": 1,
|
|
@@ -798,6 +875,13 @@ zcc_param_map = {
|
|
|
798
875
|
},
|
|
799
876
|
}
|
|
800
877
|
|
|
878
|
+
class RateLimitExceededError(Exception):
|
|
879
|
+
def __init__(self, retry_at: datetime):
|
|
880
|
+
super().__init__(
|
|
881
|
+
f"/downloadDevices daily limit reached. Try again at {retry_at.isoformat()}."
|
|
882
|
+
)
|
|
883
|
+
self.retry_at = retry_at
|
|
884
|
+
|
|
801
885
|
|
|
802
886
|
def dump_request(logger, url: str, method: str, json, params, headers, request_uuid: str, body=True):
|
|
803
887
|
request_headers_filtered = {key: value for key, value in headers.items() if key != "Authorization"}
|
|
@@ -861,3 +945,4 @@ def dump_response(
|
|
|
861
945
|
log_lines.append(f"\n{response_body}")
|
|
862
946
|
log_lines.append("-" * 68)
|
|
863
947
|
logger.info("\n".join(log_lines))
|
|
948
|
+
|
|
@@ -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
|
|