zscaler-sdk-python 1.1.0__tar.gz → 1.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/PKG-INFO +24 -1
  2. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/README.md +23 -0
  3. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/pyproject.toml +1 -1
  4. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/__init__.py +1 -1
  5. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/constants.py +1 -1
  6. zscaler_sdk_python-1.2.1/zscaler/errors/zscaler_api_error.py +55 -0
  7. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/exceptions/exceptions.py +4 -20
  8. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/logger.py +1 -1
  9. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_http_client.py +36 -42
  10. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_object.py +7 -21
  11. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_response.py +134 -29
  12. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/request_executor.py +15 -9
  13. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/utils.py +3 -0
  14. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/alert_subscriptions.py +70 -35
  15. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/bandwidth_classes.py +32 -26
  16. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall_dns.py +34 -16
  17. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall_ips.py +33 -16
  18. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall_rules.py +51 -27
  19. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dns_gatways.py +68 -12
  20. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/ftp_control_policy.py +14 -21
  21. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/legacy.py +24 -1
  22. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/admin_roles.py +4 -4
  23. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/advanced_settings.py +1 -2
  24. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/alert_subscriptions.py +2 -1
  25. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/bandwidth_control_rules.py +1 -13
  26. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_rules.py +1 -0
  27. zscaler_sdk_python-1.2.1/zscaler/zia/models/nat_control_policy.py +224 -0
  28. zscaler_sdk_python-1.2.1/zscaler/zia/models/nss_servers.py +63 -0
  29. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/proxies.py +0 -1
  30. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_dc_exclusions.py +6 -12
  31. zscaler_sdk_python-1.2.1/zscaler/zia/nat_control_policy.py +371 -0
  32. zscaler_sdk_python-1.2.1/zscaler/zia/nss_servers.py +304 -0
  33. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/proxies.py +1 -1
  34. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/sandbox_rules.py +55 -24
  35. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/ssl_inspection_rules.py +9 -6
  36. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/time_intervals.py +1 -1
  37. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_datacenters.py +16 -14
  38. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/url_filtering.py +55 -41
  39. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/zia_service.py +20 -0
  40. zscaler_sdk_python-1.2.1/zscaler/zpa/administrator_controller.py +295 -0
  41. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/application_segment.py +1 -1
  42. zscaler_sdk_python-1.2.1/zscaler/zpa/client_settings.py +209 -0
  43. zscaler_sdk_python-1.2.1/zscaler/zpa/customer_controller.py +153 -0
  44. zscaler_sdk_python-1.2.1/zscaler/zpa/enrollment_certificates.py +320 -0
  45. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/legacy.py +34 -4
  46. zscaler_sdk_python-1.2.1/zscaler/zpa/models/administrator_controller.py +181 -0
  47. zscaler_sdk_python-1.2.1/zscaler/zpa/models/client_settings.py +87 -0
  48. zscaler_sdk_python-1.2.1/zscaler/zpa/models/customer_controller.py +139 -0
  49. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/enrollment_certificates.py +13 -6
  50. zscaler_sdk_python-1.2.1/zscaler/zpa/models/role_controller.py +427 -0
  51. zscaler_sdk_python-1.2.1/zscaler/zpa/role_controller.py +285 -0
  52. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/saml_attributes.py +134 -1
  53. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/segment_groups.py +1 -1
  54. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/zpa_service.py +34 -4
  55. zscaler_sdk_python-1.1.0/zscaler/errors/zscaler_api_error.py +0 -28
  56. zscaler_sdk_python-1.1.0/zscaler/zpa/authdomains.py +0 -72
  57. zscaler_sdk_python-1.1.0/zscaler/zpa/enrollment_certificates.py +0 -140
  58. zscaler_sdk_python-1.1.0/zscaler/zpa/models/auth_domain.py +0 -37
  59. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/LICENSE.md +0 -0
  60. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/api_client.py +0 -0
  61. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/__init__.py +0 -0
  62. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/cache.py +0 -0
  63. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/no_op_cache.py +0 -0
  64. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/cache/zscaler_cache.py +0 -0
  65. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/config/__init__.py +0 -0
  66. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/config/config_setter.py +0 -0
  67. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/config/config_validator.py +0 -0
  68. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/error_messages.py +0 -0
  69. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/errors/__init__.py +0 -0
  70. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/errors/error.py +0 -0
  71. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/errors/http_error.py +0 -0
  72. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/exceptions/__init__.py +0 -0
  73. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/helpers.py +0 -0
  74. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_client.py +0 -0
  75. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_collection.py +0 -0
  76. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/oneapi_oauth_client.py +0 -0
  77. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ratelimiter/__init__.py +0 -0
  78. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ratelimiter/ratelimiter.py +0 -0
  79. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/user_agent.py +0 -0
  80. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/__init__.py +0 -0
  81. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/admin_user.py +0 -0
  82. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/company.py +0 -0
  83. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/devices.py +0 -0
  84. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/entitlements.py +0 -0
  85. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/fail_open_policy.py +0 -0
  86. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/forwarding_profile.py +0 -0
  87. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/legacy.py +0 -0
  88. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/manage_pass.py +0 -0
  89. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/admin_roles.py +0 -0
  90. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/admin_user.py +0 -0
  91. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/devices.py +0 -0
  92. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/failopenpolicy.py +0 -0
  93. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/forwardingprofile.py +0 -0
  94. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/manage_pass.py +0 -0
  95. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/secrets_otp.py +0 -0
  96. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/secrets_passwords.py +0 -0
  97. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/trustednetworks.py +0 -0
  98. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/webappservice.py +0 -0
  99. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/webpolicy.py +0 -0
  100. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/webprivacy.py +0 -0
  101. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
  102. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
  103. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/secrets.py +0 -0
  104. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/trusted_networks.py +0 -0
  105. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/web_app_service.py +0 -0
  106. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/web_policy.py +0 -0
  107. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/web_privacy.py +0 -0
  108. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zcc/zcc_service.py +0 -0
  109. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/__init__.py +0 -0
  110. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/admin.py +0 -0
  111. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/alerts.py +0 -0
  112. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/apps.py +0 -0
  113. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/devices.py +0 -0
  114. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/inventory.py +0 -0
  115. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/legacy.py +0 -0
  116. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/activeapplications.py +0 -0
  117. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/administration.py +0 -0
  118. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/alerts.py +0 -0
  119. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/application_users.py +0 -0
  120. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/applications.py +0 -0
  121. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/call_quality_metrics.py +0 -0
  122. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/common.py +0 -0
  123. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/devices.py +0 -0
  124. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/software_inventory.py +0 -0
  125. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/troubleshooting.py +0 -0
  126. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/models/users.py +0 -0
  127. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/troubleshooting.py +0 -0
  128. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/users.py +0 -0
  129. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zdx/zdx_service.py +0 -0
  130. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/__init__.py +0 -0
  131. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/activate.py +0 -0
  132. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/admin_roles.py +0 -0
  133. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/admin_users.py +0 -0
  134. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/advanced_settings.py +0 -0
  135. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/apptotal.py +0 -0
  136. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/atp_policy.py +0 -0
  137. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/audit_logs.py +0 -0
  138. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/authentication_settings.py +0 -0
  139. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/bandwidth_control_rules.py +0 -0
  140. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_app_instances.py +0 -0
  141. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_applications.py +0 -0
  142. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_apps.py +0 -0
  143. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_browser_isolation.py +0 -0
  144. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_firewall.py +0 -0
  145. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloud_nss.py +0 -0
  146. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/cloudappcontrol.py +0 -0
  147. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dedicated_ip_gateways.py +0 -0
  148. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/device_management.py +0 -0
  149. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_dictionary.py +0 -0
  150. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_engine.py +0 -0
  151. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_resources.py +0 -0
  152. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_templates.py +0 -0
  153. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/dlp_web_rules.py +0 -0
  154. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/end_user_notification.py +0 -0
  155. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/file_type_control_rule.py +0 -0
  156. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/forwarding_control.py +0 -0
  157. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/gre_tunnel.py +0 -0
  158. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/intermediate_certificates.py +0 -0
  159. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/iot_report.py +0 -0
  160. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/ipv6_config.py +0 -0
  161. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/locations.py +0 -0
  162. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/malware_protection_policy.py +0 -0
  163. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/mobile_threat_settings.py +0 -0
  164. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/__init__.py +0 -0
  165. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/activation.py +0 -0
  166. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/admin_users.py +0 -0
  167. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/advanced_threat_settings.py +0 -0
  168. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/apptotal.py +0 -0
  169. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/authentication_settings.py +0 -0
  170. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/bandwidth_classes.py +0 -0
  171. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_app_instances.py +0 -0
  172. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_app_policy.py +0 -0
  173. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
  174. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
  175. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
  176. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
  177. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
  178. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
  179. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
  180. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
  181. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
  182. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
  183. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
  184. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloud_nss.py +0 -0
  185. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/cloudappcontrol.py +0 -0
  186. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/common.py +0 -0
  187. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
  188. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/device_groups.py +0 -0
  189. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/devices.py +0 -0
  190. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_dictionary.py +0 -0
  191. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_engine.py +0 -0
  192. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_resources.py +0 -0
  193. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_templates.py +0 -0
  194. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dlp_web_rules.py +0 -0
  195. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/dns_gatways.py +0 -0
  196. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/endusernotification.py +0 -0
  197. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/filetyperules.py +0 -0
  198. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/forwarding_control_policy.py +0 -0
  199. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/ftp_control_policy.py +0 -0
  200. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_recommended_list.py +0 -0
  201. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_tunnel_info.py +0 -0
  202. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_tunnels.py +0 -0
  203. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/gre_vips.py +0 -0
  204. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/intermediate_certificates.py +0 -0
  205. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/iotreport.py +0 -0
  206. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/ipv6_config.py +0 -0
  207. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/location_group.py +0 -0
  208. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/location_management.py +0 -0
  209. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/malware_protection_settings.py +0 -0
  210. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/mobile_threat_settings.py +0 -0
  211. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/organization_information.py +0 -0
  212. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/pac_files.py +0 -0
  213. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/proxy_gatways.py +0 -0
  214. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/remoteassistance.py +0 -0
  215. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/risk_profiles.py +0 -0
  216. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/rule_labels.py +0 -0
  217. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/sandboxrules.py +0 -0
  218. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/security_policy_settings.py +0 -0
  219. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/shadow_it_report.py +0 -0
  220. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
  221. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/subclouds.py +0 -0
  222. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/system_audit.py +0 -0
  223. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
  224. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/time_intervals.py +0 -0
  225. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_datacenters.py +0 -0
  226. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_extranet.py +0 -0
  227. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_static_ip.py +0 -0
  228. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
  229. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
  230. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/url_filtering_rules.py +0 -0
  231. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/urlcategory.py +0 -0
  232. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/user_management.py +0 -0
  233. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/workload_groups.py +0 -0
  234. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/models/zpa_gateway.py +0 -0
  235. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/organization_information.py +0 -0
  236. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/pac_files.py +0 -0
  237. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/policy_export.py +0 -0
  238. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/remote_assistance.py +0 -0
  239. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/risk_profiles.py +0 -0
  240. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/rule_labels.py +0 -0
  241. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/sandbox.py +0 -0
  242. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/security_policy_settings.py +0 -0
  243. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/sub_clouds.py +0 -0
  244. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/system_audit.py +0 -0
  245. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/tenancy_restriction_profile.py +0 -0
  246. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_extranet.py +0 -0
  247. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_static_ip.py +0 -0
  248. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/traffic_vpn_credentials.py +0 -0
  249. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/url_categories.py +0 -0
  250. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/user_management.py +0 -0
  251. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/workload_groups.py +0 -0
  252. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zia/zpa_gateway.py +0 -0
  253. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/__init__.py +0 -0
  254. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_connector_groups.py +0 -0
  255. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_connector_schedule.py +0 -0
  256. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_connectors.py +0 -0
  257. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_protection.py +0 -0
  258. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_segment_by_type.py +0 -0
  259. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_segments_inspection.py +0 -0
  260. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/app_segments_pra.py +0 -0
  261. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_banner.py +0 -0
  262. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_certificate.py +0 -0
  263. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_profile.py +0 -0
  264. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_region.py +0 -0
  265. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cbi_zpa_profile.py +0 -0
  266. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/certificates.py +0 -0
  267. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/cloud_connector_groups.py +0 -0
  268. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/customer_version_profile.py +0 -0
  269. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/emergency_access.py +0 -0
  270. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/idp.py +0 -0
  271. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/lss.py +0 -0
  272. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/machine_groups.py +0 -0
  273. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/microtenants.py +0 -0
  274. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_connector_groups.py +0 -0
  275. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_connector_schedule.py +0 -0
  276. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_connectors.py +0 -0
  277. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_protection.py +0 -0
  278. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/app_protection_predefined_controls.py +0 -0
  279. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_segment.py +0 -0
  280. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_segment_inspection.py +0 -0
  281. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_segment_pra.py +0 -0
  282. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/application_servers.py +0 -0
  283. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_banner.py +0 -0
  284. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_certificate.py +0 -0
  285. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_profile.py +0 -0
  286. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_region.py +0 -0
  287. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
  288. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/certificates.py +0 -0
  289. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
  290. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/common.py +0 -0
  291. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/customer_version_profile.py +0 -0
  292. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/emergency_access.py +0 -0
  293. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/idp.py +0 -0
  294. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/lss.py +0 -0
  295. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/machine_groups.py +0 -0
  296. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/microtenants.py +0 -0
  297. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
  298. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/policyset_controller_v2.py +0 -0
  299. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/posture_profiles.py +0 -0
  300. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_approval.py +0 -0
  301. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_console.py +0 -0
  302. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
  303. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_credential.py +0 -0
  304. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/pra_portal.py +0 -0
  305. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/provisioning_keys.py +0 -0
  306. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/saml_attributes.py +0 -0
  307. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/scim_attributes.py +0 -0
  308. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/scim_groups.py +0 -0
  309. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/segment_group.py +0 -0
  310. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/server_group.py +0 -0
  311. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/service_edge_groups.py +0 -0
  312. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/service_edge_schedule.py +0 -0
  313. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/service_edges.py +0 -0
  314. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/models/trusted_network.py +0 -0
  315. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/policies.py +0 -0
  316. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/posture_profiles.py +0 -0
  317. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_approval.py +0 -0
  318. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_console.py +0 -0
  319. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_credential.py +0 -0
  320. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_credential_pool.py +0 -0
  321. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/pra_portal.py +0 -0
  322. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/provisioning.py +0 -0
  323. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/scim_attributes.py +0 -0
  324. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/scim_groups.py +0 -0
  325. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/server_groups.py +0 -0
  326. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/servers.py +0 -0
  327. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/service_edge_group.py +0 -0
  328. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/service_edge_schedule.py +0 -0
  329. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/service_edges.py +0 -0
  330. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zpa/trusted_networks.py +0 -0
  331. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/__init__.py +0 -0
  332. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/account_details.py +0 -0
  333. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/activation.py +0 -0
  334. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/admin_roles.py +0 -0
  335. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/admin_users.py +0 -0
  336. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/api_keys.py +0 -0
  337. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ec_groups.py +0 -0
  338. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/forwarding_gateways.py +0 -0
  339. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/forwarding_rules.py +0 -0
  340. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ip_destination_groups.py +0 -0
  341. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ip_groups.py +0 -0
  342. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ip_source_groups.py +0 -0
  343. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/legacy.py +0 -0
  344. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/location_management.py +0 -0
  345. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/location_template.py +0 -0
  346. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/activation.py +0 -0
  347. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/admin_roles.py +0 -0
  348. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/admin_users.py +0 -0
  349. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/api_keys.py +0 -0
  350. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/common.py +0 -0
  351. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ec_group_vm.py +0 -0
  352. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ecgroup.py +0 -0
  353. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/forwarding_gateways.py +0 -0
  354. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/forwarding_rules.py +0 -0
  355. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ip_destination_groups.py +0 -0
  356. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ip_groups.py +0 -0
  357. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/ip_source_groups.py +0 -0
  358. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/location_management.py +0 -0
  359. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/location_templates.py +0 -0
  360. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/nw_service.py +0 -0
  361. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/nw_service_groups.py +0 -0
  362. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/provisioning_url.py +0 -0
  363. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
  364. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/models/zpa_resources.py +0 -0
  365. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/nw_service.py +0 -0
  366. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/nw_service_groups.py +0 -0
  367. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/provisioning_url.py +0 -0
  368. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/ztw/ztw_service.py +0 -0
  369. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/__init__.py +0 -0
  370. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/audit_logs.py +0 -0
  371. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/dlp_incidents.py +0 -0
  372. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/legacy.py +0 -0
  373. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/audit_logs.py +0 -0
  374. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/change_history.py +0 -0
  375. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/common.py +0 -0
  376. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/generated_tickets.py +0 -0
  377. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_details.py +0 -0
  378. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_evidence.py +0 -0
  379. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_group_search.py +0 -0
  380. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_search.py +0 -0
  381. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/models/incident_trigger.py +0 -0
  382. {zscaler_sdk_python-1.1.0 → zscaler_sdk_python-1.2.1}/zscaler/zwa/zwa_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zscaler-sdk-python
