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.
Files changed (383) hide show
  1. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/PKG-INFO +24 -1
  2. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/README.md +23 -0
  3. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/pyproject.toml +1 -1
  4. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/__init__.py +1 -1
  5. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/constants.py +1 -1
  6. zscaler_sdk_python-1.2.0/zscaler/errors/zscaler_api_error.py +55 -0
  7. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/exceptions/exceptions.py +4 -20
  8. zscaler_sdk_python-1.2.0/zscaler/logger.py +181 -0
  9. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_http_client.py +36 -42
  10. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/request_executor.py +15 -9
  11. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/utils.py +3 -0
  12. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/alert_subscriptions.py +70 -35
  13. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/bandwidth_classes.py +19 -19
  14. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall_dns.py +34 -16
  15. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall_ips.py +33 -16
  16. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall_rules.py +51 -27
  17. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dns_gatways.py +68 -12
  18. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/ftp_control_policy.py +14 -21
  19. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/legacy.py +37 -11
  20. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/admin_roles.py +4 -4
  21. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/advanced_settings.py +1 -2
  22. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/alert_subscriptions.py +2 -1
  23. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/bandwidth_control_rules.py +1 -13
  24. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_rules.py +1 -0
  25. zscaler_sdk_python-1.2.0/zscaler/zia/models/nat_control_policy.py +224 -0
  26. zscaler_sdk_python-1.2.0/zscaler/zia/models/nss_servers.py +63 -0
  27. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/proxies.py +0 -1
  28. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_dc_exclusions.py +6 -12
  29. zscaler_sdk_python-1.2.0/zscaler/zia/nat_control_policy.py +371 -0
  30. zscaler_sdk_python-1.2.0/zscaler/zia/nss_servers.py +304 -0
  31. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/proxies.py +1 -1
  32. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/sandbox_rules.py +55 -24
  33. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/ssl_inspection_rules.py +9 -6
  34. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/time_intervals.py +1 -1
  35. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_datacenters.py +16 -14
  36. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/url_filtering.py +55 -41
  37. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/zia_service.py +20 -0
  38. zscaler_sdk_python-1.2.0/zscaler/zpa/administrator_controller.py +295 -0
  39. zscaler_sdk_python-1.2.0/zscaler/zpa/client_settings.py +209 -0
  40. zscaler_sdk_python-1.2.0/zscaler/zpa/customer_controller.py +153 -0
  41. zscaler_sdk_python-1.2.0/zscaler/zpa/enrollment_certificates.py +320 -0
  42. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/legacy.py +32 -2
  43. zscaler_sdk_python-1.2.0/zscaler/zpa/models/administrator_controller.py +181 -0
  44. zscaler_sdk_python-1.2.0/zscaler/zpa/models/client_settings.py +87 -0
  45. zscaler_sdk_python-1.2.0/zscaler/zpa/models/customer_controller.py +139 -0
  46. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/enrollment_certificates.py +13 -6
  47. zscaler_sdk_python-1.2.0/zscaler/zpa/models/role_controller.py +427 -0
  48. zscaler_sdk_python-1.2.0/zscaler/zpa/role_controller.py +285 -0
  49. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/saml_attributes.py +134 -1
  50. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/segment_groups.py +1 -1
  51. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/zpa_service.py +34 -4
  52. zscaler_sdk_python-1.1.0/zscaler/errors/zscaler_api_error.py +0 -28
  53. zscaler_sdk_python-1.1.0/zscaler/logger.py +0 -124
  54. zscaler_sdk_python-1.1.0/zscaler/zpa/authdomains.py +0 -72
  55. zscaler_sdk_python-1.1.0/zscaler/zpa/enrollment_certificates.py +0 -140
  56. zscaler_sdk_python-1.1.0/zscaler/zpa/models/auth_domain.py +0 -37
  57. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/LICENSE.md +0 -0
  58. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/api_client.py +0 -0
  59. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/__init__.py +0 -0
  60. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/cache.py +0 -0
  61. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/no_op_cache.py +0 -0
  62. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/cache/zscaler_cache.py +0 -0
  63. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/config/__init__.py +0 -0
  64. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/config/config_setter.py +0 -0
  65. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/config/config_validator.py +0 -0
  66. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/error_messages.py +0 -0
  67. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/errors/__init__.py +0 -0
  68. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/errors/error.py +0 -0
  69. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/errors/http_error.py +0 -0
  70. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/exceptions/__init__.py +0 -0
  71. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/helpers.py +0 -0
  72. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_client.py +0 -0
  73. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_collection.py +0 -0
  74. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_oauth_client.py +0 -0
  75. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_object.py +0 -0
  76. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/oneapi_response.py +0 -0
  77. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ratelimiter/__init__.py +0 -0
  78. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ratelimiter/ratelimiter.py +0 -0
  79. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/user_agent.py +0 -0
  80. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/__init__.py +0 -0
  81. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/admin_user.py +0 -0
  82. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/company.py +0 -0
  83. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/devices.py +0 -0
  84. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/entitlements.py +0 -0
  85. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/fail_open_policy.py +0 -0
  86. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/forwarding_profile.py +0 -0
  87. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/legacy.py +0 -0
  88. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/manage_pass.py +0 -0
  89. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/admin_roles.py +0 -0
  90. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/admin_user.py +0 -0
  91. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/devices.py +0 -0
  92. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/failopenpolicy.py +0 -0
  93. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/forwardingprofile.py +0 -0
  94. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/manage_pass.py +0 -0
  95. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/secrets_otp.py +0 -0
  96. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/secrets_passwords.py +0 -0
  97. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/trustednetworks.py +0 -0
  98. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/webappservice.py +0 -0
  99. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/webpolicy.py +0 -0
  100. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/webprivacy.py +0 -0
  101. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
  102. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
  103. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/secrets.py +0 -0
  104. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/trusted_networks.py +0 -0
  105. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/web_app_service.py +0 -0
  106. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/web_policy.py +0 -0
  107. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/web_privacy.py +0 -0
  108. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zcc/zcc_service.py +0 -0
  109. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/__init__.py +0 -0
  110. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/admin.py +0 -0
  111. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/alerts.py +0 -0
  112. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/apps.py +0 -0
  113. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/devices.py +0 -0
  114. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/inventory.py +0 -0
  115. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/legacy.py +0 -0
  116. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/activeapplications.py +0 -0
  117. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/administration.py +0 -0
  118. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/alerts.py +0 -0
  119. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/application_users.py +0 -0
  120. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/applications.py +0 -0
  121. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/call_quality_metrics.py +0 -0
  122. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/common.py +0 -0
  123. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/devices.py +0 -0
  124. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/software_inventory.py +0 -0
  125. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/troubleshooting.py +0 -0
  126. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/models/users.py +0 -0
  127. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/troubleshooting.py +0 -0
  128. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/users.py +0 -0
  129. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zdx/zdx_service.py +0 -0
  130. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/__init__.py +0 -0
  131. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/activate.py +0 -0
  132. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/admin_roles.py +0 -0
  133. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/admin_users.py +0 -0
  134. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/advanced_settings.py +0 -0
  135. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/apptotal.py +0 -0
  136. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/atp_policy.py +0 -0
  137. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/audit_logs.py +0 -0
  138. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/authentication_settings.py +0 -0
  139. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/bandwidth_control_rules.py +0 -0
  140. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_app_instances.py +0 -0
  141. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_applications.py +0 -0
  142. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_apps.py +0 -0
  143. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_browser_isolation.py +0 -0
  144. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_firewall.py +0 -0
  145. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloud_nss.py +0 -0
  146. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/cloudappcontrol.py +0 -0
  147. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dedicated_ip_gateways.py +0 -0
  148. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/device_management.py +0 -0
  149. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_dictionary.py +0 -0
  150. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_engine.py +0 -0
  151. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_resources.py +0 -0
  152. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_templates.py +0 -0
  153. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/dlp_web_rules.py +0 -0
  154. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/end_user_notification.py +0 -0
  155. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/file_type_control_rule.py +0 -0
  156. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/forwarding_control.py +0 -0
  157. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/gre_tunnel.py +0 -0
  158. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/intermediate_certificates.py +0 -0
  159. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/iot_report.py +0 -0
  160. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/ipv6_config.py +0 -0
  161. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/locations.py +0 -0
  162. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/malware_protection_policy.py +0 -0
  163. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/mobile_threat_settings.py +0 -0
  164. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/__init__.py +0 -0
  165. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/activation.py +0 -0
  166. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/admin_users.py +0 -0
  167. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/advanced_threat_settings.py +0 -0
  168. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/apptotal.py +0 -0
  169. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/authentication_settings.py +0 -0
  170. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/bandwidth_classes.py +0 -0
  171. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_app_instances.py +0 -0
  172. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_app_policy.py +0 -0
  173. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
  174. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
  175. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
  176. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
  177. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
  178. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
  179. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
  180. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
  181. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
  182. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
  183. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
  184. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloud_nss.py +0 -0
  185. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/cloudappcontrol.py +0 -0
  186. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/common.py +0 -0
  187. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
  188. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/device_groups.py +0 -0
  189. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/devices.py +0 -0
  190. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_dictionary.py +0 -0
  191. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_engine.py +0 -0
  192. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_resources.py +0 -0
  193. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_templates.py +0 -0
  194. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dlp_web_rules.py +0 -0
  195. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/dns_gatways.py +0 -0
  196. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/endusernotification.py +0 -0
  197. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/filetyperules.py +0 -0
  198. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/forwarding_control_policy.py +0 -0
  199. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/ftp_control_policy.py +0 -0
  200. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_recommended_list.py +0 -0
  201. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_tunnel_info.py +0 -0
  202. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_tunnels.py +0 -0
  203. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/gre_vips.py +0 -0
  204. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/intermediate_certificates.py +0 -0
  205. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/iotreport.py +0 -0
  206. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/ipv6_config.py +0 -0
  207. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/location_group.py +0 -0
  208. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/location_management.py +0 -0
  209. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/malware_protection_settings.py +0 -0
  210. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/mobile_threat_settings.py +0 -0
  211. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/organization_information.py +0 -0
  212. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/pac_files.py +0 -0
  213. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/proxy_gatways.py +0 -0
  214. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/remoteassistance.py +0 -0
  215. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/risk_profiles.py +0 -0
  216. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/rule_labels.py +0 -0
  217. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/sandboxrules.py +0 -0
  218. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/security_policy_settings.py +0 -0
  219. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/shadow_it_report.py +0 -0
  220. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
  221. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/subclouds.py +0 -0
  222. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/system_audit.py +0 -0
  223. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
  224. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/time_intervals.py +0 -0
  225. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_datacenters.py +0 -0
  226. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_extranet.py +0 -0
  227. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_static_ip.py +0 -0
  228. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
  229. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
  230. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/url_filtering_rules.py +0 -0
  231. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/urlcategory.py +0 -0
  232. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/user_management.py +0 -0
  233. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/workload_groups.py +0 -0
  234. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/models/zpa_gateway.py +0 -0
  235. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/organization_information.py +0 -0
  236. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/pac_files.py +0 -0
  237. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/policy_export.py +0 -0
  238. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/remote_assistance.py +0 -0
  239. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/risk_profiles.py +0 -0
  240. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/rule_labels.py +0 -0
  241. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/sandbox.py +0 -0
  242. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/security_policy_settings.py +0 -0
  243. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/sub_clouds.py +0 -0
  244. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/system_audit.py +0 -0
  245. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/tenancy_restriction_profile.py +0 -0
  246. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_extranet.py +0 -0
  247. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_static_ip.py +0 -0
  248. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/traffic_vpn_credentials.py +0 -0
  249. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/url_categories.py +0 -0
  250. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/user_management.py +0 -0
  251. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/workload_groups.py +0 -0
  252. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zia/zpa_gateway.py +0 -0
  253. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/__init__.py +0 -0
  254. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_connector_groups.py +0 -0
  255. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_connector_schedule.py +0 -0
  256. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_connectors.py +0 -0
  257. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_protection.py +0 -0
  258. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_segment_by_type.py +0 -0
  259. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_segments_inspection.py +0 -0
  260. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/app_segments_pra.py +0 -0
  261. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/application_segment.py +0 -0
  262. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_banner.py +0 -0
  263. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_certificate.py +0 -0
  264. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_profile.py +0 -0
  265. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_region.py +0 -0
  266. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cbi_zpa_profile.py +0 -0
  267. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/certificates.py +0 -0
  268. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/cloud_connector_groups.py +0 -0
  269. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/customer_version_profile.py +0 -0
  270. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/emergency_access.py +0 -0
  271. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/idp.py +0 -0
  272. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/lss.py +0 -0
  273. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/machine_groups.py +0 -0
  274. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/microtenants.py +0 -0
  275. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_connector_groups.py +0 -0
  276. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_connector_schedule.py +0 -0
  277. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_connectors.py +0 -0
  278. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_protection.py +0 -0
  279. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/app_protection_predefined_controls.py +0 -0
  280. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_segment.py +0 -0
  281. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_segment_inspection.py +0 -0
  282. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_segment_pra.py +0 -0
  283. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/application_servers.py +0 -0
  284. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_banner.py +0 -0
  285. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_certificate.py +0 -0
  286. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_profile.py +0 -0
  287. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_region.py +0 -0
  288. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
  289. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/certificates.py +0 -0
  290. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
  291. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/common.py +0 -0
  292. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/customer_version_profile.py +0 -0
  293. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/emergency_access.py +0 -0
  294. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/idp.py +0 -0
  295. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/lss.py +0 -0
  296. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/machine_groups.py +0 -0
  297. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/microtenants.py +0 -0
  298. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
  299. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/policyset_controller_v2.py +0 -0
  300. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/posture_profiles.py +0 -0
  301. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_approval.py +0 -0
  302. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_console.py +0 -0
  303. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
  304. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_credential.py +0 -0
  305. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/pra_portal.py +0 -0
  306. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/provisioning_keys.py +0 -0
  307. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/saml_attributes.py +0 -0
  308. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/scim_attributes.py +0 -0
  309. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/scim_groups.py +0 -0
  310. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/segment_group.py +0 -0
  311. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/server_group.py +0 -0
  312. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/service_edge_groups.py +0 -0
  313. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/service_edge_schedule.py +0 -0
  314. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/service_edges.py +0 -0
  315. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/models/trusted_network.py +0 -0
  316. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/policies.py +0 -0
  317. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/posture_profiles.py +0 -0
  318. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_approval.py +0 -0
  319. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_console.py +0 -0
  320. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_credential.py +0 -0
  321. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_credential_pool.py +0 -0
  322. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/pra_portal.py +0 -0
  323. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/provisioning.py +0 -0
  324. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/scim_attributes.py +0 -0
  325. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/scim_groups.py +0 -0
  326. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/server_groups.py +0 -0
  327. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/servers.py +0 -0
  328. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/service_edge_group.py +0 -0
  329. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/service_edge_schedule.py +0 -0
  330. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/service_edges.py +0 -0
  331. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zpa/trusted_networks.py +0 -0
  332. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/__init__.py +0 -0
  333. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/account_details.py +0 -0
  334. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/activation.py +0 -0
  335. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/admin_roles.py +0 -0
  336. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/admin_users.py +0 -0
  337. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/api_keys.py +0 -0
  338. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ec_groups.py +0 -0
  339. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/forwarding_gateways.py +0 -0
  340. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/forwarding_rules.py +0 -0
  341. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ip_destination_groups.py +0 -0
  342. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ip_groups.py +0 -0
  343. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ip_source_groups.py +0 -0
  344. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/legacy.py +0 -0
  345. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/location_management.py +0 -0
  346. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/location_template.py +0 -0
  347. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/activation.py +0 -0
  348. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/admin_roles.py +0 -0
  349. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/admin_users.py +0 -0
  350. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/api_keys.py +0 -0
  351. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/common.py +0 -0
  352. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ec_group_vm.py +0 -0
  353. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ecgroup.py +0 -0
  354. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/forwarding_gateways.py +0 -0
  355. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/forwarding_rules.py +0 -0
  356. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ip_destination_groups.py +0 -0
  357. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ip_groups.py +0 -0
  358. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/ip_source_groups.py +0 -0
  359. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/location_management.py +0 -0
  360. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/location_templates.py +0 -0
  361. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/nw_service.py +0 -0
  362. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/nw_service_groups.py +0 -0
  363. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/provisioning_url.py +0 -0
  364. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
  365. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/models/zpa_resources.py +0 -0
  366. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/nw_service.py +0 -0
  367. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/nw_service_groups.py +0 -0
  368. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/provisioning_url.py +0 -0
  369. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/ztw/ztw_service.py +0 -0
  370. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/__init__.py +0 -0
  371. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/audit_logs.py +0 -0
  372. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/dlp_incidents.py +0 -0
  373. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/legacy.py +0 -0
  374. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/audit_logs.py +0 -0
  375. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/change_history.py +0 -0
  376. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/common.py +0 -0
  377. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/generated_tickets.py +0 -0
  378. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_details.py +0 -0
  379. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_evidence.py +0 -0
  380. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_group_search.py +0 -0
  381. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_search.py +0 -0
  382. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.0}/zscaler/zwa/models/incident_trigger.py +0 -0
  383. {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.1.0
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:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zscaler-sdk-python"
3
- version = "1.1.0"
3
+ version = "1.2.0"
4
4
  description = "Official Python SDK for the Zscaler Products"
5
5
  authors = ["Zscaler, Inc. <devrel@zscaler.com>"]
6
6
  license = "MIT"
@@ -29,7 +29,7 @@ __license__ = "MIT"
29
29
  __contributors__ = [
30
30
  "William Guilherme",
31
31
  ]
32
- __version__ = "1.1.0"
32
+ __version__ = "1.2.0"
33
33
 
34
34
 
35
35
  from zscaler.oneapi_client import Client as ZscalerClient # noqa
@@ -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
- pass
24
+ def __init__(self, error):
25
+ # error is a ZscalerAPIError
26
+ super().__init__(error.url, error, error.message)
25
27
 
26
28
 
27
- # Zscaler Private Access specific exceptions (Potential Future Use)
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
- # Use Standard Session
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 or not hasattr(response, "status_code"):
298
- # If we truly got no response (should be rare unless network error)
299
- error_msg = "Request execution failed. Response is None."
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 (response, None) regardless of status code (including 429)
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 format
346
+ response_body (str): Response body in JSON or plain string
349
347
 
350
348
  Returns:
351
- Tuple(dict repr of response (if no error), any error found)
349
+ Tuple(dict or None, error or None)
352
350
  """
353
- # Check if response is JSON and parse it
354
- if "application/json" in response_details.headers.get("Content-Type", ""):
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
- logger.error(f"Error response from {url}: {response_details.status_code} - {formatted_response}")
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
- # check if call was succesful
372
- if 200 <= status_code <= 299:
373
- return (formatted_response, None)
374
- else:
375
- # create errors
376
- try:
377
- error = ZscalerAPIError(url, response_details, formatted_response)
378
- if HTTPClient.raise_exception:
379
- raise ZscalerAPIException(formatted_response)
380
- except ZscalerAPIException:
381
- raise
382
- except Exception:
383
- error = HTTPError(url, response_details, formatted_response)
384
- if HTTPClient.raise_exception:
385
- logger.exception(formatted_response)
386
- raise HTTPException(formatted_response)
387
- logger.error(error)
388
- return (None, error)
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 etc.).
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 not response:
331
- logger.error("Response is None after executing request.")
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 None, None, None, error
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