zscaler-sdk-python 1.1.0__tar.gz → 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/PKG-INFO +24 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/README.md +23 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/pyproject.toml +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/__init__.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/constants.py +1 -1
- zscaler_sdk_python-1.2.0/zscaler/errors/zscaler_api_error.py +55 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/exceptions/exceptions.py +4 -20
- zscaler_sdk_python-1.2.0/zscaler/logger.py +181 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_http_client.py +36 -42
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/request_executor.py +15 -9
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/utils.py +3 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/alert_subscriptions.py +70 -35
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/bandwidth_classes.py +19 -19
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall_dns.py +34 -16
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall_ips.py +33 -16
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall_rules.py +51 -27
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dns_gatways.py +68 -12
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/ftp_control_policy.py +14 -21
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/legacy.py +37 -11
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/admin_roles.py +4 -4
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/advanced_settings.py +1 -2
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/alert_subscriptions.py +2 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/bandwidth_control_rules.py +1 -13
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_rules.py +1 -0
- zscaler_sdk_python-1.2.0/zscaler/zia/models/nat_control_policy.py +224 -0
- zscaler_sdk_python-1.2.0/zscaler/zia/models/nss_servers.py +63 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/proxies.py +0 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_dc_exclusions.py +6 -12
- zscaler_sdk_python-1.2.0/zscaler/zia/nat_control_policy.py +371 -0
- zscaler_sdk_python-1.2.0/zscaler/zia/nss_servers.py +304 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/proxies.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/sandbox_rules.py +55 -24
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/ssl_inspection_rules.py +9 -6
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/time_intervals.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_datacenters.py +16 -14
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/url_filtering.py +55 -41
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/zia_service.py +20 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/administrator_controller.py +295 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/client_settings.py +209 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/customer_controller.py +153 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/enrollment_certificates.py +320 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/legacy.py +32 -2
- zscaler_sdk_python-1.2.0/zscaler/zpa/models/administrator_controller.py +181 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/models/client_settings.py +87 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/models/customer_controller.py +139 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/enrollment_certificates.py +13 -6
- zscaler_sdk_python-1.2.0/zscaler/zpa/models/role_controller.py +427 -0
- zscaler_sdk_python-1.2.0/zscaler/zpa/role_controller.py +285 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/saml_attributes.py +134 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/segment_groups.py +1 -1
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/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/logger.py +0 -124
- 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.0}/LICENSE.md +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/api_client.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/cache.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/no_op_cache.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/zscaler_cache.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/config/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/config/config_setter.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/config/config_validator.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/error_messages.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/errors/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/errors/error.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/errors/http_error.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/exceptions/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/helpers.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_client.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_collection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_oauth_client.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_object.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_response.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ratelimiter/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ratelimiter/ratelimiter.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/user_agent.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/admin_user.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/company.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/entitlements.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/fail_open_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/forwarding_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/manage_pass.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/admin_user.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/failopenpolicy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/forwardingprofile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/manage_pass.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/secrets_otp.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/secrets_passwords.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/trustednetworks.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/webappservice.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/webpolicy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/webprivacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/secrets.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/web_app_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/web_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/web_privacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/zcc_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/admin.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/alerts.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/apps.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/inventory.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/activeapplications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/administration.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/alerts.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/application_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/applications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/call_quality_metrics.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/software_inventory.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/troubleshooting.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/zdx_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/activate.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/advanced_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/apptotal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/atp_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/audit_logs.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/bandwidth_control_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_applications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_apps.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/device_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/end_user_notification.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/file_type_control_rule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/forwarding_control.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/gre_tunnel.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/iot_report.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/locations.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/malware_protection_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/activation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/advanced_threat_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/apptotal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/authentication_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/bandwidth_classes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_app_instances.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_app_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_nss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloudappcontrol.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/device_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/devices.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_dictionary.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_engine.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_resources.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_templates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_web_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dns_gatways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/endusernotification.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/filetyperules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/forwarding_control_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/ftp_control_policy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_recommended_list.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_tunnel_info.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_tunnels.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_vips.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/intermediate_certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/iotreport.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/ipv6_config.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/location_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/location_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/malware_protection_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/mobile_threat_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/organization_information.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/pac_files.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/proxy_gatways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/remoteassistance.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/rule_labels.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/sandboxrules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/shadow_it_report.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/subclouds.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/system_audit.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/time_intervals.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_datacenters.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/url_filtering_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/urlcategory.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/user_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/workload_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/organization_information.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/pac_files.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/policy_export.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/remote_assistance.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/risk_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/rule_labels.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/sandbox.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/security_policy_settings.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/sub_clouds.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/system_audit.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/tenancy_restriction_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_extranet.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_static_ip.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/url_categories.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/user_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/workload_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/zpa_gateway.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_connectors.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_protection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_segment_by_type.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_segments_inspection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_segments_pra.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/application_segment.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_region.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/emergency_access.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/idp.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/lss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/machine_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/microtenants.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_connector_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_connectors.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_protection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_protection_predefined_controls.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_segment.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_segment_inspection.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_segment_pra.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_servers.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_banner.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_certificate.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_region.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/certificates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/customer_version_profile.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/emergency_access.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/idp.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/lss.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/machine_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/microtenants.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/policyset_controller_v2.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_approval.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_console.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_credential.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_portal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/provisioning_keys.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/saml_attributes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/scim_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/segment_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/server_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/service_edge_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/service_edges.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/trusted_network.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/policies.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/posture_profiles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_approval.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_console.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_credential.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_credential_pool.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_portal.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/provisioning.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/scim_attributes.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/scim_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/server_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/servers.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/service_edge_group.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/service_edge_schedule.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/service_edges.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/trusted_networks.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/account_details.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/activation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/api_keys.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ec_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ip_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/location_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/location_template.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/activation.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/admin_roles.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/admin_users.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/api_keys.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ec_group_vm.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ecgroup.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/forwarding_gateways.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/forwarding_rules.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ip_destination_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ip_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ip_source_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/location_management.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/location_templates.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/nw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/zpa_resources.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/nw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/nw_service_groups.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/provisioning_url.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ztw_service.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/__init__.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/audit_logs.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/dlp_incidents.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/legacy.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/audit_logs.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/change_history.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/common.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/generated_tickets.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_details.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_evidence.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_group_search.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_search.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_trigger.py +0 -0
- {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/zwa_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: zscaler-sdk-python
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Official Python SDK for the Zscaler Products
|
|
5
5
|
Home-page: https://github.com/zscaler/zscaler-sdk-python
|
|
6
6
|
License: MIT
|
|
@@ -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
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import json as jsonp
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
from urllib.parse import urlencode
|
|
6
|
+
from http.client import HTTPConnection
|
|
7
|
+
|
|
8
|
+
LOG_FORMAT = "%(asctime)s - %(name)s - %(module)s - %(levelname)s - %(message)s"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# def setup_logging(logger_name="zscaler-sdk-python", enabled=None, verbose=None):
|
|
12
|
+
# """
|
|
13
|
+
# Set up logging with specified level and logger name.
|
|
14
|
+
# Log level is controlled via ZSCALER_SDK_VERBOSE environment variable.
|
|
15
|
+
# Logging can be enabled/disabled via ZSCALER_SDK_LOG environment variable.
|
|
16
|
+
|
|
17
|
+
# Parameters:
|
|
18
|
+
# - logger_name (str, optional): Logger name. Defaults to "zscaler-sdk-python".
|
|
19
|
+
# - enabled (bool, optional): Enable logging. Defaults to None, which uses the environment variable.
|
|
20
|
+
# - verbose (bool, optional): Set verbose logging. Defaults to None, which uses the environment variable.
|
|
21
|
+
# """
|
|
22
|
+
# if enabled is None:
|
|
23
|
+
# enabled = os.getenv("ZSCALER_SDK_LOG", "false").lower() == "true"
|
|
24
|
+
|
|
25
|
+
# # if not enabled:
|
|
26
|
+
# # # If logging is not enabled, set up a null handler
|
|
27
|
+
# # logging.disable(logging.INFO)
|
|
28
|
+
# # return
|
|
29
|
+
|
|
30
|
+
# if not enabled:
|
|
31
|
+
# # Do not globally disable logging
|
|
32
|
+
# # Just keep the SDK logger silent
|
|
33
|
+
# sdk_logger = logging.getLogger(logger_name)
|
|
34
|
+
# sdk_logger.addHandler(logging.NullHandler())
|
|
35
|
+
# return
|
|
36
|
+
|
|
37
|
+
# if verbose is None:
|
|
38
|
+
# verbose = os.getenv("ZSCALER_SDK_VERBOSE", "false").lower() == "true"
|
|
39
|
+
|
|
40
|
+
# log_level = logging.DEBUG if verbose else logging.INFO
|
|
41
|
+
# HTTPConnection.debuglevel = 0
|
|
42
|
+
# # Create a logger with the specified name
|
|
43
|
+
# logger = logging.getLogger(logger_name)
|
|
44
|
+
# default_logger = logging.getLogger()
|
|
45
|
+
|
|
46
|
+
# # If the logger already has handlers, remove them to avoid duplicate logging
|
|
47
|
+
# for handler in logger.handlers[:]:
|
|
48
|
+
# logger.removeHandler(handler)
|
|
49
|
+
|
|
50
|
+
# for handler in default_logger.handlers[:]:
|
|
51
|
+
# default_logger.removeHandler(handler)
|
|
52
|
+
|
|
53
|
+
# # Set log level
|
|
54
|
+
# logger.setLevel(log_level)
|
|
55
|
+
# default_logger.setLevel(log_level)
|
|
56
|
+
# logging.basicConfig(level=log_level)
|
|
57
|
+
# # Create a stream handler with the specified level and formatter
|
|
58
|
+
# stream_handler = logging.StreamHandler()
|
|
59
|
+
# stream_handler.setLevel(log_level)
|
|
60
|
+
# log_formatter = logging.Formatter(LOG_FORMAT)
|
|
61
|
+
# stream_handler.setFormatter(log_formatter)
|
|
62
|
+
|
|
63
|
+
# # Add the handler to the logger
|
|
64
|
+
# logger.addHandler(stream_handler)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# # Option: Add FileHandler if you want logs to be written to a file.
|
|
68
|
+
# if os.getenv("LOG_TO_FILE", "false").lower() == "true":
|
|
69
|
+
# file_handler = logging.FileHandler(os.getenv("LOG_FILE_PATH", "sdk.log"))
|
|
70
|
+
# file_handler.setLevel(log_level)
|
|
71
|
+
# file_handler.setFormatter(log_formatter)
|
|
72
|
+
# logger.addHandler(file_handler)
|
|
73
|
+
def setup_logging(logger_name="zscaler-sdk-python", enabled=None, verbose=None):
|
|
74
|
+
"""
|
|
75
|
+
Set up logging for the Zscaler SDK.
|
|
76
|
+
|
|
77
|
+
Logging behavior can be controlled via environment variables or config:
|
|
78
|
+
|
|
79
|
+
Environment Variables:
|
|
80
|
+
ZSCALER_SDK_LOG (true/false): Enable or disable SDK logging.
|
|
81
|
+
ZSCALER_SDK_VERBOSE (true/false): Enable verbose (DEBUG) logging.
|
|
82
|
+
LOG_TO_FILE (true/false): Enable file-based logging.
|
|
83
|
+
LOG_FILE_PATH: File path for logs (default: sdk.log)
|
|
84
|
+
|
|
85
|
+
Parameters:
|
|
86
|
+
logger_name (str): Name of the logger. Defaults to "zscaler-sdk-python".
|
|
87
|
+
enabled (bool): Enable logging. If None, reads from env.
|
|
88
|
+
verbose (bool): Enable DEBUG-level logging. If None, reads from env.
|
|
89
|
+
"""
|
|
90
|
+
if enabled is None:
|
|
91
|
+
enabled = os.getenv("ZSCALER_SDK_LOG", "false").lower() == "true"
|
|
92
|
+
|
|
93
|
+
if not enabled:
|
|
94
|
+
# Do NOT disable global logging.
|
|
95
|
+
# Just suppress SDK logs quietly with a NullHandler.
|
|
96
|
+
logging.getLogger(logger_name).addHandler(logging.NullHandler())
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
if verbose is None:
|
|
100
|
+
verbose = os.getenv("ZSCALER_SDK_VERBOSE", "false").lower() == "true"
|
|
101
|
+
|
|
102
|
+
log_level = logging.DEBUG if verbose else logging.INFO
|
|
103
|
+
HTTPConnection.debuglevel = 0 # Optional: Enable HTTP debug logging
|
|
104
|
+
|
|
105
|
+
# SDK logger (isolated)
|
|
106
|
+
logger = logging.getLogger(logger_name)
|
|
107
|
+
logger.setLevel(log_level)
|
|
108
|
+
|
|
109
|
+
# Clean up any duplicate handlers
|
|
110
|
+
if not logger.handlers:
|
|
111
|
+
stream_handler = logging.StreamHandler()
|
|
112
|
+
stream_handler.setLevel(log_level)
|
|
113
|
+
stream_handler.setFormatter(logging.Formatter(LOG_FORMAT))
|
|
114
|
+
logger.addHandler(stream_handler)
|
|
115
|
+
|
|
116
|
+
# Optional file logging
|
|
117
|
+
if os.getenv("LOG_TO_FILE", "false").lower() == "true":
|
|
118
|
+
file_handler = logging.FileHandler(os.getenv("LOG_FILE_PATH", "sdk.log"))
|
|
119
|
+
file_handler.setLevel(log_level)
|
|
120
|
+
file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
|
|
121
|
+
logger.addHandler(file_handler)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def dump_request(logger, url: str, method: str, json, params, headers, request_uuid: str, body=True):
|
|
125
|
+
request_headers_filtered = {key: value for key, value in headers.items() if key != "Authorization"}
|
|
126
|
+
# Log the request details before sending the request
|
|
127
|
+
log_lines = []
|
|
128
|
+
request_body = ""
|
|
129
|
+
if body:
|
|
130
|
+
request_body = jsonp.dumps(json)
|
|
131
|
+
log_lines.append(f"\n---[ ZSCALER SDK REQUEST | ID:{request_uuid} ]-------------------------------")
|
|
132
|
+
full_url = url
|
|
133
|
+
if params:
|
|
134
|
+
full_url += "?" + urlencode(params)
|
|
135
|
+
log_lines.append(f"{method} {full_url}")
|
|
136
|
+
for key, value in request_headers_filtered.items():
|
|
137
|
+
log_lines.append(f"{key}: {value}")
|
|
138
|
+
if body and request_body != "" and request_body != "null":
|
|
139
|
+
log_lines.append(f"\n{request_body}")
|
|
140
|
+
log_lines.append("--------------------------------------------------------------------")
|
|
141
|
+
logger.info("\n".join(log_lines))
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def dump_response(
|
|
145
|
+
logger,
|
|
146
|
+
url: str,
|
|
147
|
+
method: str,
|
|
148
|
+
resp,
|
|
149
|
+
params,
|
|
150
|
+
request_uuid: str,
|
|
151
|
+
start_time,
|
|
152
|
+
from_cache: bool = None,
|
|
153
|
+
):
|
|
154
|
+
# Calculate the duration in seconds
|
|
155
|
+
end_time = time.time()
|
|
156
|
+
duration_seconds = end_time - start_time
|
|
157
|
+
# Convert the duration to milliseconds
|
|
158
|
+
duration_ms = duration_seconds * 1000
|
|
159
|
+
# Convert the headers to a regular dictionary
|
|
160
|
+
response_headers_dict = dict(resp.headers)
|
|
161
|
+
full_url = url
|
|
162
|
+
if params:
|
|
163
|
+
full_url += "?" + urlencode(params)
|
|
164
|
+
log_lines = []
|
|
165
|
+
|
|
166
|
+
if from_cache:
|
|
167
|
+
log_lines.append(
|
|
168
|
+
f"\n---[ ZSCALER SDK RESPONSE | ID:{request_uuid} | " f"FROM CACHE | DURATION:{duration_ms}ms ]" + "-" * 31
|
|
169
|
+
)
|
|
170
|
+
else:
|
|
171
|
+
log_lines.append(f"\n---[ ZSCALER SDK RESPONSE | ID:{request_uuid} | " f"DURATION:{duration_ms}ms ]" + "-" * 46)
|
|
172
|
+
log_lines.append(f"{method} {full_url}")
|
|
173
|
+
for key, value in response_headers_dict.items():
|
|
174
|
+
log_lines.append(f"{key}: {value}")
|
|
175
|
+
response_body = ""
|
|
176
|
+
if resp.text:
|
|
177
|
+
response_body = resp.text
|
|
178
|
+
if response_body and response_body != "" and response_body != "null":
|
|
179
|
+
log_lines.append(f"\n{response_body}")
|
|
180
|
+
log_lines.append("-" * 68)
|
|
181
|
+
logger.info("\n".join(log_lines))
|
|
@@ -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):
|
|
@@ -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
|
)
|
|
@@ -675,6 +675,7 @@ def is_valid_ssh_key(private_key: str) -> bool:
|
|
|
675
675
|
]
|
|
676
676
|
return any(re.search(pattern, private_key) for pattern in ssh_key_patterns)
|
|
677
677
|
|
|
678
|
+
|
|
678
679
|
def validate_and_convert_times(start_time_str, end_time_str, time_zone_str):
|
|
679
680
|
"""
|
|
680
681
|
Validates and converts provided time strings to epoch.
|
|
@@ -730,6 +731,7 @@ def validate_and_convert_times(start_time_str, end_time_str, time_zone_str):
|
|
|
730
731
|
|
|
731
732
|
return start_epoch, end_epoch
|
|
732
733
|
|
|
734
|
+
|
|
733
735
|
def convert_dc_exclusion_times(start_time_str, end_time_str, time_zone_str):
|
|
734
736
|
"""
|
|
735
737
|
Converts and validates DC exclusion times based on API rules:
|
|
@@ -752,6 +754,7 @@ def convert_dc_exclusion_times(start_time_str, end_time_str, time_zone_str):
|
|
|
752
754
|
|
|
753
755
|
return start_epoch, end_epoch
|
|
754
756
|
|
|
757
|
+
|
|
755
758
|
def convert_date_time_to_seconds(date_time):
|
|
756
759
|
"""
|
|
757
760
|
Takes in a date time string and returns the number of seconds
|