3
- Version: 1.1.0
3
+ Version: 1.2.1
4
4
  Summary: Official Python SDK for the Zscaler Products
5
5
  Home-page: https://github.com/zscaler/zscaler-sdk-python
6
6
  License: MIT
@@ -620,6 +620,29 @@ You should now see logs in your console. Notice that API Credentials i.e `client
620
620
 
621
621
  What it being logged? `requests`, `responses`, `http errors`, `caching responses`.
622
622
 
623
+ ### Using Your Own Logger (Optional)
624
+ If your script defines its own logging configuration (e.g., for file or custom formatting), the SDK will not interfere with it. You can continue using your own logger like this:
625
+
626
+ ```py
627
+ import logging
628
+
629
+ my_logger = logging.getLogger("my_app_logger")
630
+ my_logger.setLevel(logging.INFO)
631
+ handler = logging.StreamHandler()
632
+ handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
633
+ my_logger.addHandler(handler)
634
+
635
+ my_logger.info("This is your app-level log, independent from the SDK.")
636
+ ```
637
+
638
+ To control SDK logging separately, use:
639
+
640
+ ```py
641
+ logging.getLogger("zscaler-sdk-python").setLevel(logging.WARNING) # or .ERROR to silence SDK logs
642
+ ```
643
+
644
+ The SDK will never globally disable logging or interfere with your existing logging configuration.
645
+
623
646
  ## Configuration reference
624
647
 
625
648
  This library looks for configuration in the following sources:
@@ -581,6 +581,29 @@ You should now see logs in your console. Notice that API Credentials i.e `client
581
581
 
