diff --git a/acceptance/bundle/refschema/out.fields.txt b/acceptance/bundle/refschema/out.fields.txt index a6776c50393..ace5495a5e1 100644 --- a/acceptance/bundle/refschema/out.fields.txt +++ b/acceptance/bundle/refschema/out.fields.txt @@ -756,6 +756,995 @@ resources.genie_spaces.*.permissions[*].group_name string ALL resources.genie_spaces.*.permissions[*].level iam.PermissionLevel ALL resources.genie_spaces.*.permissions[*].service_principal_name string ALL resources.genie_spaces.*.permissions[*].user_name string ALL +resources.job_runs.*.dbt_commands []string ALL +resources.job_runs.*.dbt_commands[*] string ALL +resources.job_runs.*.id string INPUT +resources.job_runs.*.idempotency_token string ALL +resources.job_runs.*.jar_params []string ALL +resources.job_runs.*.jar_params[*] string ALL +resources.job_runs.*.job_id int64 ALL +resources.job_runs.*.job_parameters map[string]string ALL +resources.job_runs.*.job_parameters.* string ALL +resources.job_runs.*.job_settings *jobs.JobSettings ALL +resources.job_runs.*.job_settings.budget_policy_id string ALL +resources.job_runs.*.job_settings.continuous *jobs.Continuous ALL +resources.job_runs.*.job_settings.continuous.pause_status jobs.PauseStatus ALL +resources.job_runs.*.job_settings.continuous.task_retry_mode jobs.TaskRetryMode ALL +resources.job_runs.*.job_settings.deployment *jobs.JobDeployment ALL +resources.job_runs.*.job_settings.deployment.deployment_id string ALL +resources.job_runs.*.job_settings.deployment.kind jobs.JobDeploymentKind ALL +resources.job_runs.*.job_settings.deployment.metadata_file_path string ALL +resources.job_runs.*.job_settings.deployment.version_id string ALL +resources.job_runs.*.job_settings.description string ALL +resources.job_runs.*.job_settings.edit_mode jobs.JobEditMode ALL +resources.job_runs.*.job_settings.email_notifications *jobs.JobEmailNotifications ALL +resources.job_runs.*.job_settings.email_notifications.no_alert_for_skipped_runs bool ALL +resources.job_runs.*.job_settings.email_notifications.on_duration_warning_threshold_exceeded []string ALL +resources.job_runs.*.job_settings.email_notifications.on_duration_warning_threshold_exceeded[*] string ALL +resources.job_runs.*.job_settings.email_notifications.on_failure []string ALL +resources.job_runs.*.job_settings.email_notifications.on_failure[*] string ALL +resources.job_runs.*.job_settings.email_notifications.on_start []string ALL +resources.job_runs.*.job_settings.email_notifications.on_start[*] string ALL +resources.job_runs.*.job_settings.email_notifications.on_streaming_backlog_exceeded []string ALL +resources.job_runs.*.job_settings.email_notifications.on_streaming_backlog_exceeded[*] string ALL +resources.job_runs.*.job_settings.email_notifications.on_success []string ALL +resources.job_runs.*.job_settings.email_notifications.on_success[*] string ALL +resources.job_runs.*.job_settings.environments []jobs.JobEnvironment ALL +resources.job_runs.*.job_settings.environments[*] jobs.JobEnvironment ALL +resources.job_runs.*.job_settings.environments[*].environment_key string ALL +resources.job_runs.*.job_settings.environments[*].spec *compute.Environment ALL +resources.job_runs.*.job_settings.environments[*].spec.base_environment string ALL +resources.job_runs.*.job_settings.environments[*].spec.client string ALL +resources.job_runs.*.job_settings.environments[*].spec.dependencies []string ALL +resources.job_runs.*.job_settings.environments[*].spec.dependencies[*] string ALL +resources.job_runs.*.job_settings.environments[*].spec.environment_version string ALL +resources.job_runs.*.job_settings.environments[*].spec.java_dependencies []string ALL +resources.job_runs.*.job_settings.environments[*].spec.java_dependencies[*] string ALL +resources.job_runs.*.job_settings.format jobs.Format ALL +resources.job_runs.*.job_settings.git_source *jobs.GitSource ALL +resources.job_runs.*.job_settings.git_source.git_branch string ALL +resources.job_runs.*.job_settings.git_source.git_commit string ALL +resources.job_runs.*.job_settings.git_source.git_provider jobs.GitProvider ALL +resources.job_runs.*.job_settings.git_source.git_snapshot *jobs.GitSnapshot ALL +resources.job_runs.*.job_settings.git_source.git_snapshot.used_commit string ALL +resources.job_runs.*.job_settings.git_source.git_tag string ALL +resources.job_runs.*.job_settings.git_source.git_url string ALL +resources.job_runs.*.job_settings.git_source.job_source *jobs.JobSource ALL +resources.job_runs.*.job_settings.git_source.job_source.dirty_state jobs.JobSourceDirtyState ALL +resources.job_runs.*.job_settings.git_source.job_source.import_from_git_branch string ALL +resources.job_runs.*.job_settings.git_source.job_source.job_config_path string ALL +resources.job_runs.*.job_settings.git_source.sparse_checkout *jobs.SparseCheckout ALL +resources.job_runs.*.job_settings.git_source.sparse_checkout.patterns []string ALL +resources.job_runs.*.job_settings.git_source.sparse_checkout.patterns[*] string ALL +resources.job_runs.*.job_settings.health *jobs.JobsHealthRules ALL +resources.job_runs.*.job_settings.health.rules []jobs.JobsHealthRule ALL +resources.job_runs.*.job_settings.health.rules[*] jobs.JobsHealthRule ALL +resources.job_runs.*.job_settings.health.rules[*].metric jobs.JobsHealthMetric ALL +resources.job_runs.*.job_settings.health.rules[*].op jobs.JobsHealthOperator ALL +resources.job_runs.*.job_settings.health.rules[*].value int64 ALL +resources.job_runs.*.job_settings.job_clusters []jobs.JobCluster ALL +resources.job_runs.*.job_settings.job_clusters[*] jobs.JobCluster ALL +resources.job_runs.*.job_settings.job_clusters[*].job_cluster_key string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster compute.ClusterSpec ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.apply_policy_default_values bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.autoscale *compute.AutoScale ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.autoscale.max_workers int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.autoscale.min_workers int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.autotermination_minutes int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes *compute.AwsAttributes ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.availability compute.AwsAvailability ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.ebs_volume_count int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.ebs_volume_iops int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.ebs_volume_size int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.ebs_volume_throughput int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.ebs_volume_type compute.EbsVolumeType ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.instance_profile_arn string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.spot_bid_price_percent int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.zone_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes *compute.AzureAttributes ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.availability compute.AzureAvailability ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.capacity_reservation_group string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.log_analytics_info *compute.LogAnalyticsInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.log_analytics_info.log_analytics_primary_key string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.log_analytics_info.log_analytics_workspace_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.spot_bid_max_price float64 ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf *compute.ClusterLogConf ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.dbfs *compute.DbfsStorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.dbfs.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3 *compute.S3StorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.canned_acl string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.enable_encryption bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.encryption_type string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.endpoint string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.kms_key string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3.region string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.volumes *compute.VolumesStorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.volumes.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_name string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.custom_tags map[string]string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.custom_tags.* string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.data_security_mode compute.DataSecurityMode ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.docker_image *compute.DockerImage ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.docker_image.basic_auth *compute.DockerBasicAuth ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.docker_image.basic_auth.password string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.docker_image.basic_auth.username string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.docker_image.url string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.driver_instance_pool_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.driver_node_type_flexibility *compute.NodeTypeFlexibility ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.driver_node_type_flexibility.alternate_node_type_ids []string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.driver_node_type_flexibility.alternate_node_type_ids[*] string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.driver_node_type_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.enable_elastic_disk bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.enable_local_disk_encryption bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes *compute.GcpAttributes ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.availability compute.GcpAvailability ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.boot_disk_size int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.confidential_compute_type compute.ConfidentialComputeType ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.google_service_account string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.local_ssd_count int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.use_preemptible_executors bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.zone_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts []compute.InitScriptInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*] compute.InitScriptInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].abfss *compute.Adlsgen2Info ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].abfss.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].dbfs *compute.DbfsStorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].dbfs.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].file *compute.LocalFileInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].file.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].gcs *compute.GcsStorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].gcs.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3 *compute.S3StorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.canned_acl string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.enable_encryption bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.encryption_type string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.endpoint string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.kms_key string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3.region string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].volumes *compute.VolumesStorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].volumes.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].workspace *compute.WorkspaceStorageInfo ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].workspace.destination string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.instance_pool_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.is_single_node bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.kind compute.Kind ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.node_type_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.num_workers int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.policy_id string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.remote_disk_throughput int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.runtime_engine compute.RuntimeEngine ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.single_user_name string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.spark_conf map[string]string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.spark_conf.* string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.spark_env_vars map[string]string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.spark_env_vars.* string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.spark_version string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.ssh_public_keys []string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.ssh_public_keys[*] string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.total_initial_remote_disk_size int ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.use_ml_runtime bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.worker_node_type_flexibility *compute.NodeTypeFlexibility ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.worker_node_type_flexibility.alternate_node_type_ids []string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.worker_node_type_flexibility.alternate_node_type_ids[*] string ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.workload_type *compute.WorkloadType ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.workload_type.clients compute.ClientsTypes ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.workload_type.clients.jobs bool ALL +resources.job_runs.*.job_settings.job_clusters[*].new_cluster.workload_type.clients.notebooks bool ALL +resources.job_runs.*.job_settings.max_concurrent_runs int ALL +resources.job_runs.*.job_settings.name string ALL +resources.job_runs.*.job_settings.notification_settings *jobs.JobNotificationSettings ALL +resources.job_runs.*.job_settings.notification_settings.no_alert_for_canceled_runs bool ALL +resources.job_runs.*.job_settings.notification_settings.no_alert_for_skipped_runs bool ALL +resources.job_runs.*.job_settings.parameters []jobs.JobParameterDefinition ALL +resources.job_runs.*.job_settings.parameters[*] jobs.JobParameterDefinition ALL +resources.job_runs.*.job_settings.parameters[*].default string ALL +resources.job_runs.*.job_settings.parameters[*].name string ALL +resources.job_runs.*.job_settings.performance_target jobs.PerformanceTarget ALL +resources.job_runs.*.job_settings.queue *jobs.QueueSettings ALL +resources.job_runs.*.job_settings.queue.enabled bool ALL +resources.job_runs.*.job_settings.run_as *jobs.JobRunAs ALL +resources.job_runs.*.job_settings.run_as.group_name string ALL +resources.job_runs.*.job_settings.run_as.service_principal_name string ALL +resources.job_runs.*.job_settings.run_as.user_name string ALL +resources.job_runs.*.job_settings.schedule *jobs.CronSchedule ALL +resources.job_runs.*.job_settings.schedule.pause_status jobs.PauseStatus ALL +resources.job_runs.*.job_settings.schedule.quartz_cron_expression string ALL +resources.job_runs.*.job_settings.schedule.timezone_id string ALL +resources.job_runs.*.job_settings.tags map[string]string ALL +resources.job_runs.*.job_settings.tags.* string ALL +resources.job_runs.*.job_settings.tasks []jobs.Task ALL +resources.job_runs.*.job_settings.tasks[*] jobs.Task ALL +resources.job_runs.*.job_settings.tasks[*].alert_task *jobs.AlertTask ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.alert_id string ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.subscribers []jobs.AlertTaskSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.subscribers[*] jobs.AlertTaskSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.subscribers[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.subscribers[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].alert_task.workspace_path string ALL +resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task *jobs.CleanRoomsNotebookTask ALL +resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task.clean_room_name string ALL +resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task.etag string ALL +resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task.notebook_base_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task.notebook_base_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task.notebook_name string ALL +resources.job_runs.*.job_settings.tasks[*].compute *jobs.Compute ALL +resources.job_runs.*.job_settings.tasks[*].compute.hardware_accelerator compute.HardwareAcceleratorType ALL +resources.job_runs.*.job_settings.tasks[*].condition_task *jobs.ConditionTask ALL +resources.job_runs.*.job_settings.tasks[*].condition_task.left string ALL +resources.job_runs.*.job_settings.tasks[*].condition_task.op jobs.ConditionTaskOp ALL +resources.job_runs.*.job_settings.tasks[*].condition_task.right string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task *jobs.DashboardTask ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.dashboard_id string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.filters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.filters.* string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription *jobs.Subscription ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription.custom_subject string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription.paused bool ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription.subscribers []jobs.SubscriptionSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription.subscribers[*] jobs.SubscriptionSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription.subscribers[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.subscription.subscribers[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].dashboard_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_cloud_task *jobs.DbtCloudTask ALL +resources.job_runs.*.job_settings.tasks[*].dbt_cloud_task.connection_resource_name string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_cloud_task.dbt_cloud_job_id int64 ALL +resources.job_runs.*.job_settings.tasks[*].dbt_platform_task *jobs.DbtPlatformTask ALL +resources.job_runs.*.job_settings.tasks[*].dbt_platform_task.connection_resource_name string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_platform_task.dbt_platform_job_id string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task *jobs.DbtTask ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.catalog string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.commands []string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.commands[*] string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.profiles_directory string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.project_directory string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.schema string ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].dbt_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].depends_on []jobs.TaskDependency ALL +resources.job_runs.*.job_settings.tasks[*].depends_on[*] jobs.TaskDependency ALL +resources.job_runs.*.job_settings.tasks[*].depends_on[*].outcome string ALL +resources.job_runs.*.job_settings.tasks[*].depends_on[*].task_key string ALL +resources.job_runs.*.job_settings.tasks[*].description string ALL +resources.job_runs.*.job_settings.tasks[*].disable_auto_optimization bool ALL +resources.job_runs.*.job_settings.tasks[*].disabled bool ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications *jobs.TaskEmailNotifications ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.no_alert_for_skipped_runs bool ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_duration_warning_threshold_exceeded []string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_duration_warning_threshold_exceeded[*] string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_failure []string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_failure[*] string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_start []string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_start[*] string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_streaming_backlog_exceeded []string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_streaming_backlog_exceeded[*] string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_success []string ALL +resources.job_runs.*.job_settings.tasks[*].email_notifications.on_success[*] string ALL +resources.job_runs.*.job_settings.tasks[*].environment_key string ALL +resources.job_runs.*.job_settings.tasks[*].existing_cluster_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task *jobs.ForEachTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.concurrency int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.inputs string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task jobs.Task ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task *jobs.AlertTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.alert_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.subscribers []jobs.AlertTaskSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.subscribers[*] jobs.AlertTaskSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.subscribers[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.subscribers[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.alert_task.workspace_path string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task *jobs.CleanRoomsNotebookTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task.clean_room_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task.etag string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task.notebook_base_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task.notebook_base_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task.notebook_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.compute *jobs.Compute ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.compute.hardware_accelerator compute.HardwareAcceleratorType ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.condition_task *jobs.ConditionTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.condition_task.left string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.condition_task.op jobs.ConditionTaskOp ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.condition_task.right string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task *jobs.DashboardTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.dashboard_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.filters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.filters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription *jobs.Subscription ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription.custom_subject string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription.paused bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription.subscribers []jobs.SubscriptionSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription.subscribers[*] jobs.SubscriptionSubscriber ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription.subscribers[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.subscription.subscribers[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dashboard_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_cloud_task *jobs.DbtCloudTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_cloud_task.connection_resource_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_cloud_task.dbt_cloud_job_id int64 ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_platform_task *jobs.DbtPlatformTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_platform_task.connection_resource_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_platform_task.dbt_platform_job_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task *jobs.DbtTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.catalog string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.commands []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.commands[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.profiles_directory string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.project_directory string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.schema string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.depends_on []jobs.TaskDependency ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.depends_on[*] jobs.TaskDependency ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.depends_on[*].outcome string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.depends_on[*].task_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.description string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.disable_auto_optimization bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.disabled bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications *jobs.TaskEmailNotifications ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.no_alert_for_skipped_runs bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_duration_warning_threshold_exceeded []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_duration_warning_threshold_exceeded[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_failure []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_failure[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_start []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_start[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_streaming_backlog_exceeded []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_streaming_backlog_exceeded[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_success []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.email_notifications.on_success[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.environment_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.existing_cluster_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.for_each_task *jobs.ForEachTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.for_each_task.concurrency int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.for_each_task.inputs string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.for_each_task.task jobs.Task ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task *jobs.GenAiComputeTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.command string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.compute *jobs.ComputeConfig ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.compute.gpu_node_pool_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.compute.gpu_type string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.compute.num_gpus int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.dl_runtime_image string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.mlflow_experiment_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.training_script_path string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.yaml_parameters string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.yaml_parameters_file_path string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health *jobs.JobsHealthRules ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules []jobs.JobsHealthRule ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*] jobs.JobsHealthRule ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*].metric jobs.JobsHealthMetric ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*].op jobs.JobsHealthOperator ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*].value int64 ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.job_cluster_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries []compute.Library ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*] compute.Library ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].cran *compute.RCranLibrary ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].cran.package string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].cran.repo string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].egg string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].jar string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].maven *compute.MavenLibrary ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].maven.coordinates string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].maven.exclusions []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].maven.exclusions[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].maven.repo string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].pypi *compute.PythonPyPiLibrary ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].pypi.package string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].pypi.repo string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].requirements string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].whl string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.max_retries int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.min_retry_interval_millis int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster *compute.ClusterSpec ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.apply_policy_default_values bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.autoscale *compute.AutoScale ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.autoscale.max_workers int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.autoscale.min_workers int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.autotermination_minutes int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes *compute.AwsAttributes ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.availability compute.AwsAvailability ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.ebs_volume_count int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.ebs_volume_iops int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.ebs_volume_size int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.ebs_volume_throughput int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.ebs_volume_type compute.EbsVolumeType ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.instance_profile_arn string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.spot_bid_price_percent int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.zone_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes *compute.AzureAttributes ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.availability compute.AzureAvailability ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.capacity_reservation_group string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.log_analytics_info *compute.LogAnalyticsInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.log_analytics_info.log_analytics_primary_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.log_analytics_info.log_analytics_workspace_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.spot_bid_max_price float64 ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf *compute.ClusterLogConf ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.dbfs *compute.DbfsStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.dbfs.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3 *compute.S3StorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.canned_acl string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.enable_encryption bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.encryption_type string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.endpoint string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.kms_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3.region string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.volumes *compute.VolumesStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.volumes.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.custom_tags map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.custom_tags.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.data_security_mode compute.DataSecurityMode ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.docker_image *compute.DockerImage ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.docker_image.basic_auth *compute.DockerBasicAuth ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.docker_image.basic_auth.password string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.docker_image.basic_auth.username string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.docker_image.url string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.driver_instance_pool_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.driver_node_type_flexibility *compute.NodeTypeFlexibility ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.driver_node_type_flexibility.alternate_node_type_ids []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.driver_node_type_flexibility.alternate_node_type_ids[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.driver_node_type_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.enable_elastic_disk bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.enable_local_disk_encryption bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes *compute.GcpAttributes ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.availability compute.GcpAvailability ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.boot_disk_size int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.confidential_compute_type compute.ConfidentialComputeType ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.google_service_account string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.local_ssd_count int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.use_preemptible_executors bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.zone_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts []compute.InitScriptInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*] compute.InitScriptInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].abfss *compute.Adlsgen2Info ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].abfss.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].dbfs *compute.DbfsStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].dbfs.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].file *compute.LocalFileInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].file.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].gcs *compute.GcsStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].gcs.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3 *compute.S3StorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.canned_acl string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.enable_encryption bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.encryption_type string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.endpoint string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.kms_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3.region string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].volumes *compute.VolumesStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].volumes.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].workspace *compute.WorkspaceStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].workspace.destination string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.instance_pool_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.is_single_node bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.kind compute.Kind ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.node_type_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.num_workers int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.policy_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.remote_disk_throughput int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.runtime_engine compute.RuntimeEngine ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.single_user_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.spark_conf map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.spark_conf.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.spark_env_vars map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.spark_env_vars.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.spark_version string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.ssh_public_keys []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.ssh_public_keys[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.total_initial_remote_disk_size int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.use_ml_runtime bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.worker_node_type_flexibility *compute.NodeTypeFlexibility ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.worker_node_type_flexibility.alternate_node_type_ids []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.worker_node_type_flexibility.alternate_node_type_ids[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.workload_type *compute.WorkloadType ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.workload_type.clients compute.ClientsTypes ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.workload_type.clients.jobs bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.workload_type.clients.notebooks bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task *jobs.NotebookTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task.base_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task.base_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task.notebook_path string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notification_settings *jobs.TaskNotificationSettings ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notification_settings.alert_on_last_attempt bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notification_settings.no_alert_for_canceled_runs bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notification_settings.no_alert_for_skipped_runs bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task *jobs.PipelineTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.full_refresh bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.full_refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.full_refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.pipeline_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.refresh_flow_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.refresh_flow_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.reset_checkpoint_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task.reset_checkpoint_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task *jobs.PowerBiTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.connection_resource_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model *jobs.PowerBiModel ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.authentication_method jobs.AuthenticationMethod ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.model_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.overwrite_existing bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.storage_mode jobs.StorageMode ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.workspace_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.refresh_after_update bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables []jobs.PowerBiTable ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables[*] jobs.PowerBiTable ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables[*].catalog string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables[*].name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables[*].schema string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables[*].storage_mode jobs.StorageMode ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_operator_task *jobs.PythonOperatorTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_operator_task.main string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_operator_task.parameters []jobs.PythonOperatorTaskParameter ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_operator_task.parameters[*] jobs.PythonOperatorTaskParameter ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_operator_task.parameters[*].name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_operator_task.parameters[*].value string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task *jobs.PythonWheelTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task.entry_point string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task.named_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task.named_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task.package_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.retry_on_timeout bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_if jobs.RunIf ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task *jobs.RunJobTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.dbt_commands []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.dbt_commands[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.jar_params []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.jar_params[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.job_id int64 ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.job_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.job_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.notebook_params map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.notebook_params.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params *jobs.PipelineParams ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.full_refresh bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.full_refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.full_refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.refresh_flow_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.refresh_flow_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.reset_checkpoint_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.pipeline_params.reset_checkpoint_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.python_named_params map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.python_named_params.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.python_params []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.python_params[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.spark_submit_params []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.spark_submit_params[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.sql_params map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task.sql_params.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_jar_task *jobs.SparkJarTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_jar_task.jar_uri string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_jar_task.main_class_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_jar_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_jar_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_jar_task.run_as_repl bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task *jobs.SparkPythonTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task.python_file string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_submit_task *jobs.SparkSubmitTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_submit_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_submit_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task *jobs.SqlTask ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert *jobs.SqlTaskAlert ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert.alert_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert.pause_subscriptions bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert.subscriptions []jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert.subscriptions[*] jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert.subscriptions[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert.subscriptions[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard *jobs.SqlTaskDashboard ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.custom_subject string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.dashboard_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.pause_subscriptions bool ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.subscriptions []jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.subscriptions[*] jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.subscriptions[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard.subscriptions[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.file *jobs.SqlTaskFile ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.file.path string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.file.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.query *jobs.SqlTaskQuery ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.query.query_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.task_key string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.timeout_seconds int ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications *jobs.WebhookNotifications ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_duration_warning_threshold_exceeded []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_duration_warning_threshold_exceeded[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_duration_warning_threshold_exceeded[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_failure []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_failure[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_failure[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_start []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_start[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_start[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_streaming_backlog_exceeded []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_streaming_backlog_exceeded[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_streaming_backlog_exceeded[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_success []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_success[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_success[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task *jobs.GenAiComputeTask ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.command string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.compute *jobs.ComputeConfig ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.compute.gpu_node_pool_id string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.compute.gpu_type string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.compute.num_gpus int ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.dl_runtime_image string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.mlflow_experiment_name string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.training_script_path string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.yaml_parameters string ALL +resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.yaml_parameters_file_path string ALL +resources.job_runs.*.job_settings.tasks[*].health *jobs.JobsHealthRules ALL +resources.job_runs.*.job_settings.tasks[*].health.rules []jobs.JobsHealthRule ALL +resources.job_runs.*.job_settings.tasks[*].health.rules[*] jobs.JobsHealthRule ALL +resources.job_runs.*.job_settings.tasks[*].health.rules[*].metric jobs.JobsHealthMetric ALL +resources.job_runs.*.job_settings.tasks[*].health.rules[*].op jobs.JobsHealthOperator ALL +resources.job_runs.*.job_settings.tasks[*].health.rules[*].value int64 ALL +resources.job_runs.*.job_settings.tasks[*].job_cluster_key string ALL +resources.job_runs.*.job_settings.tasks[*].libraries []compute.Library ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*] compute.Library ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].cran *compute.RCranLibrary ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].cran.package string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].cran.repo string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].egg string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].jar string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].maven *compute.MavenLibrary ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].maven.coordinates string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].maven.exclusions []string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].maven.exclusions[*] string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].maven.repo string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].pypi *compute.PythonPyPiLibrary ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].pypi.package string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].pypi.repo string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].requirements string ALL +resources.job_runs.*.job_settings.tasks[*].libraries[*].whl string ALL +resources.job_runs.*.job_settings.tasks[*].max_retries int ALL +resources.job_runs.*.job_settings.tasks[*].min_retry_interval_millis int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster *compute.ClusterSpec ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.apply_policy_default_values bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.autoscale *compute.AutoScale ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.autoscale.max_workers int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.autoscale.min_workers int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.autotermination_minutes int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes *compute.AwsAttributes ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.availability compute.AwsAvailability ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.ebs_volume_count int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.ebs_volume_iops int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.ebs_volume_size int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.ebs_volume_throughput int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.ebs_volume_type compute.EbsVolumeType ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.instance_profile_arn string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.spot_bid_price_percent int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.zone_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes *compute.AzureAttributes ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.availability compute.AzureAvailability ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.capacity_reservation_group string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.log_analytics_info *compute.LogAnalyticsInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.log_analytics_info.log_analytics_primary_key string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.log_analytics_info.log_analytics_workspace_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.spot_bid_max_price float64 ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf *compute.ClusterLogConf ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.dbfs *compute.DbfsStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.dbfs.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3 *compute.S3StorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.canned_acl string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.enable_encryption bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.encryption_type string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.endpoint string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.kms_key string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3.region string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.volumes *compute.VolumesStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.volumes.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_name string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.custom_tags map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.custom_tags.* string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.data_security_mode compute.DataSecurityMode ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.docker_image *compute.DockerImage ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.docker_image.basic_auth *compute.DockerBasicAuth ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.docker_image.basic_auth.password string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.docker_image.basic_auth.username string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.docker_image.url string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.driver_instance_pool_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.driver_node_type_flexibility *compute.NodeTypeFlexibility ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.driver_node_type_flexibility.alternate_node_type_ids []string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.driver_node_type_flexibility.alternate_node_type_ids[*] string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.driver_node_type_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.enable_elastic_disk bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.enable_local_disk_encryption bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes *compute.GcpAttributes ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.availability compute.GcpAvailability ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.boot_disk_size int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.confidential_compute_type compute.ConfidentialComputeType ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.first_on_demand int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.google_service_account string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.local_ssd_count int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.use_preemptible_executors bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.zone_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts []compute.InitScriptInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*] compute.InitScriptInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].abfss *compute.Adlsgen2Info ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].abfss.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].dbfs *compute.DbfsStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].dbfs.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].file *compute.LocalFileInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].file.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].gcs *compute.GcsStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].gcs.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3 *compute.S3StorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.canned_acl string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.enable_encryption bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.encryption_type string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.endpoint string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.kms_key string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3.region string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].volumes *compute.VolumesStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].volumes.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].workspace *compute.WorkspaceStorageInfo ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].workspace.destination string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.instance_pool_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.is_single_node bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.kind compute.Kind ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.node_type_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.num_workers int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.policy_id string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.remote_disk_throughput int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.runtime_engine compute.RuntimeEngine ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.single_user_name string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.spark_conf map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.spark_conf.* string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.spark_env_vars map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.spark_env_vars.* string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.spark_version string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.ssh_public_keys []string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.ssh_public_keys[*] string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.total_initial_remote_disk_size int ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.use_ml_runtime bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.worker_node_type_flexibility *compute.NodeTypeFlexibility ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.worker_node_type_flexibility.alternate_node_type_ids []string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.worker_node_type_flexibility.alternate_node_type_ids[*] string ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.workload_type *compute.WorkloadType ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.workload_type.clients compute.ClientsTypes ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.workload_type.clients.jobs bool ALL +resources.job_runs.*.job_settings.tasks[*].new_cluster.workload_type.clients.notebooks bool ALL +resources.job_runs.*.job_settings.tasks[*].notebook_task *jobs.NotebookTask ALL +resources.job_runs.*.job_settings.tasks[*].notebook_task.base_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].notebook_task.base_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].notebook_task.notebook_path string ALL +resources.job_runs.*.job_settings.tasks[*].notebook_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].notebook_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].notification_settings *jobs.TaskNotificationSettings ALL +resources.job_runs.*.job_settings.tasks[*].notification_settings.alert_on_last_attempt bool ALL +resources.job_runs.*.job_settings.tasks[*].notification_settings.no_alert_for_canceled_runs bool ALL +resources.job_runs.*.job_settings.tasks[*].notification_settings.no_alert_for_skipped_runs bool ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task *jobs.PipelineTask ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.full_refresh bool ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.full_refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.full_refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.pipeline_id string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.refresh_flow_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.refresh_flow_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.reset_checkpoint_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].pipeline_task.reset_checkpoint_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task *jobs.PowerBiTask ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.connection_resource_name string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model *jobs.PowerBiModel ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.authentication_method jobs.AuthenticationMethod ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.model_name string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.overwrite_existing bool ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.storage_mode jobs.StorageMode ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.workspace_name string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.refresh_after_update bool ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables []jobs.PowerBiTable ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables[*] jobs.PowerBiTable ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables[*].catalog string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables[*].name string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables[*].schema string ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables[*].storage_mode jobs.StorageMode ALL +resources.job_runs.*.job_settings.tasks[*].power_bi_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].python_operator_task *jobs.PythonOperatorTask ALL +resources.job_runs.*.job_settings.tasks[*].python_operator_task.main string ALL +resources.job_runs.*.job_settings.tasks[*].python_operator_task.parameters []jobs.PythonOperatorTaskParameter ALL +resources.job_runs.*.job_settings.tasks[*].python_operator_task.parameters[*] jobs.PythonOperatorTaskParameter ALL +resources.job_runs.*.job_settings.tasks[*].python_operator_task.parameters[*].name string ALL +resources.job_runs.*.job_settings.tasks[*].python_operator_task.parameters[*].value string ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task *jobs.PythonWheelTask ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task.entry_point string ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task.named_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task.named_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task.package_name string ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].python_wheel_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].retry_on_timeout bool ALL +resources.job_runs.*.job_settings.tasks[*].run_if jobs.RunIf ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task *jobs.RunJobTask ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.dbt_commands []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.dbt_commands[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.jar_params []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.jar_params[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.job_id int64 ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.job_parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.job_parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.notebook_params map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.notebook_params.* string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params *jobs.PipelineParams ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.full_refresh bool ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.full_refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.full_refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.refresh_flow_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.refresh_flow_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.refresh_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.refresh_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.reset_checkpoint_selection []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.pipeline_params.reset_checkpoint_selection[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.python_named_params map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.python_named_params.* string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.python_params []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.python_params[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.spark_submit_params []string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.spark_submit_params[*] string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.sql_params map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].run_job_task.sql_params.* string ALL +resources.job_runs.*.job_settings.tasks[*].spark_jar_task *jobs.SparkJarTask ALL +resources.job_runs.*.job_settings.tasks[*].spark_jar_task.jar_uri string ALL +resources.job_runs.*.job_settings.tasks[*].spark_jar_task.main_class_name string ALL +resources.job_runs.*.job_settings.tasks[*].spark_jar_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].spark_jar_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].spark_jar_task.run_as_repl bool ALL +resources.job_runs.*.job_settings.tasks[*].spark_python_task *jobs.SparkPythonTask ALL +resources.job_runs.*.job_settings.tasks[*].spark_python_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].spark_python_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].spark_python_task.python_file string ALL +resources.job_runs.*.job_settings.tasks[*].spark_python_task.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].spark_submit_task *jobs.SparkSubmitTask ALL +resources.job_runs.*.job_settings.tasks[*].spark_submit_task.parameters []string ALL +resources.job_runs.*.job_settings.tasks[*].spark_submit_task.parameters[*] string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task *jobs.SqlTask ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert *jobs.SqlTaskAlert ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert.alert_id string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert.pause_subscriptions bool ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert.subscriptions []jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert.subscriptions[*] jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert.subscriptions[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.alert.subscriptions[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard *jobs.SqlTaskDashboard ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.custom_subject string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.dashboard_id string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.pause_subscriptions bool ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.subscriptions []jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.subscriptions[*] jobs.SqlTaskSubscription ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.subscriptions[*].destination_id string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard.subscriptions[*].user_name string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.file *jobs.SqlTaskFile ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.file.path string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.file.source jobs.Source ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.parameters map[string]string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.parameters.* string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.query *jobs.SqlTaskQuery ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.query.query_id string ALL +resources.job_runs.*.job_settings.tasks[*].sql_task.warehouse_id string ALL +resources.job_runs.*.job_settings.tasks[*].task_key string ALL +resources.job_runs.*.job_settings.tasks[*].timeout_seconds int ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications *jobs.WebhookNotifications ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_duration_warning_threshold_exceeded []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_duration_warning_threshold_exceeded[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_duration_warning_threshold_exceeded[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_failure []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_failure[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_failure[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_start []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_start[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_start[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_streaming_backlog_exceeded []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_streaming_backlog_exceeded[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_streaming_backlog_exceeded[*].id string ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_success []jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_success[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_success[*].id string ALL +resources.job_runs.*.job_settings.timeout_seconds int ALL +resources.job_runs.*.job_settings.trigger *jobs.TriggerSettings ALL +resources.job_runs.*.job_settings.trigger.file_arrival *jobs.FileArrivalTriggerConfiguration ALL +resources.job_runs.*.job_settings.trigger.file_arrival.min_time_between_triggers_seconds int ALL +resources.job_runs.*.job_settings.trigger.file_arrival.url string ALL +resources.job_runs.*.job_settings.trigger.file_arrival.wait_after_last_change_seconds int ALL +resources.job_runs.*.job_settings.trigger.model *jobs.ModelTriggerConfiguration ALL +resources.job_runs.*.job_settings.trigger.model.aliases []string ALL +resources.job_runs.*.job_settings.trigger.model.aliases[*] string ALL +resources.job_runs.*.job_settings.trigger.model.condition jobs.ModelTriggerConfigurationCondition ALL +resources.job_runs.*.job_settings.trigger.model.min_time_between_triggers_seconds int ALL +resources.job_runs.*.job_settings.trigger.model.securable_name string ALL +resources.job_runs.*.job_settings.trigger.model.wait_after_last_change_seconds int ALL +resources.job_runs.*.job_settings.trigger.pause_status jobs.PauseStatus ALL +resources.job_runs.*.job_settings.trigger.periodic *jobs.PeriodicTriggerConfiguration ALL +resources.job_runs.*.job_settings.trigger.periodic.interval int ALL +resources.job_runs.*.job_settings.trigger.periodic.unit jobs.PeriodicTriggerConfigurationTimeUnit ALL +resources.job_runs.*.job_settings.trigger.table_update *jobs.TableUpdateTriggerConfiguration ALL +resources.job_runs.*.job_settings.trigger.table_update.condition jobs.Condition ALL +resources.job_runs.*.job_settings.trigger.table_update.min_time_between_triggers_seconds int ALL +resources.job_runs.*.job_settings.trigger.table_update.table_names []string ALL +resources.job_runs.*.job_settings.trigger.table_update.table_names[*] string ALL +resources.job_runs.*.job_settings.trigger.table_update.wait_after_last_change_seconds int ALL +resources.job_runs.*.job_settings.usage_policy_id string ALL +resources.job_runs.*.job_settings.webhook_notifications *jobs.WebhookNotifications ALL +resources.job_runs.*.job_settings.webhook_notifications.on_duration_warning_threshold_exceeded []jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_duration_warning_threshold_exceeded[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_duration_warning_threshold_exceeded[*].id string ALL +resources.job_runs.*.job_settings.webhook_notifications.on_failure []jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_failure[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_failure[*].id string ALL +resources.job_runs.*.job_settings.webhook_notifications.on_start []jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_start[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_start[*].id string ALL +resources.job_runs.*.job_settings.webhook_notifications.on_streaming_backlog_exceeded []jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_streaming_backlog_exceeded[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_streaming_backlog_exceeded[*].id string ALL +resources.job_runs.*.job_settings.webhook_notifications.on_success []jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_success[*] jobs.Webhook ALL +resources.job_runs.*.job_settings.webhook_notifications.on_success[*].id string ALL +resources.job_runs.*.lifecycle resources.Lifecycle INPUT +resources.job_runs.*.lifecycle.prevent_destroy bool INPUT +resources.job_runs.*.modified_status string INPUT +resources.job_runs.*.notebook_params map[string]string ALL +resources.job_runs.*.notebook_params.* string ALL +resources.job_runs.*.only []string ALL +resources.job_runs.*.only[*] string ALL +resources.job_runs.*.performance_target jobs.PerformanceTarget ALL +resources.job_runs.*.pipeline_params *jobs.PipelineParams ALL +resources.job_runs.*.pipeline_params.full_refresh bool ALL +resources.job_runs.*.pipeline_params.full_refresh_selection []string ALL +resources.job_runs.*.pipeline_params.full_refresh_selection[*] string ALL +resources.job_runs.*.pipeline_params.refresh_flow_selection []string ALL +resources.job_runs.*.pipeline_params.refresh_flow_selection[*] string ALL +resources.job_runs.*.pipeline_params.refresh_selection []string ALL +resources.job_runs.*.pipeline_params.refresh_selection[*] string ALL +resources.job_runs.*.pipeline_params.reset_checkpoint_selection []string ALL +resources.job_runs.*.pipeline_params.reset_checkpoint_selection[*] string ALL +resources.job_runs.*.python_named_params map[string]string ALL +resources.job_runs.*.python_named_params.* string ALL +resources.job_runs.*.python_params []string ALL +resources.job_runs.*.python_params[*] string ALL +resources.job_runs.*.queue *jobs.QueueSettings ALL +resources.job_runs.*.queue.enabled bool ALL +resources.job_runs.*.run_id int64 REMOTE +resources.job_runs.*.spark_submit_params []string ALL +resources.job_runs.*.spark_submit_params[*] string ALL +resources.job_runs.*.sql_params map[string]string ALL +resources.job_runs.*.sql_params.* string ALL +resources.job_runs.*.url string INPUT resources.jobs.*.budget_policy_id string ALL resources.jobs.*.continuous *jobs.Continuous ALL resources.jobs.*.continuous.pause_status jobs.PauseStatus ALL diff --git a/acceptance/bundle/resources/job_runs/basic/databricks.yml b/acceptance/bundle/resources/job_runs/basic/databricks.yml new file mode 100644 index 00000000000..5ea02d60dc2 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/basic/databricks.yml @@ -0,0 +1,15 @@ +bundle: + name: job-runs-basic + +resources: + jobs: + my_job: + name: my-job + tasks: + - task_key: main + notebook_task: + notebook_path: /Workspace/test + + job_runs: + my_run: + job_id: ${resources.jobs.my_job.id} diff --git a/acceptance/bundle/resources/job_runs/basic/out.test.toml b/acceptance/bundle/resources/job_runs/basic/out.test.toml new file mode 100644 index 00000000000..e90b6d5d1ba --- /dev/null +++ b/acceptance/bundle/resources/job_runs/basic/out.test.toml @@ -0,0 +1,3 @@ +Local = true +Cloud = false +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] diff --git a/acceptance/bundle/resources/job_runs/basic/output.txt b/acceptance/bundle/resources/job_runs/basic/output.txt new file mode 100644 index 00000000000..d00f7b26559 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/basic/output.txt @@ -0,0 +1,90 @@ + +=== deploy triggers exactly one run +>>> [CLI] bundle validate +Name: job-runs-basic +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default + +Validation OK! + +>>> [CLI] bundle plan +create job_runs.my_run +create jobs.my_job + +Plan: 2 to add, 0 to change, 0 to delete, 0 unchanged + +>>> [CLI] bundle summary +Name: job-runs-basic +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default +Resources: + Job Runs: + my_run: + Name: + URL: (not deployed) + Jobs: + my_job: + Name: my-job + URL: (not deployed) + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> [CLI] bundle plan +Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged + +>>> [CLI] bundle summary +Name: job-runs-basic +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default +Resources: + Job Runs: + my_run: + Name: + URL: (not deployed) + Jobs: + my_job: + Name: my-job + URL: [DATABRICKS_URL]/jobs/[MY_JOB_ID]?w=[NUMID] + +=== exactly one run-now request was made +>>> print_requests.py //jobs/run-now +{ + "method": "POST", + "path": "/api/2.2/jobs/run-now", + "body": { + "job_id": [MY_JOB_ID] + } +} + +=== the triggered run id is stored in state +>>> read_id.py my_run +[MY_RUN_ID] + +>>> read_id.py my_job +[MY_JOB_ID] + +>>> [CLI] bundle destroy --auto-approve +The following resources will be deleted: + delete resources.job_runs.my_run + delete resources.jobs.my_job + +All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default + +Deleting files... +Destroy complete! diff --git a/acceptance/bundle/resources/job_runs/basic/script b/acceptance/bundle/resources/job_runs/basic/script new file mode 100644 index 00000000000..e9bdc54d706 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/basic/script @@ -0,0 +1,24 @@ +cleanup() { + trace $CLI bundle destroy --auto-approve + rm out.requests.txt +} +trap cleanup EXIT + +title "deploy triggers exactly one run" +trace $CLI bundle validate +trace $CLI bundle plan +trace $CLI bundle summary +trace $CLI bundle deploy + +# confirm that redeploy does not trigger a second run +trace $CLI bundle deploy + +trace $CLI bundle plan +trace $CLI bundle summary + +title "exactly one run-now request was made" +trace print_requests.py //jobs/run-now + +title "the triggered run id is stored in state" +trace read_id.py my_run +trace read_id.py my_job diff --git a/acceptance/bundle/resources/job_runs/basic/test.toml b/acceptance/bundle/resources/job_runs/basic/test.toml new file mode 100644 index 00000000000..4b94d8b58e9 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/basic/test.toml @@ -0,0 +1,4 @@ +# job_runs is a direct-engine-only resource; the Terraform provider has no +# equivalent, so restrict the matrix to direct. +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] +RecordRequests = true diff --git a/acceptance/bundle/resources/job_runs/job_parameters/databricks.yml b/acceptance/bundle/resources/job_runs/job_parameters/databricks.yml new file mode 100644 index 00000000000..fb6970b9286 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/job_parameters/databricks.yml @@ -0,0 +1,26 @@ +bundle: + name: job-runs-job-parameters + +resources: + jobs: + my_job: + name: my-job + parameters: + - name: env + default: dev + - name: region + default: us + tasks: + - task_key: main + notebook_task: + notebook_path: /Workspace/test + + job_runs: + my_run: + job_id: ${resources.jobs.my_job.id} + # Override only one of the job's two parameters. GetRun resolves the full + # parameter set (including the un-overridden `region` default), so without + # job_parameters in ignore_remote_changes this drift would recreate the run + # on every plan. + job_parameters: + env: prod diff --git a/acceptance/bundle/resources/job_runs/job_parameters/out.test.toml b/acceptance/bundle/resources/job_runs/job_parameters/out.test.toml new file mode 100644 index 00000000000..e90b6d5d1ba --- /dev/null +++ b/acceptance/bundle/resources/job_runs/job_parameters/out.test.toml @@ -0,0 +1,3 @@ +Local = true +Cloud = false +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] diff --git a/acceptance/bundle/resources/job_runs/job_parameters/output.txt b/acceptance/bundle/resources/job_runs/job_parameters/output.txt new file mode 100644 index 00000000000..5b32916f588 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/job_parameters/output.txt @@ -0,0 +1,49 @@ + +=== deploy triggers the run with only the overridden parameter +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-job-parameters/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> print_requests.py //jobs/run-now +{ + "method": "POST", + "path": "/api/2.2/jobs/run-now", + "body": { + "job_id": [NUMID], + "job_parameters": { + "env": "prod" + } + } +} + +=== plan is stable: the resolved job default does not look like drift +>>> [CLI] bundle plan +Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged + +>>> [CLI] bundle summary +Name: job-runs-job-parameters +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-job-parameters/default +Resources: + Job Runs: + my_run: + Name: + URL: (not deployed) + Jobs: + my_job: + Name: my-job + URL: [DATABRICKS_URL]/jobs/[NUMID]?w=[NUMID] + +>>> [CLI] bundle destroy --auto-approve +The following resources will be deleted: + delete resources.job_runs.my_run + delete resources.jobs.my_job + +All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/job-runs-job-parameters/default + +Deleting files... +Destroy complete! diff --git a/acceptance/bundle/resources/job_runs/job_parameters/script b/acceptance/bundle/resources/job_runs/job_parameters/script new file mode 100644 index 00000000000..7128b53ef68 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/job_parameters/script @@ -0,0 +1,13 @@ +cleanup() { + trace $CLI bundle destroy --auto-approve + rm out.requests.txt +} +trap cleanup EXIT + +title "deploy triggers the run with only the overridden parameter" +trace $CLI bundle deploy +trace print_requests.py //jobs/run-now + +title "plan is stable: the resolved job default does not look like drift" +trace $CLI bundle plan +trace $CLI bundle summary diff --git a/acceptance/bundle/resources/job_runs/job_parameters/test.toml b/acceptance/bundle/resources/job_runs/job_parameters/test.toml new file mode 100644 index 00000000000..4b94d8b58e9 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/job_parameters/test.toml @@ -0,0 +1,4 @@ +# job_runs is a direct-engine-only resource; the Terraform provider has no +# equivalent, so restrict the matrix to direct. +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] +RecordRequests = true diff --git a/acceptance/bundle/resources/job_runs/notebook_change/databricks.yml b/acceptance/bundle/resources/job_runs/notebook_change/databricks.yml new file mode 100644 index 00000000000..61808fb33bc --- /dev/null +++ b/acceptance/bundle/resources/job_runs/notebook_change/databricks.yml @@ -0,0 +1,19 @@ +bundle: + name: job-runs-notebook-change + +resources: + jobs: + my_job: + name: my-job + tasks: + - task_key: main + notebook_task: + notebook_path: /Workspace/test + + job_runs: + my_run: + job_id: ${resources.jobs.my_job.id} + job_parameters: + env: dev + # Snapshot the whole job so any change to it (e.g. notebook_path) re-triggers the run. + job_settings: ${resources.jobs.my_job} diff --git a/acceptance/bundle/resources/job_runs/notebook_change/out.test.toml b/acceptance/bundle/resources/job_runs/notebook_change/out.test.toml new file mode 100644 index 00000000000..e90b6d5d1ba --- /dev/null +++ b/acceptance/bundle/resources/job_runs/notebook_change/out.test.toml @@ -0,0 +1,3 @@ +Local = true +Cloud = false +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] diff --git a/acceptance/bundle/resources/job_runs/notebook_change/output.txt b/acceptance/bundle/resources/job_runs/notebook_change/output.txt new file mode 100644 index 00000000000..8e03aa3eeb7 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/notebook_change/output.txt @@ -0,0 +1,85 @@ + +=== initial deploy triggers the first run +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-notebook-change/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> print_requests.py //jobs/run-now +{ + "method": "POST", + "path": "/api/2.2/jobs/run-now", + "body": { + "job_id": [NUMID], + "job_parameters": { + "env": "dev" + } + } +} + +=== change the job notebook_path and redeploy +>>> update_file.py databricks.yml notebook_path: /Workspace/test notebook_path: /Workspace/other + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-notebook-change/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> [CLI] bundle plan +Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged + +=== the job was updated with the new notebook_path +>>> print_requests.py --keep //jobs/reset +{ + "method": "POST", + "path": "/api/2.2/jobs/reset", + "body": { + "job_id": [NUMID], + "new_settings": { + "deployment": { + "kind": "BUNDLE", + "metadata_file_path": "/Workspace/Users/[USERNAME]/.bundle/job-runs-notebook-change/default/state/metadata.json" + }, + "edit_mode": "UI_LOCKED", + "format": "MULTI_TASK", + "max_concurrent_runs": 1, + "name": "my-job", + "queue": { + "enabled": true + }, + "tasks": [ + { + "notebook_task": { + "notebook_path": "/Workspace/other" + }, + "task_key": "main" + } + ] + } + } +} + +=== the job change re-triggered the run via the job_settings snapshot +>>> print_requests.py //jobs/run-now +{ + "method": "POST", + "path": "/api/2.2/jobs/run-now", + "body": { + "job_id": [NUMID], + "job_parameters": { + "env": "dev" + } + } +} + +>>> [CLI] bundle destroy --auto-approve +The following resources will be deleted: + delete resources.job_runs.my_run + delete resources.jobs.my_job + +All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/job-runs-notebook-change/default + +Deleting files... +Destroy complete! diff --git a/acceptance/bundle/resources/job_runs/notebook_change/script b/acceptance/bundle/resources/job_runs/notebook_change/script new file mode 100644 index 00000000000..8a1ec570e43 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/notebook_change/script @@ -0,0 +1,20 @@ +cleanup() { + trace $CLI bundle destroy --auto-approve + rm out.requests.txt +} +trap cleanup EXIT + +title "initial deploy triggers the first run" +trace $CLI bundle deploy +trace print_requests.py //jobs/run-now + +title "change the job notebook_path and redeploy" +trace update_file.py databricks.yml "notebook_path: /Workspace/test" "notebook_path: /Workspace/other" +trace $CLI bundle deploy +trace $CLI bundle plan + +title "the job was updated with the new notebook_path" +trace print_requests.py --keep //jobs/reset + +title "the job change re-triggered the run via the job_settings snapshot" +trace print_requests.py //jobs/run-now diff --git a/acceptance/bundle/resources/job_runs/notebook_change/test.toml b/acceptance/bundle/resources/job_runs/notebook_change/test.toml new file mode 100644 index 00000000000..4b94d8b58e9 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/notebook_change/test.toml @@ -0,0 +1,4 @@ +# job_runs is a direct-engine-only resource; the Terraform provider has no +# equivalent, so restrict the matrix to direct. +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] +RecordRequests = true diff --git a/acceptance/bundle/resources/job_runs/redeploy/databricks.yml b/acceptance/bundle/resources/job_runs/redeploy/databricks.yml new file mode 100644 index 00000000000..370829ce20c --- /dev/null +++ b/acceptance/bundle/resources/job_runs/redeploy/databricks.yml @@ -0,0 +1,17 @@ +bundle: + name: job-runs-redeploy + +resources: + jobs: + my_job: + name: my-job + tasks: + - task_key: main + notebook_task: + notebook_path: /Workspace/test + + job_runs: + my_run: + job_id: ${resources.jobs.my_job.id} + job_parameters: + env: dev diff --git a/acceptance/bundle/resources/job_runs/redeploy/out.test.toml b/acceptance/bundle/resources/job_runs/redeploy/out.test.toml new file mode 100644 index 00000000000..e90b6d5d1ba --- /dev/null +++ b/acceptance/bundle/resources/job_runs/redeploy/out.test.toml @@ -0,0 +1,3 @@ +Local = true +Cloud = false +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] diff --git a/acceptance/bundle/resources/job_runs/redeploy/output.txt b/acceptance/bundle/resources/job_runs/redeploy/output.txt new file mode 100644 index 00000000000..7d6c45f74b4 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/redeploy/output.txt @@ -0,0 +1,92 @@ + +=== initial deploy triggers the first run +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-redeploy/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> [CLI] bundle plan +Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged + +>>> [CLI] bundle summary +Name: job-runs-redeploy +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-redeploy/default +Resources: + Job Runs: + my_run: + Name: + URL: (not deployed) + Jobs: + my_job: + Name: my-job + URL: [DATABRICKS_URL]/jobs/[MY_JOB_ID]?w=[NUMID] + +>>> read_id.py my_job +[MY_JOB_ID] + +>>> print_requests.py //jobs/run-now +{ + "method": "POST", + "path": "/api/2.2/jobs/run-now", + "body": { + "job_id": [MY_JOB_ID], + "job_parameters": { + "env": "dev" + } + } +} + +=== change the run configuration and redeploy +>>> update_file.py databricks.yml env: dev env: prod + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-redeploy/default/files... +Deploying resources... +Updating deployment state... +Deployment complete! + +>>> [CLI] bundle plan +Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged + +>>> [CLI] bundle summary +Name: job-runs-redeploy +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-redeploy/default +Resources: + Job Runs: + my_run: + Name: + URL: (not deployed) + Jobs: + my_job: + Name: my-job + URL: [DATABRICKS_URL]/jobs/[MY_JOB_ID]?w=[NUMID] + +=== the config change triggered a second, different run +>>> print_requests.py //jobs/run-now +{ + "method": "POST", + "path": "/api/2.2/jobs/run-now", + "body": { + "job_id": [MY_JOB_ID], + "job_parameters": { + "env": "prod" + } + } +} + +>>> [CLI] bundle destroy --auto-approve +The following resources will be deleted: + delete resources.job_runs.my_run + delete resources.jobs.my_job + +All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/job-runs-redeploy/default + +Deleting files... +Destroy complete! diff --git a/acceptance/bundle/resources/job_runs/redeploy/script b/acceptance/bundle/resources/job_runs/redeploy/script new file mode 100644 index 00000000000..6665c870881 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/redeploy/script @@ -0,0 +1,21 @@ +cleanup() { + trace $CLI bundle destroy --auto-approve + rm out.requests.txt +} +trap cleanup EXIT + +title "initial deploy triggers the first run" +trace $CLI bundle deploy +trace $CLI bundle plan +trace $CLI bundle summary +trace read_id.py my_job +trace print_requests.py //jobs/run-now + +title "change the run configuration and redeploy" +trace update_file.py databricks.yml "env: dev" "env: prod" +trace $CLI bundle deploy +trace $CLI bundle plan +trace $CLI bundle summary + +title "the config change triggered a second, different run" +trace print_requests.py //jobs/run-now diff --git a/acceptance/bundle/resources/job_runs/redeploy/test.toml b/acceptance/bundle/resources/job_runs/redeploy/test.toml new file mode 100644 index 00000000000..4b94d8b58e9 --- /dev/null +++ b/acceptance/bundle/resources/job_runs/redeploy/test.toml @@ -0,0 +1,4 @@ +# job_runs is a direct-engine-only resource; the Terraform provider has no +# equivalent, so restrict the matrix to direct. +EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"] +RecordRequests = true diff --git a/bundle/config/mutator/resourcemutator/apply_bundle_permissions_test.go b/bundle/config/mutator/resourcemutator/apply_bundle_permissions_test.go index 2fbe07b270a..41686b326ac 100644 --- a/bundle/config/mutator/resourcemutator/apply_bundle_permissions_test.go +++ b/bundle/config/mutator/resourcemutator/apply_bundle_permissions_test.go @@ -33,6 +33,7 @@ var unsupportedResources = []string{ "postgres_roles", "postgres_synced_tables", "vector_search_indexes", + "job_runs", } func TestApplyBundlePermissions(t *testing.T) { diff --git a/bundle/config/mutator/resourcemutator/apply_target_mode_test.go b/bundle/config/mutator/resourcemutator/apply_target_mode_test.go index bc3b44cbdca..da9fcab9770 100644 --- a/bundle/config/mutator/resourcemutator/apply_target_mode_test.go +++ b/bundle/config/mutator/resourcemutator/apply_target_mode_test.go @@ -92,6 +92,9 @@ func mockBundle(mode config.Mode) *bundle.Bundle { }, }, }, + JobRuns: map[string]*resources.JobRun{ + "job_run1": {RunNow: jobs.RunNow{JobId: 1234}}, + }, Pipelines: map[string]*resources.Pipeline{ "pipeline1": {CreatePipeline: pipelines.CreatePipeline{Name: "pipeline1", Continuous: true}}, }, diff --git a/bundle/config/mutator/resourcemutator/run_as.go b/bundle/config/mutator/resourcemutator/run_as.go index 4f5e3ce9036..132f0d1dfa5 100644 --- a/bundle/config/mutator/resourcemutator/run_as.go +++ b/bundle/config/mutator/resourcemutator/run_as.go @@ -126,6 +126,17 @@ func validateRunAs(b *bundle.Bundle) diag.Diagnostics { )) } + // Job runs execute under the triggered job's own identity; the RunNow API + // has no run_as field, so a differing bundle run_as cannot be honored. + if len(b.Config.Resources.JobRuns) > 0 { + diags = diags.Extend(reportRunAsNotSupported( + "job_runs", + b.Config.GetLocation("resources.job_runs"), + b.Config.Workspace.CurrentUser.UserName, + identity, + )) + } + return diags } diff --git a/bundle/config/mutator/resourcemutator/run_as_test.go b/bundle/config/mutator/resourcemutator/run_as_test.go index 5f98190ecb3..01da5d753f7 100644 --- a/bundle/config/mutator/resourcemutator/run_as_test.go +++ b/bundle/config/mutator/resourcemutator/run_as_test.go @@ -42,6 +42,7 @@ func allResourceTypes(t *testing.T) []string { "experiments", "external_locations", "genie_spaces", + "job_runs", "jobs", "model_serving_endpoints", "models", diff --git a/bundle/config/resources.go b/bundle/config/resources.go index 8d294aef103..cfbfbe9fff5 100644 --- a/bundle/config/resources.go +++ b/bundle/config/resources.go @@ -12,6 +12,7 @@ import ( // Resources defines Databricks resources associated with the bundle. type Resources struct { Jobs map[string]*resources.Job `json:"jobs,omitempty"` + JobRuns map[string]*resources.JobRun `json:"job_runs,omitempty"` Pipelines map[string]*resources.Pipeline `json:"pipelines,omitempty"` Models map[string]*resources.MlflowModel `json:"models,omitempty"` @@ -96,6 +97,7 @@ func (r *Resources) AllResources() []ResourceGroup { descriptions := SupportedResources() return []ResourceGroup{ collectResourceMap(descriptions["jobs"], r.Jobs), + collectResourceMap(descriptions["job_runs"], r.JobRuns), collectResourceMap(descriptions["pipelines"], r.Pipelines), collectResourceMap(descriptions["models"], r.Models), collectResourceMap(descriptions["experiments"], r.Experiments), @@ -157,6 +159,7 @@ func (r *Resources) FindResourceByConfigKey(key string) (ConfigResource, error) func SupportedResources() map[string]resources.ResourceDescription { return map[string]resources.ResourceDescription{ "jobs": (&resources.Job{}).ResourceDescription(), + "job_runs": (&resources.JobRun{}).ResourceDescription(), "pipelines": (&resources.Pipeline{}).ResourceDescription(), "models": (&resources.MlflowModel{}).ResourceDescription(), "experiments": (&resources.MlflowExperiment{}).ResourceDescription(), diff --git a/bundle/config/resources/job_run.go b/bundle/config/resources/job_run.go new file mode 100644 index 00000000000..51a8310c636 --- /dev/null +++ b/bundle/config/resources/job_run.go @@ -0,0 +1,79 @@ +package resources + +import ( + "context" + "net/url" + "strconv" + + "github.com/databricks/cli/libs/log" + "github.com/databricks/databricks-sdk-go" + "github.com/databricks/databricks-sdk-go/marshal" + "github.com/databricks/databricks-sdk-go/service/jobs" +) + +// JobRun is the bundle config for a triggered job run. The run is described by +// the same fields as the Jobs RunNow API request, so we embed jobs.RunNow +// directly instead of re-declaring them. +type JobRun struct { + BaseResource + jobs.RunNow + + // JobSettings snapshots the settings of the job this run targets. RunNow only + // carries the job_id, which is stable across edits to the job, so without this + // the run has no way to notice that the job's definition changed. Set it to a + // whole-job reference (e.g. job_settings: ${resources.jobs.my_job}) and any + // change to the job re-triggers the run, since the snapshot is marked + // recreate_on_changes in resources.yml. + JobSettings *jobs.JobSettings `json:"job_settings,omitempty"` +} + +func (r *JobRun) UnmarshalJSON(b []byte) error { + return marshal.Unmarshal(b, r) +} + +func (r JobRun) MarshalJSON() ([]byte, error) { + return marshal.Marshal(r) +} + +// Exists reports whether the run identified by id (a numeric run id) still +// exists in the workspace. A run is the unit of existence here: once RunNow has +// been called, the run is retrievable via GetRun for as long as the workspace +// retains its history. +func (r *JobRun) Exists(ctx context.Context, w *databricks.WorkspaceClient, id string) (bool, error) { + runID, err := strconv.ParseInt(id, 10, 64) + if err != nil { + return false, err + } + _, err = w.Jobs.GetRun(ctx, jobs.GetRunRequest{ + RunId: runID, + }) + if err != nil { + log.Debugf(ctx, "job run %s does not exist", id) + return false, err + } + return true, nil +} + +func (r *JobRun) ResourceDescription() ResourceDescription { + return ResourceDescription{ + SingularName: "job_run", + PluralName: "job_runs", + SingularTitle: "Job Run", + PluralTitle: "Job Runs", + } +} + +// GetName returns the in-product name. A run has no user-assigned name, so this +// is empty. +func (r *JobRun) GetName() string { + return "" +} + +func (r *JobRun) GetURL() string { + return r.URL +} + +// InitializeURL is a no-op for now: surfacing a stable run URL is deferred to a +// later milestone. +func (r *JobRun) InitializeURL(_ url.URL) { +} diff --git a/bundle/config/resources_test.go b/bundle/config/resources_test.go index c5f32267531..f23c349035a 100644 --- a/bundle/config/resources_test.go +++ b/bundle/config/resources_test.go @@ -125,6 +125,9 @@ func TestBundleResourcePluralNamesResolveInWorkspaceURLs(t *testing.T) { // Resources that intentionally have no workspace URL. noURL := map[string]bool{ "external_locations": true, + // A job run has no stable workspace URL yet; surfacing one is deferred + // to a later milestone (see JobRun.InitializeURL). + "job_runs": true, "postgres_branches": true, "postgres_databases": true, "postgres_endpoints": true, @@ -159,6 +162,11 @@ func TestResourcesBindSupport(t *testing.T) { JobSettings: jobs.JobSettings{}, }, }, + JobRuns: map[string]*resources.JobRun{ + "my_job_run": { + RunNow: jobs.RunNow{}, + }, + }, Pipelines: map[string]*resources.Pipeline{ "my_pipeline": { CreatePipeline: pipelines.CreatePipeline{}, @@ -336,6 +344,7 @@ func TestResourcesBindSupport(t *testing.T) { ctx := t.Context() m := mocks.NewMockWorkspaceClient(t) m.GetMockJobsAPI().EXPECT().Get(mock.Anything, mock.Anything).Return(nil, nil) + m.GetMockJobsAPI().EXPECT().GetRun(mock.Anything, mock.Anything).Return(nil, nil) m.GetMockPipelinesAPI().EXPECT().Get(mock.Anything, mock.Anything).Return(nil, nil) m.GetMockExperimentsAPI().EXPECT().GetExperiment(mock.Anything, mock.Anything).Return(nil, nil) m.GetMockRegisteredModelsAPI().EXPECT().Get(mock.Anything, mock.Anything).Return(nil, nil) diff --git a/bundle/deploy/terraform/lifecycle_test.go b/bundle/deploy/terraform/lifecycle_test.go index b60bff612c7..248a66c21a9 100644 --- a/bundle/deploy/terraform/lifecycle_test.go +++ b/bundle/deploy/terraform/lifecycle_test.go @@ -18,6 +18,7 @@ func TestConvertLifecycleForAllResources(t *testing.T) { "catalogs", "external_locations", "genie_spaces", + "job_runs", "vector_search_endpoints", "vector_search_indexes", } diff --git a/bundle/direct/dresources/all.go b/bundle/direct/dresources/all.go index 4df9dfe58b8..9856e6f979d 100644 --- a/bundle/direct/dresources/all.go +++ b/bundle/direct/dresources/all.go @@ -8,6 +8,7 @@ import ( var SupportedResources = map[string]any{ "jobs": (*ResourceJob)(nil), + "job_runs": (*ResourceJobRun)(nil), "pipelines": (*ResourcePipeline)(nil), "experiments": (*ResourceExperiment)(nil), "catalogs": (*ResourceCatalog)(nil), diff --git a/bundle/direct/dresources/all_test.go b/bundle/direct/dresources/all_test.go index a986ca3ac47..35cc16374f7 100644 --- a/bundle/direct/dresources/all_test.go +++ b/bundle/direct/dresources/all_test.go @@ -319,6 +319,30 @@ var testDeps = map[string]prepareWorkspace{ return testConfig["vector_search_indexes"], nil }, + "job_runs": func(ctx context.Context, client *databricks.WorkspaceClient) (any, error) { + // A run can only be triggered against an existing job, so create one first. + resp, err := client.Jobs.Create(ctx, jobs.CreateJob{ + Name: "job-for-run", + Tasks: []jobs.Task{ + { + TaskKey: "t", + NotebookTask: &jobs.NotebookTask{ + NotebookPath: "/Workspace/Users/user@example.com/notebook", + }, + }, + }, + }) + if err != nil { + return nil, err + } + + return &resources.JobRun{ + RunNow: jobs.RunNow{ + JobId: resp.JobId, + }, + }, nil + }, + "jobs.permissions": func(ctx context.Context, client *databricks.WorkspaceClient) (any, error) { resp, err := client.Jobs.Create(ctx, jobs.CreateJob{ Name: "job-permissions", @@ -1025,7 +1049,9 @@ func testCRUD(t *testing.T, group string, adapter *Adapter, client *databricks.W require.NoError(t, err) } - deleteIsNoop := strings.HasSuffix(group, "permissions") || strings.HasSuffix(group, "grants") + // job_runs has a no-op DoDelete (a triggered run cannot be "undeployed"), so + // the run remains readable after delete, like permissions and grants. + deleteIsNoop := strings.HasSuffix(group, "permissions") || strings.HasSuffix(group, "grants") || group == "job_runs" remoteAfterDelete, err := adapter.DoRead(ctx, createdID) if deleteIsNoop { diff --git a/bundle/direct/dresources/apitypes.generated.yml b/bundle/direct/dresources/apitypes.generated.yml index 8fb3f0117c4..8fc2eec34a0 100644 --- a/bundle/direct/dresources/apitypes.generated.yml +++ b/bundle/direct/dresources/apitypes.generated.yml @@ -20,6 +20,8 @@ external_locations: catalog.CreateExternalLocation genie_spaces: dashboards.GenieUpdateSpaceRequest +job_runs: jobs.RunNow + jobs: jobs.JobSettings model_serving_endpoints: serving.CreateServingEndpoint diff --git a/bundle/direct/dresources/job_run.go b/bundle/direct/dresources/job_run.go new file mode 100644 index 00000000000..55dd07d22c9 --- /dev/null +++ b/bundle/direct/dresources/job_run.go @@ -0,0 +1,149 @@ +package dresources + +import ( + "context" + "fmt" + "strconv" + + "github.com/databricks/cli/bundle/config/resources" + "github.com/databricks/databricks-sdk-go" + "github.com/databricks/databricks-sdk-go/marshal" + "github.com/databricks/databricks-sdk-go/service/jobs" +) + +// JobRunState is what we persist for a triggered run: the RunNow request plus a +// snapshot of the targeted job's settings. The snapshot is what lets a change to +// the job re-trigger the run (RunNow only carries the stable job_id). A custom +// marshaler is required because the embedded jobs.RunNow has its own MarshalJSON +// which would otherwise take over and drop JobSettings. +type JobRunState struct { + jobs.RunNow + + JobSettings *jobs.JobSettings `json:"job_settings,omitempty"` +} + +func (s *JobRunState) UnmarshalJSON(b []byte) error { + return marshal.Unmarshal(b, s) +} + +func (s JobRunState) MarshalJSON() ([]byte, error) { + return marshal.Marshal(s) +} + +// JobRunRemote is the return type for DoRead. It embeds JobRunState so that every +// path in StateType is also a valid path in RemoteType (required by the +// framework). DoRead fills the embedded state from the GetRun response, mapping +// the run's job-level and overriding parameters back into the RunNow shape so the +// framework can diff them against the desired config. RunId is the remote +// identity, kept here for the detailed plan. +type JobRunRemote struct { + JobRunState + + RunId int64 `json:"run_id,omitempty"` +} + +func (s *JobRunRemote) UnmarshalJSON(b []byte) error { + return marshal.Unmarshal(b, s) +} + +func (s JobRunRemote) MarshalJSON() ([]byte, error) { + return marshal.Marshal(s) +} + +type ResourceJobRun struct { + client *databricks.WorkspaceClient +} + +func (*ResourceJobRun) New(client *databricks.WorkspaceClient) *ResourceJobRun { + return &ResourceJobRun{ + client: client, + } +} + +func (*ResourceJobRun) PrepareState(input *resources.JobRun) *JobRunState { + return &JobRunState{ + RunNow: input.RunNow, + JobSettings: input.JobSettings, + } +} + +func (*ResourceJobRun) RemapState(remote *JobRunRemote) *JobRunState { + return &remote.JobRunState +} + +func (r *ResourceJobRun) DoRead(ctx context.Context, id string) (*JobRunRemote, error) { + runID, err := parseRunID(id) + if err != nil { + return nil, err + } + run, err := r.client.Jobs.GetRun(ctx, jobs.GetRunRequest{ + RunId: runID, + IncludeHistory: false, + IncludeResolvedValues: false, + PageToken: "", + ForceSendFields: nil, + }) + if err != nil { + return nil, err + } + // Record the remote state as what we actually created: the fields GetRun + // echoes back faithfully, namely the run's job_id and the overriding + // parameters it was launched with. This is what the out-of-band diff compares + // against the state saved by DoCreate. + // + // We deliberately do NOT map run.JobParameters here: GetRun resolves it to the + // job's full parameter set (including defaults the run never overrode), which + // is not what we created. Mapping it would only feed a diff we then have to + // suppress, so job_parameters (along with the request-only fields and the + // synthetic job_settings snapshot, none of which GetRun returns) is handled + // via ignore_remote_changes in resources.yml. + var state JobRunState + state.JobId = run.JobId + if p := run.OverridingParameters; p != nil { + state.DbtCommands = p.DbtCommands + state.JarParams = p.JarParams + state.NotebookParams = p.NotebookParams + state.PipelineParams = p.PipelineParams + state.PythonNamedParams = p.PythonNamedParams + state.PythonParams = p.PythonParams + state.SparkSubmitParams = p.SparkSubmitParams + state.SqlParams = p.SqlParams + } + return &JobRunRemote{JobRunState: state, RunId: run.RunId}, nil +} + +func (r *ResourceJobRun) DoCreate(ctx context.Context, config *JobRunState) (string, *JobRunRemote, error) { + // Only the RunNow request is sent to the backend; JobSettings is a local-only + // snapshot used to detect job changes, not part of the run-now payload. + // RunNow returns immediately with the new run id; waiting for completion is + // a later milestone. + wait, err := r.client.Jobs.RunNow(ctx, config.RunNow) + if err != nil { + return "", nil, err + } + // RunNow's response carries only the run id, so we reconstruct the remote + // state from the request we just sent (the faithful record of what we + // created) plus the new run id. This lets the framework compute the + // out-of-band diff against what DoRead later reads back. + remote := &JobRunRemote{JobRunState: *config, RunId: wait.RunId} + return strconv.FormatInt(wait.RunId, 10), remote, nil +} + +// DoUpdate is intentionally not implemented: there is no API to modify a run in +// place. Every request field is marked recreate_on_changes in resources.yml, so +// any config change goes through delete + create (a fresh RunNow). + +// DoDelete is a no-op: a triggered run cannot be "undeployed". On recreate the +// framework calls this before DoCreate, so a no-op delete followed by RunNow +// re-triggers the run, which is the intended behavior. +func (r *ResourceJobRun) DoDelete(ctx context.Context, id string, _ *JobRunState) error { + return nil +} + +func parseRunID(id string) (int64, error) { + result, err := strconv.ParseInt(id, 10, 64) + if err != nil { + return 0, fmt.Errorf("internal error: run id is not integer: %q: %w", id, err) + } + return result, nil +} diff --git a/bundle/direct/dresources/resources.generated.yml b/bundle/direct/dresources/resources.generated.yml index d1dab12b17d..e67e7a3282f 100644 --- a/bundle/direct/dresources/resources.generated.yml +++ b/bundle/direct/dresources/resources.generated.yml @@ -176,6 +176,8 @@ resources: - field: etag reason: spec:output_only + # job_runs: no api field behaviors + # jobs: no api field behaviors # model_serving_endpoints: no api field behaviors diff --git a/bundle/direct/dresources/resources.yml b/bundle/direct/dresources/resources.yml index 624e0eb580f..e2c951918e3 100644 --- a/bundle/direct/dresources/resources.yml +++ b/bundle/direct/dresources/resources.yml @@ -116,6 +116,69 @@ resources: - field: tasks[*].new_cluster.data_security_mode - field: job_clusters[*].new_cluster.data_security_mode + job_runs: + # GetRun echoes the run's overriding parameters, so DoRead maps those back + # (see RemapState) and the framework diffs them directly. Ignored here are the + # fields GetRun does NOT return faithfully: the request-only inputs that never + # appear in the run, the synthetic job_settings snapshot, and job_parameters + # (GetRun resolves the job's full parameter set, including defaults the run + # never overrode, so a direct diff would look like perpetual remote drift). + ignore_remote_changes: + - field: idempotency_token + reason: input_only + # GetRun returns every parameter the job defines with its resolved value, + # not just the ones the run overrode, so a direct diff against the RunNow + # request would always show drift. A local change still re-triggers the run + # via recreate_on_changes below. + - field: job_parameters + reason: input_only + # Local-only snapshot of the targeted job's settings; GetRun never returns + # it, so it always looks like remote drift unless ignored here. + - field: job_settings + reason: input_only + - field: only + reason: input_only + - field: performance_target + reason: input_only + - field: queue + reason: input_only + # There is no API to modify a run in place, so any change to the request must + # re-trigger a fresh run. With no DoUpdate, recreate (no-op delete + RunNow) + # is the only path; every request field is marked immutable here. + recreate_on_changes: + - field: dbt_commands + reason: immutable + - field: idempotency_token + reason: immutable + - field: jar_params + reason: immutable + - field: job_id + reason: immutable + - field: job_parameters + reason: immutable + # A change to the targeted job's settings snapshot must re-trigger the run; + # prefix matching means any nested job field counts as a change. + - field: job_settings + reason: immutable + - field: notebook_params + reason: immutable + - field: only + reason: immutable + - field: performance_target + reason: immutable + - field: pipeline_params + reason: immutable + - field: python_named_params + reason: immutable + - field: python_params + reason: immutable + - field: queue + reason: immutable + - field: spark_submit_params + reason: immutable + - field: sql_params + reason: immutable + pipelines: recreate_on_changes: - field: storage diff --git a/bundle/internal/schema/annotations.yml b/bundle/internal/schema/annotations.yml index 3adb9e9e740..2aa564372d5 100644 --- a/bundle/internal/schema/annotations.yml +++ b/bundle/internal/schema/annotations.yml @@ -788,6 +788,19 @@ resources: "warehouse_id": "description": |- ID of the SQL warehouse used to run queries for this Genie space. + "job_runs": + "description": |- + PLACEHOLDER + "$fields": + "job_settings": + "description": |- + PLACEHOLDER + "lifecycle": + "description": |- + PLACEHOLDER + "python_named_params": + "description": |- + PLACEHOLDER "jobs": "description": |- The job definitions for the bundle, where each key is the name of the job. diff --git a/bundle/internal/validation/generated/enum_fields.go b/bundle/internal/validation/generated/enum_fields.go index d5f62ac45b8..d605d98a00c 100644 --- a/bundle/internal/validation/generated/enum_fields.go +++ b/bundle/internal/validation/generated/enum_fields.go @@ -64,6 +64,73 @@ var EnumFields = map[string][]string{ "resources.genie_spaces.*.permissions[*].level": {"CAN_ATTACH_TO", "CAN_BIND", "CAN_CREATE", "CAN_CREATE_APP", "CAN_EDIT", "CAN_EDIT_METADATA", "CAN_MANAGE", "CAN_MANAGE_PRODUCTION_VERSIONS", "CAN_MANAGE_RUN", "CAN_MANAGE_STAGING_VERSIONS", "CAN_MONITOR", "CAN_MONITOR_ONLY", "CAN_QUERY", "CAN_READ", "CAN_RESTART", "CAN_RUN", "CAN_USE", "CAN_VIEW", "CAN_VIEW_METADATA", "IS_OWNER"}, + "resources.job_runs.*.job_settings.continuous.pause_status": {"PAUSED", "UNPAUSED"}, + "resources.job_runs.*.job_settings.continuous.task_retry_mode": {"NEVER", "ON_FAILURE"}, + "resources.job_runs.*.job_settings.deployment.kind": {"BUNDLE", "SYSTEM_MANAGED"}, + "resources.job_runs.*.job_settings.edit_mode": {"EDITABLE", "UI_LOCKED"}, + "resources.job_runs.*.job_settings.format": {"MULTI_TASK", "SINGLE_TASK"}, + "resources.job_runs.*.job_settings.git_source.git_provider": {"awsCodeCommit", "azureDevOpsServices", "bitbucketCloud", "bitbucketServer", "gitHub", "gitHubEnterprise", "gitLab", "gitLabEnterpriseEdition"}, + "resources.job_runs.*.job_settings.git_source.job_source.dirty_state": {"DISCONNECTED", "NOT_SYNCED"}, + "resources.job_runs.*.job_settings.health.rules[*].metric": {"RUN_DURATION_SECONDS", "STREAMING_BACKLOG_BYTES", "STREAMING_BACKLOG_FILES", "STREAMING_BACKLOG_RECORDS", "STREAMING_BACKLOG_SECONDS"}, + "resources.job_runs.*.job_settings.health.rules[*].op": {"GREATER_THAN"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.availability": {"ON_DEMAND", "SPOT", "SPOT_WITH_FALLBACK"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.aws_attributes.ebs_volume_type": {"GENERAL_PURPOSE_SSD", "THROUGHPUT_OPTIMIZED_HDD"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.azure_attributes.availability": {"ON_DEMAND_AZURE", "SPOT_AZURE", "SPOT_WITH_FALLBACK_AZURE"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.data_security_mode": {"DATA_SECURITY_MODE_AUTO", "DATA_SECURITY_MODE_DEDICATED", "DATA_SECURITY_MODE_STANDARD", "LEGACY_PASSTHROUGH", "LEGACY_SINGLE_USER", "LEGACY_SINGLE_USER_STANDARD", "LEGACY_TABLE_ACL", "NONE", "SINGLE_USER", "USER_ISOLATION"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.availability": {"ON_DEMAND_GCP", "PREEMPTIBLE_GCP", "PREEMPTIBLE_WITH_FALLBACK_GCP"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.gcp_attributes.confidential_compute_type": {"CONFIDENTIAL_COMPUTE_TYPE_NONE", "SEV_SNP"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.kind": {"CLASSIC_PREVIEW"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.runtime_engine": {"NULL", "PHOTON", "STANDARD"}, + "resources.job_runs.*.job_settings.performance_target": {"PERFORMANCE_OPTIMIZED", "STANDARD"}, + "resources.job_runs.*.job_settings.schedule.pause_status": {"PAUSED", "UNPAUSED"}, + "resources.job_runs.*.job_settings.tasks[*].compute.hardware_accelerator": {"GPU_1xA10", "GPU_8xH100"}, + "resources.job_runs.*.job_settings.tasks[*].condition_task.op": {"EQUAL_TO", "GREATER_THAN", "GREATER_THAN_OR_EQUAL", "LESS_THAN", "LESS_THAN_OR_EQUAL", "NOT_EQUAL"}, + "resources.job_runs.*.job_settings.tasks[*].dbt_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.compute.hardware_accelerator": {"GPU_1xA10", "GPU_8xH100"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.condition_task.op": {"EQUAL_TO", "GREATER_THAN", "GREATER_THAN_OR_EQUAL", "LESS_THAN", "LESS_THAN_OR_EQUAL", "NOT_EQUAL"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*].metric": {"RUN_DURATION_SECONDS", "STREAMING_BACKLOG_BYTES", "STREAMING_BACKLOG_FILES", "STREAMING_BACKLOG_RECORDS", "STREAMING_BACKLOG_SECONDS"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*].op": {"GREATER_THAN"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.availability": {"ON_DEMAND", "SPOT", "SPOT_WITH_FALLBACK"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.aws_attributes.ebs_volume_type": {"GENERAL_PURPOSE_SSD", "THROUGHPUT_OPTIMIZED_HDD"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.azure_attributes.availability": {"ON_DEMAND_AZURE", "SPOT_AZURE", "SPOT_WITH_FALLBACK_AZURE"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.data_security_mode": {"DATA_SECURITY_MODE_AUTO", "DATA_SECURITY_MODE_DEDICATED", "DATA_SECURITY_MODE_STANDARD", "LEGACY_PASSTHROUGH", "LEGACY_SINGLE_USER", "LEGACY_SINGLE_USER_STANDARD", "LEGACY_TABLE_ACL", "NONE", "SINGLE_USER", "USER_ISOLATION"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.availability": {"ON_DEMAND_GCP", "PREEMPTIBLE_GCP", "PREEMPTIBLE_WITH_FALLBACK_GCP"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.gcp_attributes.confidential_compute_type": {"CONFIDENTIAL_COMPUTE_TYPE_NONE", "SEV_SNP"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.kind": {"CLASSIC_PREVIEW"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.runtime_engine": {"NULL", "PHOTON", "STANDARD"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.authentication_method": {"OAUTH", "PAT"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.power_bi_model.storage_mode": {"DIRECT_QUERY", "DUAL", "IMPORT"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.power_bi_task.tables[*].storage_mode": {"DIRECT_QUERY", "DUAL", "IMPORT"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_if": {"ALL_DONE", "ALL_FAILED", "ALL_SUCCESS", "AT_LEAST_ONE_FAILED", "AT_LEAST_ONE_SUCCESS", "NONE_FAILED"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.file.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].health.rules[*].metric": {"RUN_DURATION_SECONDS", "STREAMING_BACKLOG_BYTES", "STREAMING_BACKLOG_FILES", "STREAMING_BACKLOG_RECORDS", "STREAMING_BACKLOG_SECONDS"}, + "resources.job_runs.*.job_settings.tasks[*].health.rules[*].op": {"GREATER_THAN"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.availability": {"ON_DEMAND", "SPOT", "SPOT_WITH_FALLBACK"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.aws_attributes.ebs_volume_type": {"GENERAL_PURPOSE_SSD", "THROUGHPUT_OPTIMIZED_HDD"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.azure_attributes.availability": {"ON_DEMAND_AZURE", "SPOT_AZURE", "SPOT_WITH_FALLBACK_AZURE"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.data_security_mode": {"DATA_SECURITY_MODE_AUTO", "DATA_SECURITY_MODE_DEDICATED", "DATA_SECURITY_MODE_STANDARD", "LEGACY_PASSTHROUGH", "LEGACY_SINGLE_USER", "LEGACY_SINGLE_USER_STANDARD", "LEGACY_TABLE_ACL", "NONE", "SINGLE_USER", "USER_ISOLATION"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.availability": {"ON_DEMAND_GCP", "PREEMPTIBLE_GCP", "PREEMPTIBLE_WITH_FALLBACK_GCP"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.gcp_attributes.confidential_compute_type": {"CONFIDENTIAL_COMPUTE_TYPE_NONE", "SEV_SNP"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.kind": {"CLASSIC_PREVIEW"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.runtime_engine": {"NULL", "PHOTON", "STANDARD"}, + "resources.job_runs.*.job_settings.tasks[*].notebook_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.authentication_method": {"OAUTH", "PAT"}, + "resources.job_runs.*.job_settings.tasks[*].power_bi_task.power_bi_model.storage_mode": {"DIRECT_QUERY", "DUAL", "IMPORT"}, + "resources.job_runs.*.job_settings.tasks[*].power_bi_task.tables[*].storage_mode": {"DIRECT_QUERY", "DUAL", "IMPORT"}, + "resources.job_runs.*.job_settings.tasks[*].run_if": {"ALL_DONE", "ALL_FAILED", "ALL_SUCCESS", "AT_LEAST_ONE_FAILED", "AT_LEAST_ONE_SUCCESS", "NONE_FAILED"}, + "resources.job_runs.*.job_settings.tasks[*].spark_python_task.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.tasks[*].sql_task.file.source": {"GIT", "WORKSPACE"}, + "resources.job_runs.*.job_settings.trigger.model.condition": {"MODEL_ALIAS_SET", "MODEL_CREATED", "MODEL_VERSION_READY"}, + "resources.job_runs.*.job_settings.trigger.pause_status": {"PAUSED", "UNPAUSED"}, + "resources.job_runs.*.job_settings.trigger.periodic.unit": {"DAYS", "HOURS", "WEEKS"}, + "resources.job_runs.*.job_settings.trigger.table_update.condition": {"ALL_UPDATED", "ANY_UPDATED"}, + "resources.job_runs.*.performance_target": {"PERFORMANCE_OPTIMIZED", "STANDARD"}, + "resources.jobs.*.continuous.pause_status": {"PAUSED", "UNPAUSED"}, "resources.jobs.*.continuous.task_retry_mode": {"NEVER", "ON_FAILURE"}, "resources.jobs.*.deployment.kind": {"BUNDLE", "SYSTEM_MANAGED"}, diff --git a/bundle/internal/validation/generated/required_fields.go b/bundle/internal/validation/generated/required_fields.go index 46862290d10..ba367d33532 100644 --- a/bundle/internal/validation/generated/required_fields.go +++ b/bundle/internal/validation/generated/required_fields.go @@ -66,6 +66,114 @@ var RequiredFields = map[string][]string{ "resources.genie_spaces.*.permissions[*]": {"level"}, + "resources.job_runs.*": {"job_id"}, + "resources.job_runs.*.job_settings.deployment": {"kind"}, + "resources.job_runs.*.job_settings.environments[*]": {"environment_key"}, + "resources.job_runs.*.job_settings.git_source": {"git_provider", "git_url"}, + "resources.job_runs.*.job_settings.git_source.job_source": {"import_from_git_branch", "job_config_path"}, + "resources.job_runs.*.job_settings.health.rules[*]": {"metric", "op", "value"}, + "resources.job_runs.*.job_settings.job_clusters[*]": {"job_cluster_key", "new_cluster"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.dbfs": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.s3": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.cluster_log_conf.volumes": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].abfss": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].dbfs": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].file": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].gcs": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].s3": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].volumes": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.init_scripts[*].workspace": {"destination"}, + "resources.job_runs.*.job_settings.job_clusters[*].new_cluster.workload_type": {"clients"}, + "resources.job_runs.*.job_settings.parameters[*]": {"default", "name"}, + "resources.job_runs.*.job_settings.queue": {"enabled"}, + "resources.job_runs.*.job_settings.schedule": {"quartz_cron_expression", "timezone_id"}, + "resources.job_runs.*.job_settings.tasks[*]": {"task_key"}, + "resources.job_runs.*.job_settings.tasks[*].clean_rooms_notebook_task": {"clean_room_name", "notebook_name"}, + "resources.job_runs.*.job_settings.tasks[*].condition_task": {"left", "op", "right"}, + "resources.job_runs.*.job_settings.tasks[*].dbt_task": {"commands"}, + "resources.job_runs.*.job_settings.tasks[*].depends_on[*]": {"task_key"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task": {"inputs", "task"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task": {"task_key"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.clean_rooms_notebook_task": {"clean_room_name", "notebook_name"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.condition_task": {"left", "op", "right"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.dbt_task": {"commands"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.depends_on[*]": {"task_key"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.for_each_task": {"inputs", "task"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task": {"dl_runtime_image"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.gen_ai_compute_task.compute": {"num_gpus"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.health.rules[*]": {"metric", "op", "value"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].cran": {"package"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].maven": {"coordinates"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.libraries[*].pypi": {"package"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.dbfs": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.s3": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.cluster_log_conf.volumes": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].abfss": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].dbfs": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].file": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].gcs": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].s3": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].volumes": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.init_scripts[*].workspace": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.new_cluster.workload_type": {"clients"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.notebook_task": {"notebook_path"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.pipeline_task": {"pipeline_id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.python_wheel_task": {"entry_point", "package_name"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.run_job_task": {"job_id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.spark_python_task": {"python_file"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task": {"warehouse_id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.alert": {"alert_id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.dashboard": {"dashboard_id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.file": {"path"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.sql_task.query": {"query_id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_duration_warning_threshold_exceeded[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_failure[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_start[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_streaming_backlog_exceeded[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].for_each_task.task.webhook_notifications.on_success[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task": {"dl_runtime_image"}, + "resources.job_runs.*.job_settings.tasks[*].gen_ai_compute_task.compute": {"num_gpus"}, + "resources.job_runs.*.job_settings.tasks[*].health.rules[*]": {"metric", "op", "value"}, + "resources.job_runs.*.job_settings.tasks[*].libraries[*].cran": {"package"}, + "resources.job_runs.*.job_settings.tasks[*].libraries[*].maven": {"coordinates"}, + "resources.job_runs.*.job_settings.tasks[*].libraries[*].pypi": {"package"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.dbfs": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.s3": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.cluster_log_conf.volumes": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].abfss": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].dbfs": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].file": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].gcs": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].s3": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].volumes": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.init_scripts[*].workspace": {"destination"}, + "resources.job_runs.*.job_settings.tasks[*].new_cluster.workload_type": {"clients"}, + "resources.job_runs.*.job_settings.tasks[*].notebook_task": {"notebook_path"}, + "resources.job_runs.*.job_settings.tasks[*].pipeline_task": {"pipeline_id"}, + "resources.job_runs.*.job_settings.tasks[*].python_wheel_task": {"entry_point", "package_name"}, + "resources.job_runs.*.job_settings.tasks[*].run_job_task": {"job_id"}, + "resources.job_runs.*.job_settings.tasks[*].spark_python_task": {"python_file"}, + "resources.job_runs.*.job_settings.tasks[*].sql_task": {"warehouse_id"}, + "resources.job_runs.*.job_settings.tasks[*].sql_task.alert": {"alert_id"}, + "resources.job_runs.*.job_settings.tasks[*].sql_task.dashboard": {"dashboard_id"}, + "resources.job_runs.*.job_settings.tasks[*].sql_task.file": {"path"}, + "resources.job_runs.*.job_settings.tasks[*].sql_task.query": {"query_id"}, + "resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_duration_warning_threshold_exceeded[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_failure[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_start[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_streaming_backlog_exceeded[*]": {"id"}, + "resources.job_runs.*.job_settings.tasks[*].webhook_notifications.on_success[*]": {"id"}, + "resources.job_runs.*.job_settings.trigger.file_arrival": {"url"}, + "resources.job_runs.*.job_settings.trigger.model": {"condition"}, + "resources.job_runs.*.job_settings.trigger.periodic": {"interval", "unit"}, + "resources.job_runs.*.job_settings.trigger.table_update": {"table_names"}, + "resources.job_runs.*.job_settings.webhook_notifications.on_duration_warning_threshold_exceeded[*]": {"id"}, + "resources.job_runs.*.job_settings.webhook_notifications.on_failure[*]": {"id"}, + "resources.job_runs.*.job_settings.webhook_notifications.on_start[*]": {"id"}, + "resources.job_runs.*.job_settings.webhook_notifications.on_streaming_backlog_exceeded[*]": {"id"}, + "resources.job_runs.*.job_settings.webhook_notifications.on_success[*]": {"id"}, + "resources.job_runs.*.queue": {"enabled"}, + "resources.jobs.*.deployment": {"kind"}, "resources.jobs.*.environments[*]": {"environment_key"}, "resources.jobs.*.git_source": {"git_provider", "git_url"}, diff --git a/bundle/schema/jsonschema.json b/bundle/schema/jsonschema.json index 1afe4321798..d7ecad4ac68 100644 --- a/bundle/schema/jsonschema.json +++ b/bundle/schema/jsonschema.json @@ -992,6 +992,113 @@ } ] }, + "resources.JobRun": { + "oneOf": [ + { + "type": "object", + "properties": { + "dbt_commands": { + "description": "[Private Preview] An array of commands to execute for jobs with the dbt task, for example `\"dbt_commands\": [\"dbt deps\", \"dbt seed\", \"dbt deps\", \"dbt seed\", \"dbt run\"]`\n\n⚠ **Deprecation note** Use [job parameters](https://docs.databricks.com/jobs/job-parameters.html#job-parameter-pushdown) to pass information down to tasks.", + "$ref": "#/$defs/slice/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + }, + "idempotency_token": { + "description": "An optional token to guarantee the idempotency of job run requests. If a run with the provided token already exists,\nthe request does not create a new run but returns the ID of the existing run instead. If a run with the provided token is deleted,\nan error is returned.\n\nIf you specify the idempotency token, upon failure you can retry until the request succeeds. Databricks guarantees that exactly one run\nis launched with that idempotency token.\n\nThis token must have at most 64 characters.\n\nFor more information, see [How to ensure idempotency for jobs](https://kb.databricks.com/jobs/jobs-idempotency.html).", + "$ref": "#/$defs/string" + }, + "jar_params": { + "description": "[Private Preview] A list of parameters for jobs with Spark JAR tasks, for example `\"jar_params\": [\"john doe\", \"35\"]`.\nThe parameters are used to invoke the main function of the main class specified in the Spark JAR task.\nIf not specified upon `run-now`, it defaults to an empty list.\njar_params cannot be specified in conjunction with notebook_params.\nThe JSON representation of this field (for example `{\"jar_params\":[\"john doe\",\"35\"]}`) cannot exceed 10,000 bytes.\n\n⚠ **Deprecation note** Use [job parameters](https://docs.databricks.com/jobs/job-parameters.html#job-parameter-pushdown) to pass information down to tasks.", + "$ref": "#/$defs/slice/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + }, + "job_id": { + "description": "The ID of the job to be executed", + "$ref": "#/$defs/int64" + }, + "job_parameters": { + "description": "Job-level parameters used in the run. for example `\"param\": \"overriding_val\"`", + "$ref": "#/$defs/map/string" + }, + "job_settings": { + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobSettings" + }, + "lifecycle": { + "$ref": "#/$defs/github.com/databricks/cli/bundle/config/resources.Lifecycle" + }, + "notebook_params": { + "description": "[Private Preview] A map from keys to values for jobs with notebook task, for example `\"notebook_params\": {\"name\": \"john doe\", \"age\": \"35\"}`.\nThe map is passed to the notebook and is accessible through the [dbutils.widgets.get](https://docs.databricks.com/dev-tools/databricks-utils.html) function.\n\nIf not specified upon `run-now`, the triggered run uses the job’s base parameters.\n\nnotebook_params cannot be specified in conjunction with jar_params.\n\n⚠ **Deprecation note** Use [job parameters](https://docs.databricks.com/jobs/job-parameters.html#job-parameter-pushdown) to pass information down to tasks.\n\nThe JSON representation of this field (for example `{\"notebook_params\":{\"name\":\"john doe\",\"age\":\"35\"}}`) cannot exceed 10,000 bytes.", + "$ref": "#/$defs/map/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + }, + "only": { + "description": "A list of task keys to run inside of the job. If this field is not provided, all tasks in the job will be run.", + "$ref": "#/$defs/slice/string" + }, + "performance_target": { + "description": "The performance mode on a serverless job. The performance target determines the level of compute performance or cost-efficiency for the run. This field overrides the performance target defined on the job level.\n\n* `STANDARD`: Enables cost-efficient execution of serverless workloads.\n* `PERFORMANCE_OPTIMIZED`: Prioritizes fast startup and execution times through rapid scaling and optimized cluster performance.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.PerformanceTarget" + }, + "pipeline_params": { + "description": "Controls whether the pipeline should perform a full refresh", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.PipelineParams" + }, + "python_named_params": { + "description": "[Private Preview]", + "$ref": "#/$defs/map/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + }, + "python_params": { + "description": "[Private Preview] A list of parameters for jobs with Python tasks, for example `\"python_params\": [\"john doe\", \"35\"]`.\nThe parameters are passed to Python file as command-line parameters. If specified upon `run-now`, it would overwrite\nthe parameters specified in job setting. The JSON representation of this field (for example `{\"python_params\":[\"john doe\",\"35\"]}`)\ncannot exceed 10,000 bytes.\n\n⚠ **Deprecation note** Use [job parameters](https://docs.databricks.com/jobs/job-parameters.html#job-parameter-pushdown) to pass information down to tasks.\n\nImportant\n\nThese parameters accept only Latin characters (ASCII character set). Using non-ASCII characters returns an error.\nExamples of invalid, non-ASCII characters are Chinese, Japanese kanjis, and emojis.", + "$ref": "#/$defs/slice/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + }, + "queue": { + "description": "The queue settings of the run.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.QueueSettings" + }, + "spark_submit_params": { + "description": "[Private Preview] A list of parameters for jobs with spark submit task, for example `\"spark_submit_params\": [\"--class\", \"org.apache.spark.examples.SparkPi\"]`.\nThe parameters are passed to spark-submit script as command-line parameters. If specified upon `run-now`, it would overwrite the\nparameters specified in job setting. The JSON representation of this field (for example `{\"python_params\":[\"john doe\",\"35\"]}`)\ncannot exceed 10,000 bytes.\n\n⚠ **Deprecation note** Use [job parameters](https://docs.databricks.com/jobs/job-parameters.html#job-parameter-pushdown) to pass information down to tasks.\n\nImportant\n\nThese parameters accept only Latin characters (ASCII character set). Using non-ASCII characters returns an error.\nExamples of invalid, non-ASCII characters are Chinese, Japanese kanjis, and emojis.", + "$ref": "#/$defs/slice/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + }, + "sql_params": { + "description": "[Private Preview] A map from keys to values for jobs with SQL task, for example `\"sql_params\": {\"name\": \"john doe\", \"age\": \"35\"}`. The SQL alert task does not support custom parameters.\n\n⚠ **Deprecation note** Use [job parameters](https://docs.databricks.com/jobs/job-parameters.html#job-parameter-pushdown) to pass information down to tasks.", + "$ref": "#/$defs/map/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "deprecationMessage": "This field is deprecated", + "doNotSuggest": true, + "deprecated": true + } + }, + "additionalProperties": false, + "required": [ + "job_id" + ] + }, + { + "type": "string", + "pattern": "\\$\\{(var(\\.\\p{L}+([-_]*[\\p{L}\\p{N}]+)*(\\[[0-9]+\\])*)+)\\}" + } + ] + }, "resources.Lifecycle": { "oneOf": [ { @@ -2880,6 +2987,9 @@ "genie_spaces": { "$ref": "#/$defs/map/github.com/databricks/cli/bundle/config/resources.GenieSpace" }, + "job_runs": { + "$ref": "#/$defs/map/github.com/databricks/cli/bundle/config/resources.JobRun" + }, "jobs": { "description": "The job definitions for the bundle, where each key is the name of the job.", "$ref": "#/$defs/map/github.com/databricks/cli/bundle/config/resources.Job", @@ -7082,6 +7192,124 @@ } ] }, + "jobs.JobSettings": { + "oneOf": [ + { + "type": "object", + "properties": { + "budget_policy_id": { + "description": "[Public Preview] The id of the user specified budget policy to use for this job.\nIf not specified, a default budget policy may be applied when creating or modifying the job.\nSee `effective_budget_policy_id` for the budget policy used by this workload.", + "$ref": "#/$defs/string" + }, + "continuous": { + "description": "An optional continuous property for this job. The continuous property will ensure that there is always one run executing. Only one of `schedule` and `continuous` can be used.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.Continuous" + }, + "deployment": { + "description": "Deployment information for jobs managed by external sources.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobDeployment" + }, + "description": { + "description": "An optional description for the job. The maximum length is 27700 characters in UTF-8 encoding.", + "$ref": "#/$defs/string" + }, + "edit_mode": { + "description": "Edit mode of the job.\n\n* `UI_LOCKED`: The job is in a locked UI state and cannot be modified.\n* `EDITABLE`: The job is in an editable state and can be modified.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobEditMode" + }, + "email_notifications": { + "description": "An optional set of email addresses that is notified when runs of this job begin or complete as well as when this job is deleted.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobEmailNotifications" + }, + "environments": { + "description": "A list of task execution environment specifications that can be referenced by serverless tasks of this job.\nFor serverless notebook tasks, if the environment_key is not specified, the notebook environment will be used if present. If a jobs environment is specified, it will override the notebook environment.\nFor other serverless tasks, the task environment is required to be specified using environment_key in the task settings.", + "$ref": "#/$defs/slice/github.com/databricks/databricks-sdk-go/service/jobs.JobEnvironment" + }, + "format": { + "description": "Used to tell what is the format of the job. This field is ignored in Create/Update/Reset calls. When using the Jobs API 2.1 this value is always set to `\"MULTI_TASK\"`.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.Format", + "deprecationMessage": "This field is deprecated", + "deprecated": true + }, + "git_source": { + "description": "An optional specification for a remote Git repository containing the source code used by tasks. Version-controlled source code is supported by notebook, dbt, Python script, and SQL File tasks.\n\nIf `git_source` is set, these tasks retrieve the file from the remote repository by default. However, this behavior can be overridden by setting `source` to `WORKSPACE` on the task.\n\nNote: dbt and SQL File tasks support only version-controlled sources. If dbt or SQL File tasks are used, `git_source` must be defined on the job.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.GitSource" + }, + "health": { + "description": "An optional set of health rules that can be defined for this job.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobsHealthRules" + }, + "job_clusters": { + "description": "A list of job cluster specifications that can be shared and reused by tasks of this job. Libraries cannot be declared in a shared job cluster. You must declare dependent libraries in task settings.", + "$ref": "#/$defs/slice/github.com/databricks/databricks-sdk-go/service/jobs.JobCluster" + }, + "max_concurrent_runs": { + "description": "An optional maximum allowed number of concurrent runs of the job.\nSet this value if you want to be able to execute multiple runs of the same job concurrently.\nThis is useful for example if you trigger your job on a frequent schedule and want to allow consecutive runs to overlap with each other, or if you want to trigger multiple runs which differ by their input parameters.\nThis setting affects only new runs. For example, suppose the job’s concurrency is 4 and there are 4 concurrent active runs. Then setting the concurrency to 3 won’t kill any of the active runs.\nHowever, from then on, new runs are skipped unless there are fewer than 3 active runs.\nThis value cannot exceed 1000. Setting this value to `0` causes all new runs to be skipped.", + "$ref": "#/$defs/int" + }, + "name": { + "description": "An optional name for the job. The maximum length is 4096 bytes in UTF-8 encoding.", + "$ref": "#/$defs/string" + }, + "notification_settings": { + "description": "Optional notification settings that are used when sending notifications to each of the `email_notifications` and `webhook_notifications` for this job.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobNotificationSettings" + }, + "parameters": { + "description": "Job-level parameter definitions", + "$ref": "#/$defs/slice/github.com/databricks/databricks-sdk-go/service/jobs.JobParameterDefinition" + }, + "performance_target": { + "description": "The performance mode on a serverless job. This field determines the level of compute performance or cost-efficiency for the run.\nThe performance target does not apply to tasks that run on Serverless GPU compute.\n\n* `STANDARD`: Enables cost-efficient execution of serverless workloads.\n* `PERFORMANCE_OPTIMIZED`: Prioritizes fast startup and execution times through rapid scaling and optimized cluster performance.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.PerformanceTarget" + }, + "queue": { + "description": "The queue settings of the job.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.QueueSettings" + }, + "run_as": { + "description": "The user or service principal that the job runs as, if specified in the request.\nThis field indicates the explicit configuration of `run_as` for the job.\nTo find the value in all cases, explicit or implicit, use `run_as_user_name`.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.JobRunAs" + }, + "schedule": { + "description": "An optional periodic schedule for this job. The default behavior is that the job only runs when triggered by clicking “Run Now” in the Jobs UI or sending an API request to `runNow`.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.CronSchedule" + }, + "tags": { + "description": "A map of tags associated with the job. These are forwarded to the cluster as cluster tags for jobs clusters, and are subject to the same limitations as cluster tags. A maximum of 25 tags can be added to the job.", + "$ref": "#/$defs/map/string" + }, + "tasks": { + "description": "A list of task specifications to be executed by this job.\nIt supports up to 1000 elements in write endpoints (:method:jobs/create, :method:jobs/reset, :method:jobs/update, :method:jobs/submit).\nRead endpoints return only 100 tasks. If more than 100 tasks are available, you can paginate through them using :method:jobs/get. Use the `next_page_token` field at the object root to determine if more results are available.", + "$ref": "#/$defs/slice/github.com/databricks/databricks-sdk-go/service/jobs.Task" + }, + "timeout_seconds": { + "description": "An optional timeout applied to each run of this job. A value of `0` means no timeout.", + "$ref": "#/$defs/int" + }, + "trigger": { + "description": "A configuration to trigger a run when certain conditions are met. The default behavior is that the job runs only when triggered by clicking “Run Now” in the Jobs UI or sending an API request to `runNow`.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.TriggerSettings" + }, + "usage_policy_id": { + "description": "[Private Preview] The id of the user specified usage policy to use for this job.\nIf not specified, a default usage policy may be applied when creating or modifying the job.\nSee `effective_usage_policy_id` for the usage policy used by this workload.", + "$ref": "#/$defs/string", + "x-databricks-launch-stage": "PRIVATE_PREVIEW", + "doNotSuggest": true + }, + "webhook_notifications": { + "description": "A collection of system notification IDs to notify when runs of this job begin or complete.", + "$ref": "#/$defs/github.com/databricks/databricks-sdk-go/service/jobs.WebhookNotifications" + } + }, + "additionalProperties": false + }, + { + "type": "string", + "pattern": "\\$\\{(var(\\.\\p{L}+([-_]*[\\p{L}\\p{N}]+)*(\\[[0-9]+\\])*)+)\\}" + } + ] + }, "jobs.JobSource": { "oneOf": [ { @@ -13256,6 +13484,20 @@ } ] }, + "resources.JobRun": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/github.com/databricks/cli/bundle/config/resources.JobRun" + } + }, + { + "type": "string", + "pattern": "\\$\\{(var(\\.\\p{L}+([-_]*[\\p{L}\\p{N}]+)*(\\[[0-9]+\\])*)+)\\}" + } + ] + }, "resources.MlflowExperiment": { "oneOf": [ { diff --git a/bundle/statemgmt/state_load_test.go b/bundle/statemgmt/state_load_test.go index 86d7f76f806..313348f30d2 100644 --- a/bundle/statemgmt/state_load_test.go +++ b/bundle/statemgmt/state_load_test.go @@ -27,6 +27,7 @@ func TestStateToBundleEmptyLocalResources(t *testing.T) { state := ExportedResourcesMap{ "resources.jobs.test_job": {ID: "1"}, + "resources.job_runs.test_job_run": {ID: "1"}, "resources.pipelines.test_pipeline": {ID: "1"}, "resources.models.test_mlflow_model": {ID: "1"}, "resources.experiments.test_mlflow_experiment": {ID: "1"}, @@ -63,6 +64,9 @@ func TestStateToBundleEmptyLocalResources(t *testing.T) { assert.Equal(t, "1", config.Resources.Jobs["test_job"].ID) assert.Equal(t, resources.ModifiedStatusDeleted, config.Resources.Jobs["test_job"].ModifiedStatus) + assert.Equal(t, "1", config.Resources.JobRuns["test_job_run"].ID) + assert.Equal(t, resources.ModifiedStatusDeleted, config.Resources.JobRuns["test_job_run"].ModifiedStatus) + assert.Equal(t, "1", config.Resources.Pipelines["test_pipeline"].ID) assert.Equal(t, resources.ModifiedStatusDeleted, config.Resources.Pipelines["test_pipeline"].ModifiedStatus) @@ -158,6 +162,13 @@ func TestStateToBundleEmptyRemoteResources(t *testing.T) { }, }, }, + JobRuns: map[string]*resources.JobRun{ + "test_job_run": { + RunNow: jobs.RunNow{ + JobId: 1234, + }, + }, + }, Pipelines: map[string]*resources.Pipeline{ "test_pipeline": { CreatePipeline: pipelines.CreatePipeline{ @@ -376,6 +387,9 @@ func TestStateToBundleEmptyRemoteResources(t *testing.T) { assert.Empty(t, config.Resources.Jobs["test_job"].ID) assert.Equal(t, resources.ModifiedStatusCreated, config.Resources.Jobs["test_job"].ModifiedStatus) + assert.Empty(t, config.Resources.JobRuns["test_job_run"].ID) + assert.Equal(t, resources.ModifiedStatusCreated, config.Resources.JobRuns["test_job_run"].ModifiedStatus) + assert.Empty(t, config.Resources.Pipelines["test_pipeline"].ID) assert.Equal(t, resources.ModifiedStatusCreated, config.Resources.Pipelines["test_pipeline"].ModifiedStatus) @@ -481,6 +495,18 @@ func TestStateToBundleModifiedResources(t *testing.T) { }, }, }, + JobRuns: map[string]*resources.JobRun{ + "test_job_run": { + RunNow: jobs.RunNow{ + JobId: 1234, + }, + }, + "test_job_run_new": { + RunNow: jobs.RunNow{ + JobId: 5678, + }, + }, + }, Pipelines: map[string]*resources.Pipeline{ "test_pipeline": { CreatePipeline: pipelines.CreatePipeline{ @@ -835,6 +861,8 @@ func TestStateToBundleModifiedResources(t *testing.T) { state := ExportedResourcesMap{ "resources.jobs.test_job": {ID: "1"}, "resources.jobs.test_job_old": {ID: "2"}, + "resources.job_runs.test_job_run": {ID: "1"}, + "resources.job_runs.test_job_run_old": {ID: "2"}, "resources.pipelines.test_pipeline": {ID: "1"}, "resources.pipelines.test_pipeline_old": {ID: "2"}, "resources.models.test_mlflow_model": {ID: "1"}, @@ -896,6 +924,13 @@ func TestStateToBundleModifiedResources(t *testing.T) { assert.Empty(t, config.Resources.Jobs["test_job_new"].ID) assert.Equal(t, resources.ModifiedStatusCreated, config.Resources.Jobs["test_job_new"].ModifiedStatus) + assert.Equal(t, "1", config.Resources.JobRuns["test_job_run"].ID) + assert.Empty(t, config.Resources.JobRuns["test_job_run"].ModifiedStatus) + assert.Equal(t, "2", config.Resources.JobRuns["test_job_run_old"].ID) + assert.Equal(t, resources.ModifiedStatusDeleted, config.Resources.JobRuns["test_job_run_old"].ModifiedStatus) + assert.Empty(t, config.Resources.JobRuns["test_job_run_new"].ID) + assert.Equal(t, resources.ModifiedStatusCreated, config.Resources.JobRuns["test_job_run_new"].ModifiedStatus) + assert.Equal(t, "1", config.Resources.Pipelines["test_pipeline"].ID) assert.Empty(t, config.Resources.Pipelines["test_pipeline"].ModifiedStatus) assert.Equal(t, "2", config.Resources.Pipelines["test_pipeline_old"].ID) diff --git a/libs/structs/structwalk/walktype_test.go b/libs/structs/structwalk/walktype_test.go index 78ccc6c3f61..00f803be24c 100644 --- a/libs/structs/structwalk/walktype_test.go +++ b/libs/structs/structwalk/walktype_test.go @@ -136,7 +136,7 @@ func TestTypeJobSettings(t *testing.T) { func TestTypeRoot(t *testing.T) { testStruct(t, reflect.TypeFor[config.Root](), - 5000, 6000, // 5813 after genie_space resource added + 5000, 8000, // 7767 after job_runs resource added (snapshots a full job_settings) map[string]any{ "bundle.target": "", `variables.*.lookup.dashboard`: "", diff --git a/libs/testserver/jobs.go b/libs/testserver/jobs.go index e9468f7f681..e1793880742 100644 --- a/libs/testserver/jobs.go +++ b/libs/testserver/jobs.go @@ -324,18 +324,72 @@ func (s *FakeWorkspace) JobsRunNow(req Request) Response { } s.JobRuns[runId] = jobs.Run{ - RunId: runId, - JobId: request.JobId, - State: &jobs.RunState{LifeCycleState: jobs.RunLifeCycleStateRunning}, - RunPageUrl: fmt.Sprintf("%s/?o=900800700600#job/%d/run/%d", s.url, request.JobId, runId), - RunType: jobs.RunTypeJobRun, - RunName: runName, - Tasks: tasks, + RunId: runId, + JobId: request.JobId, + State: &jobs.RunState{LifeCycleState: jobs.RunLifeCycleStateRunning}, + RunPageUrl: fmt.Sprintf("%s/?o=900800700600#job/%d/run/%d", s.url, request.JobId, runId), + RunType: jobs.RunTypeJobRun, + RunName: runName, + Tasks: tasks, + JobParameters: runJobParameters(job.Settings, request.JobParameters), + OverridingParameters: runOverridingParameters(request), } return Response{Body: jobs.RunNowResponse{RunId: runId}} } +// runJobParameters mirrors how GetRun resolves job-level parameters: it returns +// every parameter the job defines with its value, applying the run's overrides +// on top of the job's defaults. This is the cloud behavior that lets a run +// surface a job parameter it never explicitly overrode. Sorted by name for +// deterministic output. +func runJobParameters(settings *jobs.JobSettings, overrides map[string]string) []jobs.JobParameter { + resolved := map[string]jobs.JobParameter{} + if settings != nil { + for _, p := range settings.Parameters { + resolved[p.Name] = jobs.JobParameter{Name: p.Name, Default: p.Default, Value: p.Default} + } + } + for name, value := range overrides { + p := resolved[name] + p.Name = name + p.Value = value + resolved[name] = p + } + if len(resolved) == 0 { + return nil + } + result := make([]jobs.JobParameter, 0, len(resolved)) + for _, p := range resolved { + result = append(result, p) + } + slices.SortFunc(result, func(a, b jobs.JobParameter) int { + return cmp.Compare(a.Name, b.Name) + }) + return result +} + +// runOverridingParameters mirrors how GetRun echoes the run's overriding +// parameters. Returns nil when the request set none. +func runOverridingParameters(request jobs.RunNow) *jobs.RunParameters { + p := jobs.RunParameters{ + DbtCommands: request.DbtCommands, + JarParams: request.JarParams, + NotebookParams: request.NotebookParams, + PipelineParams: request.PipelineParams, + PythonNamedParams: request.PythonNamedParams, + PythonParams: request.PythonParams, + SparkSubmitParams: request.SparkSubmitParams, + SqlParams: request.SqlParams, + } + if len(p.DbtCommands) == 0 && len(p.JarParams) == 0 && len(p.NotebookParams) == 0 && + p.PipelineParams == nil && len(p.PythonNamedParams) == 0 && len(p.PythonParams) == 0 && + len(p.SparkSubmitParams) == 0 && len(p.SqlParams) == 0 { + return nil + } + return &p +} + // executePythonWheelTask runs a python wheel task locally using uv. // For tasks using existing_cluster_id, the venv is cached per cluster to match // cloud behavior where libraries are cached on running clusters.