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.
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/PKG-INFO +1 -1
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/jobs_instances.rst +31 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/__version__.py +1 -1
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sch.py +39 -14
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sch_api.py +10 -2
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sch_models.py +23 -10
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/utils.py +15 -2
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/PKG-INFO +1 -1
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_jobs.py +55 -0
- streamsets-7.0.3.dev1/tests/unit/test_jobs.py +119 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_sch.py +60 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_seekable_list.py +34 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tox.ini +1 -0
- streamsets-7.0.2/tests/unit/test_jobs.py +0 -33
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/.gitignore +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/Dockerfile +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/HISTORY.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/MANIFEST.in +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/Makefile +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/README.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/build-publish/Jenkinsfile +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/build_requirements.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/TopologyMissingNodes.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/TopologyMultipleJobsSingleSystem.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/TopologyRestoredNodes.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/add_snowflake_credentials.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/click_snowflake_settings.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/css/docs_theme.css +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_data_generator_to_trash.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_data_generator_to_two_trashes.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_data_generator_with_events.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_raw_data_source_help.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/dev_raw_data_to_trash.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/favicon.ico +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/file_tail_to_two_trashes.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/full-ibm-streamsets-logo.svg +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/add_frag_to_pipeline.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/connect_event_lane.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/delete_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/edit_configuration.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/error_records_configuration.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/error_records_main.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/existing_pipelines.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/fragment_canvas.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/fragment_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/multi_output_stages_complete.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/multi_output_stages_incomplete.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipeline_canvas.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipeline_check_in.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipeline_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/pipelines_using_fragment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/produce_events.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/remove_stage.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/selector_four_conditions.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/snowflake_required_parameters.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/stages_unconnected.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/stages_with_different_types.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/update_pipeline_with_frag.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/build/value_chooser__JSON_content.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/activate_deactivate_credentials.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/adding_credentials.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/delete_credentials.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/regenerating_auth_token.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/api_credentials/renaming_credentials.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/add_new_permissions.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/change_owner.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/delete_permissions.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/share_button.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/permissions/share_settings.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/projects/create_project.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/projects/switch_projects.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/activate_user.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/add_new_group.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/add_new_user.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/deactivate_user.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/delete_group.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/delete_user.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/groups_list.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/invite_user_details.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/new_group_details.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/project_roles.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/update_group_details.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/update_user_details.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/manage/users_and_groups/users_list.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/activate_sequence.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/add_job_modal.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/add_jobs_to_job_sequence.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/create_job_sequence.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/delete_draftrun_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/delete_job_sequence.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/disable_sequence.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/draftrun_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/get_job_sequence_steps.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/get_job_sequences.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/logs_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/move_step.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/snapshots_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/start_draftrun_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/stop_draftrun_ui.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/three_dots_sequence.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/run/view_history.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Mark_Favorite.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Query_Builder.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Remove.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Save_Search.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Saved_Searches.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Search_Name_Wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/SAQL_Update.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/search/Search_Advanced.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/configuring_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/create_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/deleting_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/editing_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/get_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/pipelines_using_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/using_connection.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/connections/verify_connection.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/configure_install_type_docker.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/configure_install_type_tarball.png +0 -0
- {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
- {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
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/common/creation_share_deployment.png +0 -0
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_configure_engine.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_define_deployment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_review_and_launch.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_share_deployment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/ec2_deployments/creation_transformer_define_deployment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_engine.png +0 -0
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_gce_region.png +0 -0
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_configure_gce_zone.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_define_deployment_sdc.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_define_deployment_transformer.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/gce_deployments/creation_review_and_launch.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/kubernetes_agent_offline.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/kubernetes_status_deactivation_error.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_configure_deployment_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_configure_kubernetes_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_create_deployment_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_jdbc_version_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_review_launch_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/sdc_stage_libs_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_configure_deployment_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_create_deployment_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_jdbc_version_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/kubernetes_deployments/transformer_stage_libs_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_configure_engine.png +0 -0
- {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
- {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
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/creation_share_deployment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/get_install_script.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/deployments/self_managed_deployments/select_install_type.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_define_environment.png +0 -0
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/aws_environments/creation_share_environment.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/azure_environments/creation_define_environment.png +0 -0
- {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
- {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
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_configure_gcp_project.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_define_environment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_review_and_activate.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_select_gcp_vpc.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/gcp_environments/creation_share_environment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/activate_and_install_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/configure_environment_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/create_environment_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/kubernetes_environments/installation_script_wizard.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/managing_environments/managing_environments.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/self_managed_environments/creation_define_environment.png +0 -0
- {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
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/set_up/environments/self_managed_environments/creation_share_environment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/welcome/api_credentials.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/images/welcome/examples/find_sdc_id.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sample_fragment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sample_pipeline_using_fragment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/saved_snowflake_credential.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_pipeline1.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_self_managed_deployment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_self_managed_deployment_details.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/sdk_sample_self_managed_environment.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/snowflake_credentials_modal.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/_static/snowflake_pipeline_defaults.png +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/advanced_search.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/api/sch_api.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/api.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/code_generation.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/creating_pipelines.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/editing_pipelines.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/error_record_handling.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build/pipeline_fragments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/build.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/conf.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/index.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/http_retry_management.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/projects/projects.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/api_credentials.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/managing_users_and_groups.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/permissions.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/roles.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage/users_and_groups/users_and_groups.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/manage.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/monitor/subscriptions.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/monitor/topologies.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/monitor.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/requirements.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/draft_runs.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/job_sequences.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/job_templates.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run/scheduled_tasks.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/run.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/search/saql_saved_search.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/search/search_for_object.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/set_up.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/engine_types.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/connections/connections.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/azure_vm_deployments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/deployments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/ec2_deployments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/gce_deployments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/kubernetes_deployments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/self_managed_deployments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/stage_libs_sdc.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/deployments/stage_libs_st.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/aws_environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/azure_environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/gcp_environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/kubernetes_environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/managing_environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/usage/set_up/environments/self_managed_environments.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/authentication.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/best_practices/http_retry.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/best_practices.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/examples/sdk_examples_job_pipeline.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/examples/sdk_examples_self_managed_deployment.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/examples.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/installation.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/known_issues.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/overview.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome/release_notes.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/docs/welcome.rst +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/.flake8 +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/.pre-commit-config.yaml +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/Dockerfile +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/Jenkinsfile +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/evergreen/pyproject.toml +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/pyproject.toml +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/requirements.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/setup.cfg +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/sonar-project.properties +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/analytics.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/aster_api.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/generator.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/preambles/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/preambles/pipeline_preamble.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/pipeline_processor/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/pipeline_processor/pipeline_graph.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/pipeline_processor/pipeline_processor.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/processors/processor.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/json_file_source.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/pipeline_object_source.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/source.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/codegen/sources/zip_archive_source.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/constants.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/exceptions.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/models.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/retry.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sdc.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sdc_api.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/sdc_models.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/st.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/st_api.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets/sdk/st_models.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/SOURCES.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/dependency_links.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/not-zip-safe +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/requires.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/streamsets.egg-info/top_level.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/test_requirements.txt +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/codegen/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/codegen/test_python_generator.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/conftest.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_acl.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_analytics.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_api_credentials.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_connections.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_dpath.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_draft_runs.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_ec2_environments.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_engineless_design.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_job_sequences.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_kubernetes_environments.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_metering.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_organization.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pagination.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipeline_fragments.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipeline_labels.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipeline_parameters.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_pipelines.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_projects.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_saql.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_saql_search.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_sch.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_scheduled_tasks.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_scheduler.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_self_managed_deployments.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_jobs.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipeline_fragments.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipeline_labels.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipeline_parameters.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_snowflake_pipelines.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_stages.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_subscription.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_topology.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/test_users_and_groups.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/integration/utils.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/mocks/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/mocks/mock_api.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/conftest.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_pipeline_graph.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_pipeline_preamble.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_pipeline_processor.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_sources.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/codegen/test_utils.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/conftest.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/__init__.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/base_model_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/codegen/dev_to_trash_with_event.json +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/codegen/jdbc_pipeline_test.zip +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/codegen/jdbc_with_stream_selector.json +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/configuration_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/conftest_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/connections_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/engines_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/job.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/job_sequence_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/job_sequence_step_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/jobs_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/pipeline_builder_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/projects.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/sch_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/scheduled_tasks_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/self_managed_deployments_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/resources/utils_data.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_analytics.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_azure_environment.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_base_model.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_collection_model.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_configuration.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_connections.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_deployment_builder.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_engine_api.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_engine_types.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_engines.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_http_retry.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_job_builder.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_job_sequence.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_job_sequence_builder.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_mutable_kwargs.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_permission.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_pipeline.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_pipeline_builder.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_projects.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_roles.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_saql_search_builder.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_scheduled_tasks.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_self_managed_deployments.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_stage.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_step.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_utils.py +0 -0
- {streamsets-7.0.2 → streamsets-7.0.3.dev1}/tests/unit/test_version.py +0 -0
|
@@ -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
|
|
|
@@ -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.
|
|
163
|
-
self._job_api = self.
|
|
164
|
-
self._pipelinestore_api = self.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
self.
|
|
168
|
-
self.
|
|
169
|
-
self.
|
|
170
|
-
self.
|
|
171
|
-
self.
|
|
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
|
-
|
|
4110
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
422
|
-
|
|
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']
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
@@ -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)
|
|
@@ -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
|