582
582
  What it being logged? `requests`, `responses`, `http errors`, `caching responses`.
583
583
 
584
+ ### Using Your Own Logger (Optional)
585
+ If your script defines its own logging configuration (e.g., for file or custom formatting), the SDK will not interfere with it. You can continue using your own logger like this:
586
+
587
+ ```py
588
+ import logging
589
+
590
+ my_logger = logging.getLogger("my_app_logger")
591
+ my_logger.setLevel(logging.INFO)
592
+ handler = logging.StreamHandler()
593
+ handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
594
+ my_logger.addHandler(handler)
595
+
596
+ my_logger.info("This is your app-level log, independent from the SDK.")
597
+ ```
598
+
599
+ To control SDK logging separately, use:
600
+
601
+ ```py
602
+ logging.getLogger("zscaler-sdk-python").setLevel(logging.WARNING) # or .ERROR to silence SDK logs
603
+ ```
604
+
605
+ The SDK will never globally disable logging or interfere with your existing logging configuration.
606
+
584
607
  ## Configuration reference
585
608
 
586
609
  This library looks for configuration in the following sources:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zscaler-sdk-python"
3
- version = "1.1.0"
3
+ version = "1.2.1"
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.1"
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
@@ -121,4 +121,4 @@ def dump_response(
121
121
  if response_body and response_body != "" and response_body != "null":
122
122
  log_lines.append(f"\n{response_body}")
123
123
  log_lines.append("-" * 68)
124
- logger.info("\n".join(log_lines))
124
+ 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):
@@ -13,27 +13,13 @@ class ZscalerObject:
13
13
  def __repr__(self):
