streamsets 7.0.2__tar.gz → 7.0.3.dev1__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 (403) hide show
  1. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/PKG-INFO +1 -1
  2. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/jobs_instances.rst +31 -0
  3. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/__version__.py +1 -1
  4. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sch.py +39 -14
  5. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sch_api.py +10 -2
  6. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sch_models.py +23 -10
  7. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/utils.py +15 -2
  8. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/PKG-INFO +1 -1
  9. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_jobs.py +55 -0
  10. streamsets-7.0.3.dev1/tests/unit/test_jobs.py +119 -0
  11. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_sch.py +60 -0
  12. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_seekable_list.py +34 -0
  13. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tox.ini +1 -0
  14. streamsets-7.0.2/tests/unit/test_jobs.py +0 -33
  15. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/.gitignore +0 -0
  16. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/Dockerfile +0 -0
  17. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/HISTORY.rst +0 -0
  18. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/MANIFEST.in +0 -0
  19. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/Makefile +0 -0
  20. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/README.rst +0 -0
  21. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/build-publish/Jenkinsfile +0 -0
  22. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/build_requirements.txt +0 -0
  23. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/TopologyMissingNodes.png +0 -0
  24. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/TopologyMultipleJobsSingleSystem.png +0 -0
  25. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/TopologyRestoredNodes.png +0 -0
  26. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/add_snowflake_credentials.png +0 -0
  27. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/click_snowflake_settings.png +0 -0
  28. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/css/docs_theme.css +0 -0
  29. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_data_generator_to_trash.png +0 -0
  30. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_data_generator_to_two_trashes.png +0 -0
  31. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_data_generator_with_events.png +0 -0
  32. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_raw_data_source_help.png +0 -0
  33. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_raw_data_to_trash.png +0 -0
  34. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/favicon.ico +0 -0
  35. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/file_tail_to_two_trashes.png +0 -0
  36. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/full-ibm-streamsets-logo.svg +0 -0
  37. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/add_frag_to_pipeline.png +0 -0
  38. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/connect_event_lane.png +0 -0
  39. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/delete_connection.png +0 -0
  40. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/edit_configuration.png +0 -0
  41. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/error_records_configuration.png +0 -0
  42. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/error_records_main.png +0 -0
  43. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/existing_pipelines.png +0 -0
  44. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/fragment_canvas.png +0 -0
  45. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/fragment_ui.png +0 -0
  46. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/multi_output_stages_complete.png +0 -0
  47. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/multi_output_stages_incomplete.png +0 -0
  48. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipeline_canvas.png +0 -0
  49. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipeline_check_in.png +0 -0
  50. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipeline_ui.png +0 -0
  51. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipelines_using_fragment.png +0 -0
  52. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/produce_events.png +0 -0
  53. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/remove_stage.png +0 -0
  54. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/selector_four_conditions.png +0 -0
  55. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/snowflake_required_parameters.png +0 -0
  56. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/stages_unconnected.png +0 -0
  57. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/stages_with_different_types.png +0 -0
  58. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/update_pipeline_with_frag.png +0 -0
  59. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/value_chooser__JSON_content.png +0 -0
  60. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/activate_deactivate_credentials.png +0 -0
  61. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/adding_credentials.png +0 -0
  62. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/delete_credentials.png +0 -0
  63. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/regenerating_auth_token.png +0 -0
  64. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/renaming_credentials.png +0 -0
  65. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/add_new_permissions.png +0 -0
  66. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/change_owner.png +0 -0
  67. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/delete_permissions.png +0 -0
  68. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/share_button.png +0 -0
  69. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/share_settings.png +0 -0
  70. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/projects/create_project.png +0 -0
  71. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/projects/switch_projects.png +0 -0
  72. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/activate_user.png +0 -0
  73. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/add_new_group.png +0 -0
  74. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/add_new_user.png +0 -0
  75. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/deactivate_user.png +0 -0
  76. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/delete_group.png +0 -0
  77. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/delete_user.png +0 -0
  78. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/groups_list.png +0 -0
  79. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/invite_user_details.png +0 -0
  80. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/new_group_details.png +0 -0
  81. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/project_roles.png +0 -0
  82. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/update_group_details.png +0 -0
  83. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/update_user_details.png +0 -0
  84. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/users_list.png +0 -0
  85. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/activate_sequence.png +0 -0
  86. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/add_job_modal.png +0 -0
  87. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/add_jobs_to_job_sequence.png +0 -0
  88. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/create_job_sequence.png +0 -0
  89. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/delete_draftrun_ui.png +0 -0
  90. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/delete_job_sequence.png +0 -0
  91. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/disable_sequence.png +0 -0
  92. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/draftrun_ui.png +0 -0
  93. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/get_job_sequence_steps.png +0 -0
  94. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/get_job_sequences.png +0 -0
  95. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/logs_ui.png +0 -0
  96. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/move_step.png +0 -0
  97. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/snapshots_ui.png +0 -0
  98. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/start_draftrun_ui.png +0 -0
  99. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/stop_draftrun_ui.png +0 -0
  100. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/three_dots_sequence.png +0 -0
  101. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/view_history.png +0 -0
  102. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Mark_Favorite.png +0 -0
  103. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Query_Builder.png +0 -0
  104. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Remove.png +0 -0
  105. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Save_Search.png +0 -0
  106. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Saved_Searches.png +0 -0
  107. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Search_Name_Wizard.png +0 -0
  108. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Update.png +0 -0
  109. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/Search_Advanced.png +0 -0
  110. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/configuring_connection.png +0 -0
  111. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/create_connection.png +0 -0
  112. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/deleting_connection.png +0 -0
  113. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/editing_connection.png +0 -0
  114. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/get_connection.png +0 -0
  115. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/pipelines_using_connection.png +0 -0
  116. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/using_connection.png +0 -0
  117. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/verify_connection.png +0 -0
  118. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/azure_vm_deployments/creation_configure_azure_vm_autoscaling_group.png +0 -0
  119. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/azure_vm_deployments/creation_configure_azure_vm_ssh_access.png +0 -0
  120. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/azure_vm_deployments/creation_configure_azure_vm_zone.png +0 -0
  121. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/azure_vm_deployments/creation_define_deployment_sdc.png +0 -0
  122. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/azure_vm_deployments/creation_define_deployment_transformer.png +0 -0
  123. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/azure_vm_deployments/creation_review_and_launch.png +0 -0
  124. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/configure_install_type_docker.png +0 -0
  125. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/configure_install_type_tarball.png +0 -0
  126. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/creation_configure_engine_stage_lib_selection_as_a_list.png +0 -0
  127. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/creation_configure_engine_stage_lib_selection_screen.png +0 -0
  128. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/creation_configure_engine_transformer_stage_lib_selection_as_a_list.png +0 -0
  129. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/creation_configure_engine_transformer_stage_lib_selection_screen.png +0 -0
  130. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/creation_share_deployment.png +0 -0
  131. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_configure_ec2_autoscaling_group.png +0 -0
  132. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_configure_ec2_ssh_access.png +0 -0
  133. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_configure_engine.png +0 -0
  134. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_define_deployment.png +0 -0
  135. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_review_and_launch.png +0 -0
  136. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_share_deployment.png +0 -0
  137. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_transformer_define_deployment.png +0 -0
  138. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_engine.png +0 -0
  139. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_gce_autoscaling_group.png +0 -0
  140. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_gce_region.png +0 -0
  141. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_gce_ssh_access.png +0 -0
  142. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_gce_zone.png +0 -0
  143. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_define_deployment_sdc.png +0 -0
  144. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_define_deployment_transformer.png +0 -0
  145. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_review_and_launch.png +0 -0
  146. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/kubernetes_agent_offline.png +0 -0
  147. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/kubernetes_status_deactivation_error.png +0 -0
  148. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_configure_deployment_wizard.png +0 -0
  149. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_configure_kubernetes_wizard.png +0 -0
  150. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_create_deployment_wizard.png +0 -0
  151. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_jdbc_version_wizard.png +0 -0
  152. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_review_launch_wizard.png +0 -0
  153. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_stage_libs_wizard.png +0 -0
  154. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_configure_deployment_wizard.png +0 -0
  155. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_create_deployment_wizard.png +0 -0
  156. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_jdbc_version_wizard.png +0 -0
  157. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_stage_libs_wizard.png +0 -0
  158. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_configure_engine.png +0 -0
  159. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_define_deployment_sdc.png +0 -0
  160. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_define_deployment_transformer.png +0 -0
  161. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_review_and_launch_sdc.png +0 -0
  162. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_review_and_launch_transformer.png +0 -0
  163. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_share_deployment.png +0 -0
  164. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/get_install_script.png +0 -0
  165. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/select_install_type.png +0 -0
  166. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_configure_engine_configure_access_keys.png +0 -0
  167. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_configure_engine_configure_aws_subnets.png +0 -0
  168. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_configure_engine_configure_aws_vpc.png +0 -0
  169. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_configure_engine_configure_cross_account_role.png +0 -0
  170. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_configure_engine_select_aws_region.png +0 -0
  171. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_define_environment.png +0 -0
  172. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_review_and_activate_environment.png +0 -0
  173. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_share_environment.png +0 -0
  174. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_configure_engine_configure_azure_credentials.png +0 -0
  175. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_configure_engine_configure_azure_region.png +0 -0
  176. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_configure_engine_configure_azure_subnet.png +0 -0
  177. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_configure_engine_configure_azure_vnet.png +0 -0
  178. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_configure_engine_defaults_azure_vm_instances.png +0 -0
  179. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_define_environment.png +0 -0
  180. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_review_and_activate_environment.png +0 -0
  181. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_configure_credentials_service_account_impersonation.png +0 -0
  182. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_configure_credentials_service_account_key.png +0 -0
  183. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_configure_gcp_project.png +0 -0
  184. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_define_environment.png +0 -0
  185. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_review_and_activate.png +0 -0
  186. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_select_gcp_vpc.png +0 -0
  187. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_share_environment.png +0 -0
  188. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/activate_and_install_wizard.png +0 -0
  189. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/configure_environment_wizard.png +0 -0
  190. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/create_environment_wizard.png +0 -0
  191. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/installation_script_wizard.png +0 -0
  192. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/managing_environments/managing_environments.png +0 -0
  193. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/self_managed_environments/creation_define_environment.png +0 -0
  194. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/self_managed_environments/creation_review_and_activate.png +0 -0
  195. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/self_managed_environments/creation_share_environment.png +0 -0
  196. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/welcome/api_credentials.png +0 -0
  197. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/welcome/examples/find_sdc_id.png +0 -0
  198. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sample_fragment.png +0 -0
  199. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sample_pipeline_using_fragment.png +0 -0
  200. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/saved_snowflake_credential.png +0 -0
  201. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_pipeline1.png +0 -0
  202. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_self_managed_deployment.png +0 -0
  203. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_self_managed_deployment_details.png +0 -0
  204. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_self_managed_environment.png +0 -0
  205. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/snowflake_credentials_modal.png +0 -0
  206. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/snowflake_pipeline_defaults.png +0 -0
  207. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/advanced_search.rst +0 -0
  208. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/api/sch_api.rst +0 -0
  209. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/api.rst +0 -0
  210. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/code_generation.rst +0 -0
  211. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/creating_pipelines.rst +0 -0
  212. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/editing_pipelines.rst +0 -0
  213. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/error_record_handling.rst +0 -0
  214. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/pipeline_fragments.rst +0 -0
  215. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build.rst +0 -0
  216. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/conf.py +0 -0
  217. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/index.rst +0 -0
  218. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/http_retry_management.rst +0 -0
  219. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/projects/projects.rst +0 -0
  220. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/api_credentials.rst +0 -0
  221. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/managing_users_and_groups.rst +0 -0
  222. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/permissions.rst +0 -0
  223. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/roles.rst +0 -0
  224. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/users_and_groups.rst +0 -0
  225. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage.rst +0 -0
  226. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/monitor/subscriptions.rst +0 -0
  227. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/monitor/topologies.rst +0 -0
  228. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/monitor.rst +0 -0
  229. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/requirements.txt +0 -0
  230. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/draft_runs.rst +0 -0
  231. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/job_sequences.rst +0 -0
  232. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/job_templates.rst +0 -0
  233. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/scheduled_tasks.rst +0 -0
  234. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run.rst +0 -0
  235. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/search/saql_saved_search.rst +0 -0
  236. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/search/search_for_object.rst +0 -0
  237. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/set_up.rst +0 -0
  238. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/engine_types.rst +0 -0
  239. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/connections/connections.rst +0 -0
  240. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/azure_vm_deployments.rst +0 -0
  241. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/deployments.rst +0 -0
  242. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/ec2_deployments.rst +0 -0
  243. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/gce_deployments.rst +0 -0
  244. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/kubernetes_deployments.rst +0 -0
  245. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/self_managed_deployments.rst +0 -0
  246. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/stage_libs_sdc.rst +0 -0
  247. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/stage_libs_st.rst +0 -0
  248. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/aws_environments.rst +0 -0
  249. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/azure_environments.rst +0 -0
  250. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/environments.rst +0 -0
  251. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/gcp_environments.rst +0 -0
  252. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/kubernetes_environments.rst +0 -0
  253. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/managing_environments.rst +0 -0
  254. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/self_managed_environments.rst +0 -0
  255. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/authentication.rst +0 -0
  256. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/best_practices/http_retry.rst +0 -0
  257. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/best_practices.rst +0 -0
  258. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/examples/sdk_examples_job_pipeline.rst +0 -0
  259. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/examples/sdk_examples_self_managed_deployment.rst +0 -0
  260. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/examples.rst +0 -0
  261. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/installation.rst +0 -0
  262. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/known_issues.rst +0 -0
  263. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/overview.rst +0 -0
  264. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/release_notes.rst +0 -0
  265. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome.rst +0 -0
  266. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/.flake8 +0 -0
  267. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/.pre-commit-config.yaml +0 -0
  268. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/Dockerfile +0 -0
  269. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/Jenkinsfile +0 -0
  270. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/pyproject.toml +0 -0
  271. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/pyproject.toml +0 -0
  272. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/requirements.txt +0 -0
  273. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/setup.cfg +0 -0
  274. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/sonar-project.properties +0 -0
  275. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/__init__.py +0 -0
  276. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/analytics.py +0 -0
  277. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/aster_api.py +0 -0
  278. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/__init__.py +0 -0
  279. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/generator.py +0 -0
  280. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/preambles/__init__.py +0 -0
  281. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/preambles/pipeline_preamble.py +0 -0
  282. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/__init__.py +0 -0
  283. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/pipeline_processor/__init__.py +0 -0
  284. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/pipeline_processor/pipeline_graph.py +0 -0
  285. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/pipeline_processor/pipeline_processor.py +0 -0
  286. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/processor.py +0 -0
  287. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/__init__.py +0 -0
  288. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/json_file_source.py +0 -0
  289. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/pipeline_object_source.py +0 -0
  290. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/source.py +0 -0
  291. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/zip_archive_source.py +0 -0
  292. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/constants.py +0 -0
  293. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/exceptions.py +0 -0
  294. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/models.py +0 -0
  295. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/retry.py +0 -0
  296. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sdc.py +0 -0
  297. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sdc_api.py +0 -0
  298. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sdc_models.py +0 -0
  299. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/st.py +0 -0
  300. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/st_api.py +0 -0
  301. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/st_models.py +0 -0
  302. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/SOURCES.txt +0 -0
  303. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/dependency_links.txt +0 -0
  304. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/not-zip-safe +0 -0
  305. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/requires.txt +0 -0
  306. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/top_level.txt +0 -0
  307. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/test_requirements.txt +0 -0
  308. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/__init__.py +0 -0
  309. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/__init__.py +0 -0
  310. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/codegen/__init__.py +0 -0
  311. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/codegen/test_python_generator.py +0 -0
  312. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/conftest.py +0 -0
  313. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_acl.py +0 -0
  314. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_analytics.py +0 -0
  315. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_api_credentials.py +0 -0
  316. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_connections.py +0 -0
  317. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_dpath.py +0 -0
  318. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_draft_runs.py +0 -0
  319. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_ec2_environments.py +0 -0
  320. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_engineless_design.py +0 -0
  321. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_job_sequences.py +0 -0
  322. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_kubernetes_environments.py +0 -0
  323. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_metering.py +0 -0
  324. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_organization.py +0 -0
  325. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pagination.py +0 -0
  326. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipeline_fragments.py +0 -0
  327. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipeline_labels.py +0 -0
  328. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipeline_parameters.py +0 -0
  329. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipelines.py +0 -0
  330. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_projects.py +0 -0
  331. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_saql.py +0 -0
  332. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_saql_search.py +0 -0
  333. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_sch.py +0 -0
  334. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_scheduled_tasks.py +0 -0
  335. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_scheduler.py +0 -0
  336. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_self_managed_deployments.py +0 -0
  337. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_jobs.py +0 -0
  338. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipeline_fragments.py +0 -0
  339. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipeline_labels.py +0 -0
  340. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipeline_parameters.py +0 -0
  341. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipelines.py +0 -0
  342. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_stages.py +0 -0
  343. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_subscription.py +0 -0
  344. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_topology.py +0 -0
  345. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_users_and_groups.py +0 -0
  346. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/utils.py +0 -0
  347. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/mocks/__init__.py +0 -0
  348. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/mocks/mock_api.py +0 -0
  349. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/__init__.py +0 -0
  350. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/__init__.py +0 -0
  351. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/conftest.py +0 -0
  352. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_pipeline_graph.py +0 -0
  353. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_pipeline_preamble.py +0 -0
  354. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_pipeline_processor.py +0 -0
  355. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_sources.py +0 -0
  356. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_utils.py +0 -0
  357. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/conftest.py +0 -0
  358. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/__init__.py +0 -0
  359. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/base_model_data.py +0 -0
  360. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/codegen/dev_to_trash_with_event.json +0 -0
  361. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/codegen/jdbc_pipeline_test.zip +0 -0
  362. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/codegen/jdbc_with_stream_selector.json +0 -0
  363. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/configuration_data.py +0 -0
  364. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/conftest_data.py +0 -0
  365. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/connections_data.py +0 -0
  366. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/engines_data.py +0 -0
  367. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/job.py +0 -0
  368. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/job_sequence_data.py +0 -0
  369. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/job_sequence_step_data.py +0 -0
  370. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/jobs_data.py +0 -0
  371. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/pipeline_builder_data.py +0 -0
  372. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/projects.py +0 -0
  373. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/sch_data.py +0 -0
  374. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/scheduled_tasks_data.py +0 -0
  375. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/self_managed_deployments_data.py +0 -0
  376. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/utils_data.py +0 -0
  377. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_analytics.py +0 -0
  378. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_azure_environment.py +0 -0
  379. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_base_model.py +0 -0
  380. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_collection_model.py +0 -0
  381. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_configuration.py +0 -0
  382. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_connections.py +0 -0
  383. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_deployment_builder.py +0 -0
  384. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_engine_api.py +0 -0
  385. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_engine_types.py +0 -0
  386. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_engines.py +0 -0
  387. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_http_retry.py +0 -0
  388. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_job_builder.py +0 -0
  389. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_job_sequence.py +0 -0
  390. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_job_sequence_builder.py +0 -0
  391. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_mutable_kwargs.py +0 -0
  392. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_permission.py +0 -0
  393. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_pipeline.py +0 -0
  394. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_pipeline_builder.py +0 -0
  395. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_projects.py +0 -0
  396. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_roles.py +0 -0
  397. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_saql_search_builder.py +0 -0
  398. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_scheduled_tasks.py +0 -0
  399. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_self_managed_deployments.py +0 -0
  400. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_stage.py +0 -0
  401. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_step.py +0 -0
  402. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_utils.py +0 -0
  403. {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamsets
3
- Version: 7.0.2
3
+ Version: 7.0.3.dev1
4
4
  Summary: A Python SDK for StreamSets
5
5
  Author: StreamSets Inc
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -326,6 +326,37 @@ These can be accessed using the `data_batch_count`, `idle_batch_count`, `input_r
326
326
  17535770
327
327
  17535770
328
328
 
329
+ Retrieving Current Status With Metrics
330
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
331
+
332
+ By default, :py:attr:`streamsets.sdk.sch_models.Job.status` returns the current job status without record counts.
333
+ To fetch the status and have the backend populate input, output, and error record counts from the timeseries service
334
+ in a single API call, use the :py:attr:`streamsets.sdk.sch_models.Job.status_with_metrics` property instead.
335
+ This is only meaningful for an actively running job, and requires that time series analysis is enabled on the job
336
+ (``job.enable_time_series_analysis = True``):
337
+
338
+ .. code-block:: python
339
+
340
+ job = sch.jobs.get(job_name='job name')
341
+
342
+ # Standard status — record counts are not populated
343
+ job.status
344
+
345
+ # Status with record counts populated from the timeseries service
346
+ status = job.status_with_metrics
347
+
348
+ **Output:**
349
+
350
+ .. code-block:: python
351
+
352
+ <JobStatus (status=ACTIVE, color=GREEN)>
353
+
354
+ .. code-block:: python
355
+
356
+ status.input_record_count
357
+ status.output_record_count
358
+ status.error_record_count
359
+
329
360
  Balancing Data Collector instances
330
361
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
331
362
 
@@ -2,4 +2,4 @@
2
2
  # PID 5900-BAF
3
3
  # Copyright StreamSets Inc., an IBM Company 2025
4
4
 
5
- __version__ = "7.0.2"
5
+ __version__ = "7.0.3dev1"
@@ -23,6 +23,7 @@ from .constants import (
23
23
  SWAGGER_API_KEY, TRANSFORMER,
24
24
  )
25
25
  from .exceptions import EnginelessError, InitializationError, JobInactiveError, ValidationError
26
+ from .retry import HTTPRetryError
26
27
  from .sch_models import (
27
28
  ActionAudits, AdminTool, Alert, ApiCredentialBuilder, ApiCredentials, AWSEnvironment, AzureEnvironment,
28
29
  AzureVMDeployment, ClassificationRuleBuilder, Configuration, Connection, ConnectionAudits, ConnectionBuilder,
@@ -159,16 +160,18 @@ class ControlHub:
159
160
  # We keep the Swagger API definitions as attributes for later use by various
160
161
  # builders.
161
162
  try:
162
- self._connection_api = self._validate_api(api_dictionary=self.api_client.get_connection_api())
163
- self._job_api = self._validate_api(api_dictionary=self.api_client.get_job_api())
164
- self._pipelinestore_api = self._validate_api(api_dictionary=self.api_client.get_pipelinestore_api())
165
- self._provisioning_api = self._validate_api(api_dictionary=self.api_client.get_provisioning_api())
166
- self._security_api = self._validate_api(api_dictionary=self.api_client.get_security_api())
167
- self._sequencing_api = self._validate_api(api_dictionary=self.api_client.get_sequencing_api())
168
- self._topology_api = self._validate_api(api_dictionary=self.api_client.get_topology_api())
169
- self._scheduler_api = self._validate_api(api_dictionary=self.api_client.get_scheduler_api())
170
- self._notification_api = self._validate_api(api_dictionary=self.api_client.get_notification_api())
171
- self._sla_api = self._validate_api(api_dictionary=self.api_client.get_sla_api())
163
+ self._connection_api = self._fetch_and_validate_api(self.api_client.get_connection_api, 'connection')
164
+ self._job_api = self._fetch_and_validate_api(self.api_client.get_job_api, 'job')
165
+ self._pipelinestore_api = self._fetch_and_validate_api(
166
+ self.api_client.get_pipelinestore_api, 'pipelinestore'
167
+ )
168
+ self._provisioning_api = self._fetch_and_validate_api(self.api_client.get_provisioning_api, 'provisioning')
169
+ self._security_api = self._fetch_and_validate_api(self.api_client.get_security_api, 'security')
170
+ self._sequencing_api = self._fetch_and_validate_api(self.api_client.get_sequencing_api, 'sequencing')
171
+ self._topology_api = self._fetch_and_validate_api(self.api_client.get_topology_api, 'topology')
172
+ self._scheduler_api = self._fetch_and_validate_api(self.api_client.get_scheduler_api, 'scheduler')
173
+ self._notification_api = self._fetch_and_validate_api(self.api_client.get_notification_api, 'notification')
174
+ self._sla_api = self._fetch_and_validate_api(self.api_client.get_sla_api, 'sla')
172
175
  except requests.exceptions.HTTPError as e:
173
176
  raise InitializationError(
174
177
  "Error retrieving data. ControlHub cannot be initialized. Please try again."
@@ -194,6 +197,26 @@ class ControlHub:
194
197
  warnings.warn('ControlHub failed to initialize properly. You may have problems creating various objects')
195
198
  return api_dictionary
196
199
 
200
+ def _fetch_and_validate_api(self, fetch_func, api_name):
201
+ """Fetch an API definition, returning None and emitting a warning on 5xx HTTPRetryError.
202
+
203
+ Only 5xx responses where all retries have been exhausted are handled gracefully —
204
+ the service is considered temporarily unresponsive and initialization continues.
205
+ """
206
+ try:
207
+ return self._validate_api(api_dictionary=fetch_func())
208
+ except HTTPRetryError as e:
209
+ status_code = getattr(e.last_response, 'status_code', None)
210
+ if status_code is None or not (500 <= status_code < 600):
211
+ raise InitializationError(
212
+ "Error retrieving data. ControlHub cannot be initialized. Please try again."
213
+ ) from e
214
+ warnings.warn(
215
+ f'ControlHub could not retrieve the {api_name} API definition ({type(e).__name__}: {e}). '
216
+ f'Operations that depend on this service may not work correctly.'
217
+ )
218
+ return None
219
+
197
220
  def _get_aster_api_client(self):
198
221
  # Allows us to retrieve an ApiClient from aster_api ad-hoc without having to instantiate one when we initialize
199
222
  # a ControlHub object.
@@ -4101,13 +4124,15 @@ class ControlHub:
4101
4124
  if engine_config['stageLibs']:
4102
4125
  stage_libs = engine_config['stageLibs']
4103
4126
  elif engine_type == COLLECTOR:
4104
- stage_libs = DEFAULT_DATA_COLLECTOR_STAGE_LIBS
4127
+ stage_libs = copy.deepcopy(DEFAULT_DATA_COLLECTOR_STAGE_LIBS)
4105
4128
  elif engine_type == TRANSFORMER:
4106
- stage_libs = DEFAULT_TRANSFORMER_STAGE_LIBS
4129
+ stage_libs = copy.deepcopy(DEFAULT_TRANSFORMER_STAGE_LIBS)
4107
4130
  elif engine_type == SNOWPARK:
4131
+ stage_libs = copy.deepcopy(DEFAULT_TRANSFORMER_SNOWFLAKE_STAGE_LIBS)
4108
4132
  if Version('5.10.0') <= Version(engine_version):
4109
- DEFAULT_TRANSFORMER_SNOWFLAKE_STAGE_LIBS.append('azure-keyvault-credentialstore')
4110
- stage_libs = DEFAULT_TRANSFORMER_SNOWFLAKE_STAGE_LIBS
4133
+ stage_libs.append('azure-keyvault-credentialstore')
4134
+ else:
4135
+ raise ValueError(f"Unknown {engine_type=}, should be one of {COLLECTOR}, {TRANSFORMER} or {SNOWPARK}")
4111
4136
 
4112
4137
  # Process the stage_libs
4113
4138
  processed_stage_libs = [
@@ -3262,16 +3262,24 @@ class ApiClient(object):
3262
3262
  response = self._post(app='jobrunner', endpoint='/v{}/jobs/status'.format(self.api_version), data=body)
3263
3263
  return Command(self, response)
3264
3264
 
3265
- def get_current_job_status(self, job_id):
3265
+ def get_current_job_status(self, job_id, with_metrics=False):
3266
3266
  """Returns the current job status for given job id.
3267
3267
 
3268
3268
  Args:
3269
3269
  job_id (:obj:`str`)
3270
+ with_metrics (:obj:`bool`, optional): When ``True``, the backend additionally fetches
3271
+ metrics from the timeseries service and includes input/output/error record counts
3272
+ in the response. Default: ``False``.
3270
3273
 
3271
3274
  Returns:
3272
3275
  An instance of :py:class:`streamsets.sdk.sch_api.Command`
3273
3276
  """
3274
- response = self._get(app='jobrunner', endpoint='/v{}/job/{}/currentStatus'.format(self.api_version, job_id))
3277
+ params = {'withMetrics': with_metrics} if with_metrics else {}
3278
+ response = self._get(
3279
+ app='jobrunner',
3280
+ endpoint='/v{}/job/{}/currentStatus'.format(self.api_version, job_id),
3281
+ params=params,
3282
+ )
3275
3283
  return Command(self, response)
3276
3284
 
3277
3285
  def get_all_jobs_status(self, organization, offset, len, with_wrapper=False):
@@ -413,13 +413,12 @@ class CollectionModel:
413
413
 
414
414
  1. Determine the total number of items that we need to fetch based on the ``len`` parameter (If not specified,
415
415
  assume infinite and fetch until ControlHub returns results).
416
- 2. Use the len(self) (which calls :py:meth:`streamsets.sdk.sch_api.ApiClient.get_pipelines_count`) as a source
417
- of truth for the total number of pipelines existing in the ControlHub pipeline repository.
416
+ 2. Use the API response's ``totalCount`` as the source of truth for the total number of items when the API supports pagination.
418
417
  3. Keep incrementing the offset with ``PAGE_LENGTH`` and query with new offset and ``PAGE_LENGTH`` until we
419
418
  reach requested number of items or we don't get any more items from ControlHub.
420
419
  4. While fetching these items in a loop, it is possible that some of the items are deleted by someone else
421
- affecting the current offset we are using. To handle this, in the while loop, if the len(self) decreases, we
422
- reduce the current offset by the number of items decreased (making sure, we aren't missing any items).
420
+ affecting the current offset we are using. To handle this, if the ``totalCount`` decreases, reduce the current offset
421
+ by the number of items deleted.
423
422
  5. In the list of items (order in which ControlHub returns the items), if the items that we already
424
423
  queried are deleted, the actual offset we have to use would reduce by the number of items deleted.
425
424
  On the otherhand, if
@@ -454,11 +453,11 @@ class CollectionModel:
454
453
  response, current_new_kwargs, class_type, class_kwargs = self._get_all_results_from_api(
455
454
  offset=current_offset, len=page_length, **kwargs_without_pagination_params
456
455
  )
457
- previous_length = response['totalCount'] if is_api_paginable(response) else len(self)
458
456
 
459
457
  # If an API is paginated, the result set we need to page through will be contained in the response's 'data'
460
458
  # attribute. If there is no 'data' attribute, the response itself is the result set (unpaginated API).
461
459
  if is_api_paginable(response):
460
+ previous_length = response['totalCount']
462
461
  current_results = SeekableList(class_type(item, **class_kwargs) for item in response['data'])
463
462
  else:
464
463
  current_results = SeekableList(class_type(item, **class_kwargs) for item in response)
@@ -479,8 +478,12 @@ class CollectionModel:
479
478
  if len(all_ids) >= requested_length:
480
479
  return
481
480
 
481
+ # If the API isn't paginated, we've already returned all available results.
482
+ if not is_api_paginable(response):
483
+ return
484
+
482
485
  current_offset += page_length
483
- current_length = response['totalCount'] if is_api_paginable(response) else len(self)
486
+ current_length = response['totalCount']
484
487
  # If the total number of items decreased, reduce the offset by the difference to make sure we return all the
485
488
  # items. If duplicates occur in the process as described in step 5 of workflow in the docstring are handled
486
489
  # above by checking for the id in all_ids.
@@ -492,10 +495,7 @@ class CollectionModel:
492
495
  )
493
496
  current_offset = 0
494
497
  previous_length = current_length
495
- # If the API we're paging over isn't enabled for pagination, break the loop after returning the first
496
- # set of results to avoid an infinite loop.
497
- if 'offset' not in response and 'len' not in response:
498
- break
498
+
499
499
  logger.debug(
500
500
  f'{self.__class__.__name__}. Fetching items with offset={current_offset} and len={page_length}'
501
501
  )
@@ -5883,6 +5883,19 @@ class Job(BaseModel):
5883
5883
  current_job_status = self._data['currentJobStatus']
5884
5884
  return JobStatus(current_job_status, self._control_hub) if current_job_status is not None else None
5885
5885
 
5886
+ @property
5887
+ def status_with_metrics(self):
5888
+ """Current job status including input/output/error record counts from the timeseries service.
5889
+
5890
+ Fetches the current status with ``withMetrics=true``, which instructs the backend to
5891
+ populate record counts in the response. Only meaningful for an actively running job.
5892
+
5893
+ Returns:
5894
+ An instance of :py:class:`streamsets.sdk.sch_models.JobStatus`.
5895
+ """
5896
+ response = self._control_hub.api_client.get_current_job_status(self.id, with_metrics=True).response.json()
5897
+ return JobStatus(response, self._control_hub)
5898
+
5886
5899
  @property
5887
5900
  def history(self):
5888
5901
  """Status and run count history for the Job."""
@@ -44,6 +44,8 @@ SDC_DEFAULT_EXECUTION_MODE = 'STANDALONE'
44
44
  METERING_METRIC_LOOKUP = {'pipeline_hours': 'pipelineTime', 'clock_hours': 'clockTime', 'total_units': 'units'}
45
45
 
46
46
  # This is hardcoded in domainserver over here https://git.io/Jecwm
47
+ # Legacy prefix used for DataCollector versions <= 7.8.x.
48
+ # Versions >= 7.9.0 use a plain version string (e.g. "7.9.0") with no prefix.
47
49
  DEFAULT_JDK17_PREFIX = 'JDK17_'
48
50
 
49
51
 
@@ -206,7 +208,8 @@ class Version:
206
208
  # specifier `\w+` May or may not exist e.g. `RC2`
207
209
 
208
210
  try:
209
- # Needed to make sure that JDK17 image versions are compared with JDK8 ones
211
+ # Needed to make sure that JDK17 image versions are compared with JDK8 ones for versions < 7.9.0
212
+ # Versions >= 7.9.0 already arrive without the prefix.
210
213
  if isinstance(version, str) and version.startswith(DEFAULT_JDK17_PREFIX):
211
214
  version = version[len(DEFAULT_JDK17_PREFIX) :]
212
215
 
@@ -496,7 +499,17 @@ class SeekableList(list):
496
499
  Returns:
497
500
  A :py:obj:`streamsets.sdk.utils.SeekableList` of results that match the supplied arguments.
498
501
  """
499
- return SeekableList(i for i in self if all(getattr(i, k) == v for k, v in kwargs.items()))
502
+ if not kwargs:
503
+ return SeekableList(self)
504
+
505
+ results = SeekableList()
506
+ for item in self:
507
+ try:
508
+ if all(getattr(item, k) == v for k, v in kwargs.items()):
509
+ results.append(item)
510
+ except HTTPError as e:
511
+ logger.warning('Skipping item during client-side filtering due to HTTP error: %s', e)
512
+ return results
500
513
 
501
514
 
502
515
  class MutableKwargs:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamsets
3
- Version: 7.0.2
3
+ Version: 7.0.3.dev1
4
4
  Summary: A Python SDK for StreamSets
5
5
  Author: StreamSets Inc
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -4,6 +4,7 @@
4
4
 
5
5
  # fmt: off
6
6
  import json
7
+ import time
7
8
  import uuid
8
9
 
9
10
  import pytest
@@ -261,6 +262,30 @@ def test_job_templates_multiple_instances_counter(sch, simple_job_template):
261
262
  sch.delete_job(job)
262
263
 
263
264
 
265
+ def test_start_job_template_does_not_fetch_job_count(sch, simple_job_template, monkeypatch):
266
+ jobs_count_requests = []
267
+ original_get = sch.api_client._get
268
+
269
+ def tracked_get(*args, **kwargs):
270
+ endpoint = kwargs.get('endpoint')
271
+ if endpoint and endpoint.endswith('/jobs/count'):
272
+ jobs_count_requests.append(endpoint)
273
+ return original_get(*args, **kwargs)
274
+
275
+ monkeypatch.setattr(sch.api_client, '_get', tracked_get)
276
+
277
+ jobs = []
278
+ try:
279
+ jobs = sch.start_job_template(simple_job_template, number_of_instances=3)
280
+
281
+ assert len(jobs) == 3
282
+ assert len(jobs_count_requests) == 0
283
+ finally:
284
+ for job in jobs:
285
+ sch.stop_job(job)
286
+ sch.delete_job(job)
287
+
288
+
264
289
  def test_job_templates_different_params_param_value(sch, simple_job_template):
265
290
  runtime_parameters = [{'x': '1', 'a': 'b'}, {'x': '2', 'a': 'b'}]
266
291
  jobs = sch.start_job_template(
@@ -412,6 +437,36 @@ def test_metrics(sch, sample_jobs):
412
437
  sch.stop_job(job)
413
438
 
414
439
 
440
+ def test_status_with_metrics(sch, simple_pipeline, sch_engine_sdc_label, tmp_path):
441
+ job_builder = sch.get_job_builder()
442
+ job = job_builder.build('test_status_with_metrics_{}'.format(get_random_string()), pipeline=simple_pipeline)
443
+ job.data_collector_labels = sch_engine_sdc_label
444
+ job.enable_time_series_analysis = True
445
+ sch.add_job(job)
446
+
447
+ try:
448
+ sch.start_job(job)
449
+ try:
450
+ sch.wait_for_job_status(job, 'ACTIVE', timeout_sec=120)
451
+ time.sleep(60) # allow timeseries metrics to populate before querying
452
+
453
+ status_without = sch.api_client.get_current_job_status(job.id, with_metrics=False).response.json()
454
+ (tmp_path / 'status_without_metrics.json').write_text(json.dumps(status_without, indent=2))
455
+
456
+ status_with = sch.api_client.get_current_job_status(job.id, with_metrics=True).response.json()
457
+ (tmp_path / 'status_with_metrics.json').write_text(json.dumps(status_with, indent=2))
458
+
459
+ # withMetrics=True on an active job should populate input or output record counts
460
+ assert status_with.get('inputRecordCount', 0) > 0 or status_with.get('outputRecordCount', 0) > 0
461
+ # without the flag, counts should be absent or zero
462
+ assert status_without.get('inputRecordCount', 0) == 0
463
+ assert status_without.get('outputRecordCount', 0) == 0
464
+ finally:
465
+ sch.stop_job(job)
466
+ finally:
467
+ sch.delete_job(job)
468
+
469
+
415
470
  def test_history(sch, sample_jobs):
416
471
  job = sample_jobs[0]
417
472
 
@@ -0,0 +1,119 @@
1
+ # IBM Confidential
2
+ # PID 5900-BAF
3
+ # Copyright StreamSets Inc., an IBM Company 2024
4
+
5
+ # fmt: off
6
+
7
+ from copy import deepcopy
8
+ from unittest.mock import MagicMock
9
+
10
+ import pytest
11
+
12
+ from streamsets.sdk.sch_models import Job, Jobs, JobStatus
13
+
14
+ from .resources.jobs_data import DUMMY_JOB_JSON_1
15
+
16
+
17
+ # fmt: on
18
+ class MockApiClient:
19
+ def __init__(self):
20
+ self.get_current_job_status = MagicMock()
21
+
22
+
23
+ class MockControlHub:
24
+ def __init__(self):
25
+ self.organization = "12345"
26
+ self.api_client = MockApiClient()
27
+
28
+
29
+ @pytest.fixture(scope="function")
30
+ def dummy_job():
31
+ json = deepcopy(DUMMY_JOB_JSON_1)
32
+ return Job(json, MockControlHub())
33
+
34
+
35
+ def test_job_tag_supports_colons(dummy_job):
36
+ tag_name = 'test:colon'
37
+ dummy_job.add_tag(tag_name)
38
+ assert [tag.tag for tag in dummy_job.tags] == [tag_name]
39
+ dummy_job.remove_tag(tag_name)
40
+ assert not dummy_job.tags
41
+
42
+
43
+ def test_status_with_metrics_calls_api_with_flag(dummy_job):
44
+ """Verify that status_with_metrics passes with_metrics=True to the API."""
45
+ status_data = deepcopy(DUMMY_JOB_JSON_1['currentJobStatus'])
46
+ status_data['inputRecordCount'] = 100
47
+ status_data['outputRecordCount'] = 95
48
+
49
+ mock_response = MagicMock()
50
+ mock_response.response.json.return_value = status_data
51
+ dummy_job._control_hub.api_client.get_current_job_status.return_value = mock_response
52
+
53
+ result = dummy_job.status_with_metrics
54
+
55
+ dummy_job._control_hub.api_client.get_current_job_status.assert_called_once_with(dummy_job.id, with_metrics=True)
56
+ assert isinstance(result, JobStatus)
57
+
58
+
59
+ def test_get_current_job_status_without_metrics_omits_param():
60
+ """Verify that get_current_job_status does not send withMetrics when with_metrics=False."""
61
+ from unittest.mock import patch
62
+
63
+ from streamsets.sdk.sch_api import ApiClient
64
+
65
+ api_client = ApiClient.__new__(ApiClient)
66
+ api_client.api_version = 3
67
+
68
+ with patch.object(ApiClient, '_get', return_value=MagicMock()) as mock_get:
69
+ api_client.get_current_job_status('job-123', with_metrics=False)
70
+
71
+ _, call_kwargs = mock_get.call_args
72
+ assert not call_kwargs.get('params')
73
+
74
+
75
+ def test_get_current_job_status_with_metrics_sends_param():
76
+ """Verify that get_current_job_status sends withMetrics=True when with_metrics=True."""
77
+ from unittest.mock import patch
78
+
79
+ from streamsets.sdk.sch_api import ApiClient
80
+
81
+ api_client = ApiClient.__new__(ApiClient)
82
+ api_client.api_version = 3
83
+
84
+ with patch.object(ApiClient, '_get', return_value=MagicMock()) as mock_get:
85
+ api_client.get_current_job_status('job-123', with_metrics=True)
86
+
87
+ _, call_kwargs = mock_get.call_args
88
+ assert call_kwargs.get('params') == {'withMetrics': True}
89
+
90
+
91
+ def test_jobs_get_by_id_does_not_call_get_jobs_count():
92
+ """Verify that jobs.get(id=...) does not call the jobs/count endpoint."""
93
+ control_hub = MagicMock()
94
+ control_hub.api_client.get_jobs_count = MagicMock()
95
+
96
+ job_data = deepcopy(DUMMY_JOB_JSON_1)
97
+
98
+ response = {
99
+ 'data': [job_data],
100
+ 'totalCount': 1,
101
+ 'offset': 0,
102
+ 'len': 1,
103
+ }
104
+
105
+ jobs = Jobs(control_hub)
106
+
107
+ jobs._get_all_results_from_api = MagicMock(
108
+ return_value=(
109
+ response,
110
+ {},
111
+ Job,
112
+ {'control_hub': control_hub},
113
+ )
114
+ )
115
+
116
+ result = jobs.get(id=job_data['id'])
117
+
118
+ assert result.id == job_data['id']
119
+ control_hub.api_client.get_jobs_count.assert_not_called()
@@ -5,10 +5,14 @@ import copy
5
5
 
6
6
  # fmt: off
7
7
  from copy import deepcopy
8
+ from unittest.mock import MagicMock
8
9
 
9
10
  import pytest
11
+ import requests
10
12
 
11
13
  from streamsets.sdk import ControlHub
14
+ from streamsets.sdk.exceptions import InitializationError
15
+ from streamsets.sdk.retry import HTTPRetryError
12
16
  from streamsets.sdk.sch_api import ApiClient
13
17
  from streamsets.sdk.sch_models import KubernetesDeployment, SelfManagedDeployment
14
18
 
@@ -229,3 +233,59 @@ def test_stop_deployment_with_force_k8s_calls_force(dummy_deployment_data, caplo
229
233
  assert any((_id == dep_id and state == "DEACTIVATION_ERROR") for (_id, state) in sch.api_client._wait_calls)
230
234
 
231
235
  assert isinstance(result, MockCommand)
236
+
237
+
238
+ class _BareControlHub(ControlHub):
239
+ """ControlHub with __init__ skipped — lets us call instance methods directly."""
240
+
241
+ def __init__(self):
242
+ pass
243
+
244
+
245
+ def test_fetch_and_validate_api_success():
246
+ sch = _BareControlHub()
247
+ api_dict = {'swagger': '2.0'}
248
+ assert sch._fetch_and_validate_api(lambda: api_dict, 'test') is api_dict
249
+
250
+
251
+ @pytest.mark.parametrize('status_code', [500, 502, 503, 504])
252
+ def test_fetch_and_validate_api_5xx_retry_error_returns_none(recwarn, status_code):
253
+ """5xx HTTPRetryError (service unresponsive after all retries) → warn + return None."""
254
+ mock_response = MagicMock()
255
+ mock_response.status_code = status_code
256
+
257
+ def _raise_retry_error():
258
+ raise HTTPRetryError(f'Max retries (3) exceeded for HTTP {status_code}', last_response=mock_response)
259
+
260
+ sch = _BareControlHub()
261
+ result = sch._fetch_and_validate_api(_raise_retry_error, 'sequencing')
262
+
263
+ assert result is None
264
+ assert len(recwarn) == 1
265
+ assert 'sequencing' in str(recwarn[0].message)
266
+ assert 'HTTPRetryError' in str(recwarn[0].message)
267
+
268
+
269
+ @pytest.mark.parametrize('status_code', [400, 401, 403, 404, 429])
270
+ def test_fetch_and_validate_api_non_5xx_retry_error_raises_initialization_error(status_code):
271
+ """Non-5xx HTTPRetryError must raise InitializationError with the original message."""
272
+ mock_response = MagicMock()
273
+ mock_response.status_code = status_code
274
+
275
+ def _raise_retry_error():
276
+ raise HTTPRetryError(f'Max retries (3) exceeded for HTTP {status_code}', last_response=mock_response)
277
+
278
+ sch = _BareControlHub()
279
+ with pytest.raises(InitializationError):
280
+ sch._fetch_and_validate_api(_raise_retry_error, 'test')
281
+
282
+
283
+ def test_fetch_and_validate_api_http_error_propagates():
284
+ """requests.exceptions.HTTPError (not wrapped by retry) must propagate — not be swallowed."""
285
+
286
+ def _raise_http_error():
287
+ raise requests.exceptions.HTTPError('401 Unauthorized')
288
+
289
+ sch = _BareControlHub()
290
+ with pytest.raises(requests.exceptions.HTTPError):
291
+ sch._fetch_and_validate_api(_raise_http_error, 'test')
@@ -4,6 +4,7 @@
4
4
 
5
5
  # fmt: off
6
6
  import pytest
7
+ from requests.exceptions import HTTPError
7
8
 
8
9
  from streamsets.sdk.utils import SeekableList
9
10
 
@@ -16,6 +17,17 @@ class Helper:
16
17
  self.name = helper_name
17
18
 
18
19
 
20
+ class HelperWithBrokenName(Helper):
21
+ """Simulates a lazily-loaded object whose data fetch returns HTTP 400."""
22
+
23
+ def __init__(self, helper_id):
24
+ self.id = helper_id
25
+
26
+ @property
27
+ def name(self):
28
+ raise HTTPError('400: item was concurrently deleted')
29
+
30
+
19
31
  @pytest.fixture(autouse=True)
20
32
  def helper_object_list():
21
33
  return [Helper(helper_id=uid, helper_name=name) for uid, name in zip(range(1, 3), ['John', 'Jane', 'Alice'])]
@@ -62,6 +74,28 @@ def test_get_all_invalid_input(helper_object_list):
62
74
  assert len(result) == 0
63
75
 
64
76
 
77
+ def test_get_all_skips_item_with_http_error_and_returns_matching_item():
78
+ """A concurrent deletion (HTTP 400) on one item must not abort the search for others."""
79
+ broken = HelperWithBrokenName(helper_id=99)
80
+ target = Helper(helper_id=3, helper_name='Alice')
81
+ seekable_list = SeekableList([broken, target])
82
+
83
+ result = seekable_list.get_all(name='Alice')
84
+
85
+ assert isinstance(result, SeekableList)
86
+ assert len(result) == 1
87
+ assert result[0].name == 'Alice'
88
+
89
+
90
+ def test_get_all_returns_empty_list_when_all_items_raise_http_error():
91
+ seekable_list = SeekableList([HelperWithBrokenName(helper_id=i) for i in range(3)])
92
+
93
+ result = seekable_list.get_all(name='anything')
94
+
95
+ assert isinstance(result, SeekableList)
96
+ assert len(result) == 0
97
+
98
+
65
99
  def test_cast_seekable_to_list(helper_object_list):
66
100
  seekable_list = SeekableList(helper_object_list)
67
101
  casted_list = list(seekable_list)
@@ -4,6 +4,7 @@ color = true
4
4
  envlist = unit-310, unit-311, unit-312, integration-310, integration-312, docs, install-{310,311,312}, jenkinsfile
5
5
 
6
6
  [testenv]
7
+ package = wheel
7
8
  deps = pytest
8
9
  pytest-cov
9
10
  pytest-mock
@@ -1,33 +0,0 @@
1
- # IBM Confidential
2
- # PID 5900-BAF
3
- # Copyright StreamSets Inc., an IBM Company 2024
4
-
5
- # fmt: off
6
-
7
- from copy import deepcopy
8
-
9
- import pytest
10
-
11
- from streamsets.sdk.sch_models import Job
12
-
13
- from .resources.jobs_data import DUMMY_JOB_JSON_1
14
-
15
-
16
- # fmt: on
17
- class MockControlHub:
18
- def __init__(self):
19
- self.organization = "12345"
20
-
21
-
22
- @pytest.fixture(scope="function")
23
- def dummy_job():
24
- json = deepcopy(DUMMY_JOB_JSON_1)
25
- return Job(json, MockControlHub())
26
-
27
-
28
- def test_job_tag_supports_colons(dummy_job):
29
- tag_name = 'test:colon'
30
- dummy_job.add_tag(tag_name)
31
- assert [tag.tag for tag in dummy_job.tags] == [tag_name]
32
- dummy_job.remove_tag(tag_name)
33
- assert not dummy_job.tags
File without changes
File without changes
File without changes
File without changes
File without changes