zscaler-sdk-python 1.1.0__tar.gz → 1.2.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.1.0 → zscaler_sdk_python-1.2.1}/PKG-INFO +24 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/README.md +23 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/pyproject.toml +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/__init__.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/constants.py +1 -1
- zscaler_sdk_python-1.2.1/zscaler/errors/zscaler_api_error.py +55 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/exceptions/exceptions.py +4 -20
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/logger.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_http_client.py +36 -42
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_object.py +7 -21
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_response.py +134 -29
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/request_executor.py +15 -9
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/utils.py +3 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/alert_subscriptions.py +70 -35
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/bandwidth_classes.py +32 -26
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall_dns.py +34 -16
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall_ips.py +33 -16
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall_rules.py +51 -27
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dns_gatways.py +68 -12
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/ftp_control_policy.py +14 -21
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/legacy.py +24 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/admin_roles.py +4 -4
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/advanced_settings.py +1 -2
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/alert_subscriptions.py +2 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/bandwidth_control_rules.py +1 -13
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_rules.py +1 -0
- zscaler_sdk_python-1.2.1/zscaler/zia/models/nat_control_policy.py +224 -0
- zscaler_sdk_python-1.2.1/zscaler/zia/models/nss_servers.py +63 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/proxies.py +0 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_dc_exclusions.py +6 -12
- zscaler_sdk_python-1.2.1/zscaler/zia/nat_control_policy.py +371 -0
- zscaler_sdk_python-1.2.1/zscaler/zia/nss_servers.py +304 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/proxies.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/sandbox_rules.py +55 -24
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/ssl_inspection_rules.py +9 -6
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/time_intervals.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_datacenters.py +16 -14
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/url_filtering.py +55 -41
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/zia_service.py +20 -0
- zscaler_sdk_python-1.2.1/zscaler/zpa/administrator_controller.py +295 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/application_segment.py +1 -1
- zscaler_sdk_python-1.2.1/zscaler/zpa/client_settings.py +209 -0
- zscaler_sdk_python-1.2.1/zscaler/zpa/customer_controller.py +153 -0
- zscaler_sdk_python-1.2.1/zscaler/zpa/enrollment_certificates.py +320 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/legacy.py +34 -4
- zscaler_sdk_python-1.2.1/zscaler/zpa/models/administrator_controller.py +181 -0
- zscaler_sdk_python-1.2.1/zscaler/zpa/models/client_settings.py +87 -0
- zscaler_sdk_python-1.2.1/zscaler/zpa/models/customer_controller.py +139 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/enrollment_certificates.py +13 -6
- zscaler_sdk_python-1.2.1/zscaler/zpa/models/role_controller.py +427 -0
- zscaler_sdk_python-1.2.1/zscaler/zpa/role_controller.py +285 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/saml_attributes.py +134 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/segment_groups.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/zpa_service.py +34 -4
- zscaler_sdk_python-1.1.0/zscaler/errors/zscaler_api_error.py +0 -28
- zscaler_sdk_python-1.1.0/zscaler/zpa/authdomains.py +0 -72
- zscaler_sdk_python-1.1.0/zscaler/zpa/enrollment_certificates.py +0 -140
- zscaler_sdk_python-1.1.0/zscaler/zpa/models/auth_domain.py +0 -37
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/LICENSE.md +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/api_client.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/cache.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/no_op_cache.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/zscaler_cache.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/config/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/config/config_setter.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/config/config_validator.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/error_messages.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/errors/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/errors/error.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/errors/http_error.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/exceptions/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/helpers.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_client.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_collection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_oauth_client.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ratelimiter/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ratelimiter/ratelimiter.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/user_agent.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/admin_user.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/company.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/entitlements.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/fail_open_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/forwarding_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/manage_pass.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/admin_user.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/failopenpolicy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/forwardingprofile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/manage_pass.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/secrets_otp.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/secrets_passwords.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/trustednetworks.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/webappservice.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/webpolicy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/webprivacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/secrets.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/web_app_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/web_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/web_privacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/zcc_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/admin.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/alerts.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/apps.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/inventory.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/activeapplications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/administration.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/alerts.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/application_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/applications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/call_quality_metrics.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/software_inventory.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/zdx_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/activate.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/apptotal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/atp_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/audit_logs.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_applications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_apps.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/device_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/end_user_notification.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/file_type_control_rule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/forwarding_control.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/gre_tunnel.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/iot_report.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/locations.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/malware_protection_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/activation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/advanced_threat_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/apptotal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_app_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/device_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/endusernotification.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/filetyperules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/forwarding_control_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_recommended_list.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_tunnel_info.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_tunnels.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_vips.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/iotreport.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/location_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/location_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/malware_protection_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/organization_information.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/pac_files.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/proxy_gatways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/remoteassistance.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/rule_labels.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/sandboxrules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/subclouds.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/system_audit.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/time_intervals.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/url_filtering_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/urlcategory.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/user_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/workload_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/organization_information.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/pac_files.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/policy_export.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/remote_assistance.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/rule_labels.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/sandbox.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/sub_clouds.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/system_audit.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/url_categories.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/user_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/workload_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_connectors.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_protection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_segment_by_type.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_segments_inspection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_segments_pra.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_region.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/emergency_access.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/idp.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/lss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/machine_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/microtenants.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_connectors.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_protection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_protection_predefined_controls.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_segment.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_segment_inspection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_segment_pra.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_servers.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_region.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/emergency_access.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/idp.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/lss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/machine_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/microtenants.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/policyset_controller_v2.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_approval.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_console.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_credential.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_portal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/provisioning_keys.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/scim_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/segment_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/server_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/service_edge_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/service_edges.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/trusted_network.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/policies.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_approval.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_console.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_credential.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_credential_pool.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_portal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/provisioning.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/scim_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/server_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/servers.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/service_edge_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/service_edges.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/account_details.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/activation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/api_keys.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ec_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ip_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/location_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/location_template.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/activation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ec_group_vm.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ecgroup.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ip_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/location_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/location_templates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/nw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/zpa_resources.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/nw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ztw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/audit_logs.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/dlp_incidents.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/audit_logs.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/change_history.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/generated_tickets.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_details.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_evidence.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_group_search.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_search.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_trigger.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.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.1
|
|
3
|
+
Version: 1.2.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
|
|
@@ -620,6 +620,29 @@ You should now see logs in your console. Notice that API Credentials i.e `client
|
|
|
620
620
|
|
|
621
621
|
What it being logged? `requests`, `responses`, `http errors`, `caching responses`.
|
|
622
622
|
|
|
623
|
+
### Using Your Own Logger (Optional)
|
|
624
|
+
If your script defines its own logging configuration (e.g., for file or custom formatting), the SDK will not interfere with it. You can continue using your own logger like this:
|
|
625
|
+
|
|
626
|
+
```py
|
|
627
|
+
import logging
|
|
628
|
+
|
|
629
|
+
my_logger = logging.getLogger("my_app_logger")
|
|
630
|
+
my_logger.setLevel(logging.INFO)
|
|
631
|
+
handler = logging.StreamHandler()
|
|
632
|
+
handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
|
|
633
|
+
my_logger.addHandler(handler)
|
|
634
|
+
|
|
635
|
+
my_logger.info("This is your app-level log, independent from the SDK.")
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
To control SDK logging separately, use:
|
|
639
|
+
|
|
640
|
+
```py
|
|
641
|
+
logging.getLogger("zscaler-sdk-python").setLevel(logging.WARNING) # or .ERROR to silence SDK logs
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
The SDK will never globally disable logging or interfere with your existing logging configuration.
|
|
645
|
+
|
|
623
646
|
## Configuration reference
|
|
624
647
|
|
|
625
648
|
This library looks for configuration in the following sources:
|
|
@@ -581,6 +581,29 @@ You should now see logs in your console. Notice that API Credentials i.e `client
|
|
|
581
581
|
|
|
582
582
|
What it being logged? `requests`, `responses`, `http errors`, `caching responses`.
|
|
583
583
|
|
|
584
|
+
### Using Your Own Logger (Optional)
|
|
585
|
+
If your script defines its own logging configuration (e.g., for file or custom formatting), the SDK will not interfere with it. You can continue using your own logger like this:
|
|
586
|
+
|
|
587
|
+
```py
|
|
588
|
+
import logging
|
|
589
|
+
|
|
590
|
+
my_logger = logging.getLogger("my_app_logger")
|
|
591
|
+
my_logger.setLevel(logging.INFO)
|
|
592
|
+
handler = logging.StreamHandler()
|
|
593
|
+
handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
|
|
594
|
+
my_logger.addHandler(handler)
|
|
595
|
+
|
|
596
|
+
my_logger.info("This is your app-level log, independent from the SDK.")
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
To control SDK logging separately, use:
|
|
600
|
+
|
|
601
|
+
```py
|
|
602
|
+
logging.getLogger("zscaler-sdk-python").setLevel(logging.WARNING) # or .ERROR to silence SDK logs
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
The SDK will never globally disable logging or interfere with your existing logging configuration.
|
|
606
|
+
|
|
584
607
|
## Configuration reference
|
|
585
608
|
|
|
586
609
|
This library looks for configuration in the following sources:
|
|
@@ -15,7 +15,7 @@ ZPA_BASE_URLS = {
|
|
|
15
15
|
DEV_AUTH_URL = "https://authn1.dev.zpath.net/authn/v1/oauth/token"
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
RETRYABLE_STATUS_CODES = {409, 412, 429, 500, 502, 503, 504}
|
|
18
|
+
RETRYABLE_STATUS_CODES = {408, 409, 412, 429, 500, 502, 503, 504}
|
|
19
19
|
MAX_RETRIES = 5
|
|
20
20
|
BACKOFF_FACTOR = 1
|
|
21
21
|
BACKOFF_BASE_DURATION = 2
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from zscaler.errors.error import Error
|
|
2
|
+
import json
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ZscalerAPIError(Error):
|
|
6
|
+
def __init__(self, url, response_details, response_body, service_type=""):
|
|
7
|
+
self.status_code = response_details.status_code
|
|
8
|
+
self.url = url
|
|
9
|
+
self.headers = response_details.headers
|
|
10
|
+
self.stack = ""
|
|
11
|
+
self.service_type = service_type.lower()
|
|
12
|
+
|
|
13
|
+
# Ensure response_body is a dict
|
|
14
|
+
if not isinstance(response_body, dict):
|
|
15
|
+
response_body = {"message": str(response_body)}
|
|
16
|
+
|
|
17
|
+
# Initialize fields
|
|
18
|
+
self.error_code = None
|
|
19
|
+
self.error_message = None
|
|
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 []
|
|
33
|
+
self.path = response_body.get("path")
|
|
34
|
+
|
|
35
|
+
# Construct message string
|
|
36
|
+
message_parts = [f"HTTP {self.status_code}"]
|
|
37
|
+
if self.error_code:
|
|
38
|
+
message_parts.append(self.error_code)
|
|
39
|
+
if self.error_message:
|
|
40
|
+
message_parts.append(self.error_message)
|
|
41
|
+
if self.params:
|
|
42
|
+
message_parts.append(f"Parameters: {', '.join(self.params)}")
|
|
43
|
+
|
|
44
|
+
self.message = " ".join(message_parts)
|
|
45
|
+
|
|
46
|
+
def __str__(self):
|
|
47
|
+
error_payload = {"status": self.status_code, "code": self.error_code, "message": self.error_message, "url": self.url}
|
|
48
|
+
if self.params:
|
|
49
|
+
error_payload["params"] = self.params
|
|
50
|
+
if self.path:
|
|
51
|
+
error_payload["path"] = self.path
|
|
52
|
+
return json.dumps(error_payload, indent=2)
|
|
53
|
+
|
|
54
|
+
def __repr__(self):
|
|
55
|
+
return self.__str__()
|
|
@@ -21,10 +21,12 @@ class HTTPException(ZscalerBaseException):
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class ZscalerAPIException(ZscalerBaseException):
|
|
24
|
-
|
|
24
|
+
def __init__(self, error):
|
|
25
|
+
# error is a ZscalerAPIError
|
|
26
|
+
super().__init__(error.url, error, error.message)
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
#
|
|
29
|
+
# Other exceptions (unchanged)
|
|
28
30
|
class ZpaBaseException(Exception):
|
|
29
31
|
pass
|
|
30
32
|
|
|
@@ -34,26 +36,18 @@ class ZpaAPIException(ZpaBaseException):
|
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
class RateLimitExceededError(Exception):
|
|
37
|
-
"""Raised when the API rate limit is exceeded."""
|
|
38
|
-
|
|
39
39
|
pass
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
class RetryLimitExceededError(Exception):
|
|
43
|
-
"""Raised when the maximum number of retries is exceeded."""
|
|
44
|
-
|
|
45
43
|
pass
|
|
46
44
|
|
|
47
45
|
|
|
48
46
|
class CacheError(Exception):
|
|
49
|
-
"""Raised for errors related to caching operations."""
|
|
50
|
-
|
|
51
47
|
pass
|
|
52
48
|
|
|
53
49
|
|
|
54
50
|
class BadRequestError(Exception):
|
|
55
|
-
"""Raised when the API responds with a 400 status code."""
|
|
56
|
-
|
|
57
51
|
pass
|
|
58
52
|
|
|
59
53
|
|
|
@@ -70,32 +64,22 @@ class NotFoundError(Exception):
|
|
|
70
64
|
|
|
71
65
|
|
|
72
66
|
class APIClientError(Exception):
|
|
73
|
-
"""General exception related to the API client operations."""
|
|
74
|
-
|
|
75
67
|
pass
|
|
76
68
|
|
|
77
69
|
|
|
78
70
|
class InvalidCloudEnvironmentError(Exception):
|
|
79
|
-
"""Raised when an unrecognized cloud environment is specified."""
|
|
80
|
-
|
|
81
71
|
def __init__(self, cloud: str):
|
|
82
72
|
self.cloud = cloud
|
|
83
73
|
super().__init__(f"Unrecognized cloud environment: {self.cloud}")
|
|
84
74
|
|
|
85
75
|
|
|
86
76
|
class TokenExpirationError(Exception):
|
|
87
|
-
"""Raised when the authentication token has expired."""
|
|
88
|
-
|
|
89
77
|
pass
|
|
90
78
|
|
|
91
79
|
|
|
92
80
|
class TokenRefreshError(Exception):
|
|
93
|
-
"""Raised when there's an issue refreshing the authentication token."""
|
|
94
|
-
|
|
95
81
|
pass
|
|
96
82
|
|
|
97
83
|
|
|
98
84
|
class HeaderUpdateError(Exception):
|
|
99
|
-
"""Raised if there's a problem updating the session headers."""
|
|
100
|
-
|
|
101
85
|
pass
|
|
@@ -286,7 +286,7 @@ class HTTPClient:
|
|
|
286
286
|
)
|
|
287
287
|
|
|
288
288
|
else:
|
|
289
|
-
#
|
|
289
|
+
# Standard session
|
|
290
290
|
if self._session:
|
|
291
291
|
logger.debug("Request with re-usable session.")
|
|
292
292
|
response = self._session.request(**params)
|
|
@@ -294,11 +294,9 @@ class HTTPClient:
|
|
|
294
294
|
logger.debug("Request without re-usable session.")
|
|
295
295
|
response = requests.request(**params)
|
|
296
296
|
|
|
297
|
-
if response is None
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
logger.error(error_msg)
|
|
301
|
-
return (None, ValueError(error_msg))
|
|
297
|
+
if response is None:
|
|
298
|
+
logger.error("Request execution failed. Response is None.")
|
|
299
|
+
return (None, ValueError("No response received."))
|
|
302
300
|
|
|
303
301
|
dump_request(
|
|
304
302
|
logger,
|
|
@@ -324,7 +322,7 @@ class HTTPClient:
|
|
|
324
322
|
request["uuid"],
|
|
325
323
|
start_time,
|
|
326
324
|
)
|
|
327
|
-
# Return
|
|
325
|
+
# Return response and None even for 4xx/5xx – let check_response_for_error() decide
|
|
328
326
|
return (response, None)
|
|
329
327
|
|
|
330
328
|
except (requests.RequestException, requests.Timeout) as error:
|
|
@@ -334,7 +332,7 @@ class HTTPClient:
|
|
|
334
332
|
|
|
335
333
|
except Exception as error:
|
|
336
334
|
# Unexpected errors
|
|
337
|
-
logger.error(f"Unexpected error during request execution: {error}")
|
|
335
|
+
# logger.error(f"Unexpected error during request execution: {error}")
|
|
338
336
|
return (None, error)
|
|
339
337
|
|
|
340
338
|
@staticmethod
|
|
@@ -345,47 +343,43 @@ class HTTPClient:
|
|
|
345
343
|
Args:
|
|
346
344
|
url (str): URL of the response
|
|
347
345
|
response_details (requests.Response): Response object with details
|
|
348
|
-
response_body (str): Response body in JSON
|
|
346
|
+
response_body (str): Response body in JSON or plain string
|
|
349
347
|
|
|
350
348
|
Returns:
|
|
351
|
-
Tuple(dict
|
|
349
|
+
Tuple(dict or None, error or None)
|
|
352
350
|
"""
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
try:
|
|
356
|
-
formatted_response = json.loads(response_body)
|
|
357
|
-
# logger.debug("Successfully parsed JSON response")
|
|
358
|
-
except json.JSONDecodeError as e:
|
|
359
|
-
logger.error(f"Failed to parse JSON response: {e}")
|
|
360
|
-
return None, e
|
|
361
|
-
else:
|
|
362
|
-
formatted_response = response_body
|
|
363
|
-
|
|
364
|
-
if 200 <= response_details.status_code < 300:
|
|
365
|
-
return formatted_response, None
|
|
351
|
+
content_type = response_details.headers.get("Content-Type", "")
|
|
352
|
+
is_json = "application/json" in content_type
|
|
366
353
|
|
|
367
|
-
|
|
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)
|
|
368
362
|
|
|
369
363
|
status_code = response_details.status_code
|
|
370
364
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
return
|
|
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
|
|
389
383
|
|
|
390
384
|
@staticmethod
|
|
391
385
|
def format_binary_data(data):
|
|
@@ -13,27 +13,13 @@ class ZscalerObject:
|
|
|
13
13
|
def __repr__(self):
|
|
14
14
|
return str(vars(self))
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# continue
|
|
24
|
-
# if isinstance(val, list):
|
|
25
|
-
# formatted_list = []
|
|
26
|
-
# for item in val:
|
|
27
|
-
# if isinstance(item, ZscalerObject):
|
|
28
|
-
# formatted_list.append(item.as_dict()) # Recursive call for nested objects
|
|
29
|
-
# else:
|
|
30
|
-
# formatted_list.append(item)
|
|
31
|
-
# result[to_snake_case(key)] = formatted_list # Convert key to snake_case
|
|
32
|
-
# elif not isinstance(val, ZscalerObject):
|
|
33
|
-
# result[to_snake_case(key)] = val # Convert key to snake_case for simple types
|
|
34
|
-
# else:
|
|
35
|
-
# result[to_snake_case(key)] = val.as_dict() # Convert nested objects
|
|
36
|
-
# return result
|
|
16
|
+
def __getitem__(self, key):
|
|
17
|
+
if hasattr(self, key):
|
|
18
|
+
return getattr(self, key)
|
|
19
|
+
raise KeyError(f"{key} not found in {self.__class__.__name__}")
|
|
20
|
+
|
|
21
|
+
def __contains__(self, key):
|
|
22
|
+
return hasattr(self, key)
|
|
37
23
|
|
|
38
24
|
def as_dict(self):
|
|
39
25
|
result = {}
|
|
@@ -26,8 +26,6 @@ class ZscalerAPIResponse:
|
|
|
26
26
|
res_details=None,
|
|
27
27
|
response_body="",
|
|
28
28
|
data_type=None,
|
|
29
|
-
# max_items=None,
|
|
30
|
-
# max_pages=None,
|
|
31
29
|
all_entries=False,
|
|
32
30
|
sort_order=None,
|
|
33
31
|
sort_by=None,
|
|
@@ -181,6 +179,46 @@ class ZscalerAPIResponse:
|
|
|
181
179
|
self._items_fetched += len(self._list)
|
|
182
180
|
self._pages_fetched += 1
|
|
183
181
|
|
|
182
|
+
# def _build_json_response(self, response_body):
|
|
183
|
+
# """
|
|
184
|
+
# Converts JSON response text into Python dictionary.
|
|
185
|
+
# Ensures consistent model conversion for all pages.
|
|
186
|
+
# """
|
|
187
|
+
# self._body = json.loads(response_body)
|
|
188
|
+
|
|
189
|
+
# # Extract the list based on service type
|
|
190
|
+
# if isinstance(self._body, list):
|
|
191
|
+
# self._list = self._body
|
|
192
|
+
# elif self._service_type == "ZDX":
|
|
193
|
+
# self._list = self._body.get("items", [])
|
|
194
|
+
# self._next_offset = self._body.get("next_offset")
|
|
195
|
+
# else:
|
|
196
|
+
# self._list = self._body.get("list", [])
|
|
197
|
+
# if self._service_type == "ZPA":
|
|
198
|
+
# self._total_pages = int(self._body.get("totalPages", 1))
|
|
199
|
+
# self._total_count = int(self._body.get("totalCount", 0))
|
|
200
|
+
|
|
201
|
+
# # Clean and convert items
|
|
202
|
+
# cleaned_list = []
|
|
203
|
+
# for item in self._list:
|
|
204
|
+
# if not isinstance(item, dict):
|
|
205
|
+
# logger.warning("Non-dict item found in response list, skipping: %s", item)
|
|
206
|
+
# continue
|
|
207
|
+
|
|
208
|
+
# # Convert to model if type is specified
|
|
209
|
+
# if self._type:
|
|
210
|
+
# try:
|
|
211
|
+
# cleaned_list.append(self._type(**item))
|
|
212
|
+
# except Exception as e:
|
|
213
|
+
# logger.error("Failed to convert item to model: %s", e)
|
|
214
|
+
# cleaned_list.append(item)
|
|
215
|
+
# else:
|
|
216
|
+
# cleaned_list.append(item)
|
|
217
|
+
|
|
218
|
+
# self._list = cleaned_list
|
|
219
|
+
# self._items_fetched += len(self._list)
|
|
220
|
+
# self._pages_fetched += 1
|
|
221
|
+
|
|
184
222
|
def get_results(self):
|
|
185
223
|
"""
|
|
186
224
|
Returns the current page of results.
|
|
@@ -198,36 +236,104 @@ class ZscalerAPIResponse:
|
|
|
198
236
|
"""
|
|
199
237
|
return self._has_next()
|
|
200
238
|
|
|
201
|
-
def next(self):
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
239
|
+
# def next(self):
|
|
240
|
+
# """
|
|
241
|
+
# Fetch the next page of results if available.
|
|
242
|
+
|
|
243
|
+
# Returns:
|
|
244
|
+
# tuple: (list of items, error)
|
|
245
|
+
|
|
246
|
+
# If there's an error fetching the next page, returns (None, error).
|
|
247
|
+
# If no more pages exist, returns (None, None).
|
|
248
|
+
# """
|
|
249
|
+
# if not self.has_next():
|
|
250
|
+
# logger.debug("No further pages to retrieve.")
|
|
251
|
+
# return (None, None)
|
|
252
|
+
|
|
253
|
+
# next_page_results = self._fetch_next_page()
|
|
254
|
+
# if next_page_results is None:
|
|
255
|
+
# # An error occurred, already logged
|
|
256
|
+
# return (None, ValueError("Error fetching next page."))
|
|
257
|
+
# if not next_page_results:
|
|
258
|
+
# # Empty result means no more data
|
|
259
|
+
# return (None, None)
|
|
260
|
+
# return (next_page_results, None)
|
|
261
|
+
|
|
262
|
+
### Latest working function
|
|
263
|
+
# def next(self):
|
|
264
|
+
# if not self.has_next():
|
|
265
|
+
# raise StopIteration("No more pages available.")
|
|
266
|
+
|
|
267
|
+
# results, error = self._fetch_next_page()
|
|
268
|
+
# if error:
|
|
269
|
+
# return None, error
|
|
270
|
+
# if not results:
|
|
271
|
+
# return None, None
|
|
272
|
+
|
|
273
|
+
# if self._type:
|
|
274
|
+
# try:
|
|
275
|
+
# results = [self._type(item) for item in results if isinstance(item, dict)]
|
|
276
|
+
# except Exception as wrap_error:
|
|
277
|
+
# logger.warning(f"Failed to wrap pagination results with {self._type}: {wrap_error}")
|
|
278
|
+
|
|
279
|
+
# return results, None
|
|
207
280
|
|
|
208
|
-
|
|
209
|
-
If no more pages exist, returns (None, None).
|
|
210
|
-
"""
|
|
281
|
+
def next(self):
|
|
211
282
|
if not self.has_next():
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
283
|
+
raise StopIteration("No more pages available.")
|
|
284
|
+
|
|
285
|
+
results, error = self._fetch_next_page()
|
|
286
|
+
if error:
|
|
287
|
+
return None, self, error
|
|
288
|
+
if not results:
|
|
289
|
+
return None, self, None
|
|
290
|
+
|
|
291
|
+
if self._type:
|
|
292
|
+
try:
|
|
293
|
+
results = [self._type(item) for item in results if isinstance(item, dict)]
|
|
294
|
+
except Exception as wrap_error:
|
|
295
|
+
logger.warning(f"Failed to wrap pagination results with {self._type}: {wrap_error}")
|
|
296
|
+
|
|
297
|
+
return results, self, None
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# def _fetch_next_page(self):
|
|
301
|
+
# """
|
|
302
|
+
# Internal method that fetches and returns the next page of results.
|
|
303
|
+
# """
|
|
304
|
+
# if not self._has_next():
|
|
305
|
+
# logger.debug("No more pages to fetch")
|
|
306
|
+
# return []
|
|
307
|
+
|
|
308
|
+
# if self._service_type == "ZDX":
|
|
309
|
+
# self._params["offset"] = self._next_offset
|
|
310
|
+
# else:
|
|
311
|
+
# self._page += 1
|
|
312
|
+
# self._params["page"] = self._page
|
|
313
|
+
|
|
314
|
+
# logger.debug(f"Requesting next page with params: {self._params}")
|
|
315
|
+
|
|
316
|
+
# req = {
|
|
317
|
+
# "method": "GET",
|
|
318
|
+
# "url": self._url,
|
|
319
|
+
# "headers": self._headers,
|
|
320
|
+
# "params": self._params,
|
|
321
|
+
# "uuid": uuid.uuid4(),
|
|
322
|
+
# }
|
|
323
|
+
# _, _, response_body, error = self._request_executor.fire_request(req)
|
|
324
|
+
|
|
325
|
+
# if error:
|
|
326
|
+
# logger.error(f"Error fetching the next page: {error}")
|
|
327
|
+
# return None
|
|
328
|
+
|
|
329
|
+
# # Rebuild the response body for the next page
|
|
330
|
+
# self._build_json_response(response_body)
|
|
331
|
+
# return self._list
|
|
223
332
|
|
|
224
333
|
def _fetch_next_page(self):
|
|
225
|
-
"""
|
|
226
|
-
Internal method that fetches and returns the next page of results.
|
|
227
|
-
"""
|
|
228
334
|
if not self._has_next():
|
|
229
335
|
logger.debug("No more pages to fetch")
|
|
230
|
-
return []
|
|
336
|
+
return [], None
|
|
231
337
|
|
|
232
338
|
if self._service_type == "ZDX":
|
|
233
339
|
self._params["offset"] = self._next_offset
|
|
@@ -248,11 +354,10 @@ class ZscalerAPIResponse:
|
|
|
248
354
|
|
|
249
355
|
if error:
|
|
250
356
|
logger.error(f"Error fetching the next page: {error}")
|
|
251
|
-
return None
|
|
357
|
+
return None, error
|
|
252
358
|
|
|
253
|
-
# Rebuild the response body for the next page
|
|
254
359
|
self._build_json_response(response_body)
|
|
255
|
-
return self._list
|
|
360
|
+
return self._list, None
|
|
256
361
|
|
|
257
362
|
def _has_next(self):
|
|
258
363
|
# Check max_items or max_pages constraints
|
|
@@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
|
|
|
20
20
|
|
|
21
21
|
class RequestExecutor:
|
|
22
22
|
"""
|
|
23
|
-
This class handles all of the requests sent by the Zscaler SDK Client (ZIA, ZPA, ZCC, ZDX, ZWA
|
|
23
|
+
This class handles all of the requests sent by the Zscaler SDK Client (ZIA, ZPA, ZCC, ZDX, ZWA, ZTW).
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
26
|
BASE_URL = "https://api.zsapi.net" # Default base URL for API calls
|
|
@@ -323,16 +323,18 @@ class RequestExecutor:
|
|
|
323
323
|
"""
|
|
324
324
|
try:
|
|
325
325
|
request, response, response_body, error = self.fire_request(request)
|
|
326
|
+
logger.debug(
|
|
327
|
+
f"[DEBUG] Got response: {response} (status: {getattr(response, 'status_code', 'N/A')}) | error: {error}"
|
|
328
|
+
)
|
|
326
329
|
except Exception as ex:
|
|
327
330
|
logger.error(f"Exception during HTTP request: {ex}")
|
|
328
331
|
return None, ex
|
|
329
332
|
|
|
330
|
-
if
|
|
331
|
-
|
|
332
|
-
return None, ValueError("Response is None")
|
|
333
|
+
if response is None and error is None:
|
|
334
|
+
return None, None # silently return None without manufacturing errors
|
|
333
335
|
|
|
334
336
|
if error:
|
|
335
|
-
logger.error(f"Error during request execution: {error}")
|
|
337
|
+
# logger.error(f"Error during request execution: {error}")
|
|
336
338
|
return None, error
|
|
337
339
|
|
|
338
340
|
if response.status_code == 204:
|
|
@@ -350,7 +352,7 @@ class RequestExecutor:
|
|
|
350
352
|
return None, ex
|
|
351
353
|
|
|
352
354
|
if error:
|
|
353
|
-
logger.error(f"Error in HTTP response: {error}")
|
|
355
|
+
# logger.error(f"Error in HTTP response: {error}")
|
|
354
356
|
return None, error
|
|
355
357
|
|
|
356
358
|
logger.debug(f"Successful response from {request['url']}")
|
|
@@ -466,8 +468,8 @@ class RequestExecutor:
|
|
|
466
468
|
response, error = self._http_client.send_request(request)
|
|
467
469
|
|
|
468
470
|
if error:
|
|
469
|
-
logger.error(f"Error sending request: {error}")
|
|
470
|
-
return
|
|
471
|
+
# logger.error(f"Error sending request: {error}")
|
|
472
|
+
return request, response, response.text if response else None, error
|
|
471
473
|
|
|
472
474
|
headers = response.headers
|
|
473
475
|
|
|
@@ -486,10 +488,14 @@ class RequestExecutor:
|
|
|
486
488
|
"""
|
|
487
489
|
Checks if HTTP status is retryable.
|
|
488
490
|
|
|
489
|
-
Retryable statuses: 429, 503, 504
|
|
491
|
+
Retryable statuses: 408, 409, 412, 429, 500, 502, 503, 504
|
|
490
492
|
"""
|
|
491
493
|
return status is not None and status in (
|
|
494
|
+
HTTPStatus.REQUEST_TIMEOUT,
|
|
495
|
+
HTTPStatus.CONFLICT,
|
|
496
|
+
HTTPStatus.PRECONDITION_FAILED,
|
|
492
497
|
HTTPStatus.TOO_MANY_REQUESTS,
|
|
498
|
+
HTTPStatus.INTERNAL_SERVER_ERROR,
|
|
493
499
|
HTTPStatus.SERVICE_UNAVAILABLE,
|
|
494
500
|
HTTPStatus.GATEWAY_TIMEOUT,
|
|
495
501
|
)
|