14
14
  return str(vars(self))
15
15
 
16
- # def as_dict(self):
17
- # """
18
- # Returns dictionary object of ZscalerObject with keys in snake_case for user-facing output.
19
- # """
20
- # result = {}
21
- # for key, val in self.request_format().items():
22
- # if val is None:
23
- # continue
24
- # if isinstance(val, list):
25
- # formatted_list = []
26
- # for item in val:
27
- # if isinstance(item, ZscalerObject):
28
- # formatted_list.append(item.as_dict()) # Recursive call for nested objects
29
- # else:
30
- # formatted_list.append(item)
31
- # result[to_snake_case(key)] = formatted_list # Convert key to snake_case
32
- # elif not isinstance(val, ZscalerObject):
33
- # result[to_snake_case(key)] = val # Convert key to snake_case for simple types
34
- # else:
35
- # result[to_snake_case(key)] = val.as_dict() # Convert nested objects
36
- # return result
16
+ def __getitem__(self, key):
17
+ if hasattr(self, key):
18
+ return getattr(self, key)
19
+ raise KeyError(f"{key} not found in {self.__class__.__name__}")
20
+
21
+ def __contains__(self, key):
22
+ return hasattr(self, key)
37
23
 
38
24
  def as_dict(self):
39
25
  result = {}
@@ -26,8 +26,6 @@ class ZscalerAPIResponse:
26
26
  res_details=None,
27
27
  response_body="",
28
28
  data_type=None,
29
- # max_items=None,
30
- # max_pages=None,
31
29
  all_entries=False,
32
30
  sort_order=None,
33
31
  sort_by=None,
@@ -181,6 +179,46 @@ class ZscalerAPIResponse:
181
179
  self._items_fetched += len(self._list)
182
180
  self._pages_fetched += 1
183
181
 
182
+ # def _build_json_response(self, response_body):
183
+ # """
184
+ # Converts JSON response text into Python dictionary.
185
+ # Ensures consistent model conversion for all pages.
186
+ # """
187
+ # self._body = json.loads(response_body)
188
+
189
+ # # Extract the list based on service type
190
+ # if isinstance(self._body, list):
191
+ # self._list = self._body
192
+ # elif self._service_type == "ZDX":
193
+ # self._list = self._body.get("items", [])
194
+ # self._next_offset = self._body.get("next_offset")
195
+ # else:
196
+ # self._list = self._body.get("list", [])
197
+ # if self._service_type == "ZPA":
198
+ # self._total_pages = int(self._body.get("totalPages", 1))
199
+ # self._total_count = int(self._body.get("totalCount", 0))
200
+
201
+ # # Clean and convert items
202
+ # cleaned_list = []
203
+ # for item in self._list:
204
+ # if not isinstance(item, dict):
205
+ # logger.warning("Non-dict item found in response list, skipping: %s", item)
206
+ # continue
207
+
208
+ # # Convert to model if type is specified
209
+ # if self._type:
210
+ # try:
211
+ # cleaned_list.append(self._type(**item))
212
+ # except Exception as e:
213
+ # logger.error("Failed to convert item to model: %s", e)
214
+ # cleaned_list.append(item)
215
+ # else:
216
+ # cleaned_list.append(item)
217
+
218
+ # self._list = cleaned_list
219
+ # self._items_fetched += len(self._list)
220
+ # self._pages_fetched += 1
221
+
184
222
  def get_results(self):
185
223
  """
186
224
  Returns the current page of results.
@@ -198,36 +236,104 @@ class ZscalerAPIResponse:
198
236
  """
199
237
  return self._has_next()
200
238
 
201
- def next(self):
202
- """
203
- Fetch the next page of results if available.
204
-
205
- Returns:
206
- tuple: (list of items, error)
239
+ # def next(self):
240
+ # """
241
+ # Fetch the next page of results if available.
242
+
243
+ # Returns:
244
+ # tuple: (list of items, error)
245
+
246
+ # If there's an error fetching the next page, returns (None, error).
247
+ # If no more pages exist, returns (None, None).
248
+ # """
249
+ # if not self.has_next():
250
+ # logger.debug("No further pages to retrieve.")
251
+ # return (None, None)
252
+
253
+ # next_page_results = self._fetch_next_page()
254
+ # if next_page_results is None:
255
+ # # An error occurred, already logged
256
+ # return (None, ValueError("Error fetching next page."))
257
+ # if not next_page_results:
258
+ # # Empty result means no more data
259
+ # return (None, None)
260
+ # return (next_page_results, None)
261
+
262
+ ### Latest working function
263
+ # def next(self):
264
+ # if not self.has_next():
265
+ # raise StopIteration("No more pages available.")
266
+
267
+ # results, error = self._fetch_next_page()
268
+ # if error:
269
+ # return None, error
270
+ # if not results:
271
+ # return None, None
272
+
273
+ # if self._type:
274
+ # try:
275
+ # results = [self._type(item) for item in results if isinstance(item, dict)]
276
+ # except Exception as wrap_error:
277
+ # logger.warning(f"Failed to wrap pagination results with {self._type}: {wrap_error}")
278
+
279
+ # return results, None
207
280
 
208
- If there's an error fetching the next page, returns (None, error).
209
- If no more pages exist, returns (None, None).
210
- """
281
+ def next(self):
211
282
  if not self.has_next():
212
- logger.debug("No further pages to retrieve.")
213
- return (None, None)
214
-
215
- next_page_results = self._fetch_next_page()
216
- if next_page_results is None:
217
- # An error occurred, already logged
218
- return (None, ValueError("Error fetching next page."))
219
- if not next_page_results:
220
- # Empty result means no more data
221
- return (None, None)
222
- return (next_page_results, None)
283
+ raise StopIteration("No more pages available.")
284
+
285
+ results, error = self._fetch_next_page()
286
+ if error:
287
+ return None, self, error
288
+ if not results:
289
+ return None, self, None
290
+
291
+ if self._type:
292
+ try:
293
+ results = [self._type(item) for item in results if isinstance(item, dict)]
294
+ except Exception as wrap_error:
295
+ logger.warning(f"Failed to wrap pagination results with {self._type}: {wrap_error}")
296
+
297
+ return results, self, None
298
+
299
+
300
+ # def _fetch_next_page(self):
301
+ # """
302
+ # Internal method that fetches and returns the next page of results.
303
+ # """
304
+ # if not self._has_next():
305
+ # logger.debug("No more pages to fetch")
306
+ # return []
307
+
308
+ # if self._service_type == "ZDX":
309
+ # self._params["offset"] = self._next_offset
310
+ # else:
311
+ # self._page += 1
312
+ # self._params["page"] = self._page
313
+
314
+ # logger.debug(f"Requesting next page with params: {self._params}")
315
+
316
+ # req = {
317
+ # "method": "GET",
318
+ # "url": self._url,
319
+ # "headers": self._headers,
320
+ # "params": self._params,
321
+ # "uuid": uuid.uuid4(),
322
+ # }
323
+ # _, _, response_body, error = self._request_executor.fire_request(req)
324
+
325
+ # if error:
326
+ # logger.error(f"Error fetching the next page: {error}")
327
+ # return None
328
+
329
+ # # Rebuild the response body for the next page
330
+ # self._build_json_response(response_body)
331
+ # return self._list
223
332
 
224
333
  def _fetch_next_page(self):
225
- """
226
- Internal method that fetches and returns the next page of results.
227
- """
228
334
  if not self._has_next():
229
335
  logger.debug("No more pages to fetch")
230
- return []
336
+ return [], None
231
337
 
232
338
  if self._service_type == "ZDX":
233
339
  self._params["offset"] = self._next_offset
@@ -248,11 +354,10 @@ class ZscalerAPIResponse:
248
354
 
249
355
  if error:
250
356
  logger.error(f"Error fetching the next page: {error}")
251
- return None
357
+ return None, error
252
358
 
253
- # Rebuild the response body for the next page
254
359
  self._build_json_response(response_body)
255
- return self._list
360
+ return self._list, None
256
361
 
257
362
  def _has_next(self):
258
363
  # Check max_items or max_pages constraints
@@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
20
20
 
21
21
  class RequestExecutor:
22
22
  """
23
- This class handles all of the requests sent by the Zscaler SDK Client (ZIA, ZPA, ZCC, ZDX, ZWA 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
  )