diff --git a/js_modules/dagster-ui/packages/ui-core/src/graphql/possibleTypes.generated.json b/js_modules/dagster-ui/packages/ui-core/src/graphql/possibleTypes.generated.json index 43f050999a0b7..fa397ad2237ae 100644 --- a/js_modules/dagster-ui/packages/ui-core/src/graphql/possibleTypes.generated.json +++ b/js_modules/dagster-ui/packages/ui-core/src/graphql/possibleTypes.generated.json @@ -1 +1 @@ -{"DisplayableEvent":["EngineEvent","ExecutionStepOutputEvent","ExpectationResult","FailureMetadata","HandledOutputEvent","LoadedInputEvent","ObjectStoreOperationResult","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","MaterializationEvent","ObservationEvent","TypeCheck"],"MarkerEvent":["EngineEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","StepWorkerStartedEvent","StepWorkerStartingEvent"],"ErrorEvent":["EngineEvent","ExecutionStepFailureEvent","ExecutionStepUpForRetryEvent","HookErroredEvent","RunFailureEvent","ResourceInitFailureEvent"],"MessageEvent":["EngineEvent","ExecutionStepFailureEvent","ExecutionStepInputEvent","ExecutionStepOutputEvent","ExecutionStepRestartEvent","ExecutionStepSkippedEvent","ExecutionStepStartEvent","ExecutionStepSuccessEvent","ExecutionStepUpForRetryEvent","HandledOutputEvent","HookCompletedEvent","HookErroredEvent","HookSkippedEvent","LoadedInputEvent","LogMessageEvent","ObjectStoreOperationEvent","RunCanceledEvent","RunCancelingEvent","RunDequeuedEvent","RunEnqueuedEvent","RunFailureEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","RunStartEvent","RunStartingEvent","RunSuccessEvent","StepExpectationResultEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","MaterializationEvent","ObservationEvent","AssetMaterializationPlannedEvent","LogsCapturedEvent","AlertStartEvent","AlertSuccessEvent","AlertFailureEvent","AssetCheckEvaluationPlannedEvent","AssetCheckEvaluationEvent"],"RunEvent":["RunCanceledEvent","RunCancelingEvent","RunDequeuedEvent","RunEnqueuedEvent","RunFailureEvent","RunStartEvent","RunStartingEvent","RunSuccessEvent","AssetMaterializationPlannedEvent","AlertStartEvent","AlertSuccessEvent","AlertFailureEvent"],"PipelineRunStepStats":["RunStepStats"],"StepEvent":["EngineEvent","ExecutionStepFailureEvent","ExecutionStepInputEvent","ExecutionStepOutputEvent","ExecutionStepRestartEvent","ExecutionStepSkippedEvent","ExecutionStepStartEvent","ExecutionStepSuccessEvent","ExecutionStepUpForRetryEvent","HandledOutputEvent","HookCompletedEvent","HookErroredEvent","HookSkippedEvent","LoadedInputEvent","ObjectStoreOperationEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","StepExpectationResultEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","MaterializationEvent","ObservationEvent","AssetCheckEvaluationPlannedEvent","AssetCheckEvaluationEvent"],"AssetOwner":["UserAssetOwner","TeamAssetOwner"],"AssetPartitionStatuses":["DefaultPartitionStatuses","MultiPartitionStatuses","TimePartitionStatuses"],"PartitionStatus1D":["TimePartitionStatuses","DefaultPartitionStatuses"],"AssetChecksOrError":["AssetChecks","AssetCheckNeedsMigrationError","AssetCheckNeedsUserCodeUpgrade","AssetCheckNeedsAgentUpgradeError"],"Instigator":["Schedule","Sensor"],"EvaluationStackEntry":["EvaluationStackListItemEntry","EvaluationStackPathEntry","EvaluationStackMapKeyEntry","EvaluationStackMapValueEntry"],"IPipelineSnapshot":["Pipeline","PipelineSnapshot","Job"],"PipelineConfigValidationError":["FieldNotDefinedConfigError","FieldsNotDefinedConfigError","MissingFieldConfigError","MissingFieldsConfigError","RuntimeMismatchConfigError","SelectorTypeConfigError"],"PipelineConfigValidationInvalid":["RunConfigValidationInvalid"],"PipelineConfigValidationResult":["InvalidSubsetError","PipelineConfigValidationValid","RunConfigValidationInvalid","PipelineNotFoundError","PythonError"],"PipelineReference":["PipelineSnapshot","UnknownPipeline"],"PipelineRun":["Run"],"DagsterRunEvent":["ExecutionStepFailureEvent","ExecutionStepInputEvent","ExecutionStepOutputEvent","ExecutionStepSkippedEvent","ExecutionStepStartEvent","ExecutionStepSuccessEvent","ExecutionStepUpForRetryEvent","ExecutionStepRestartEvent","LogMessageEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","RunFailureEvent","RunStartEvent","RunEnqueuedEvent","RunDequeuedEvent","RunStartingEvent","RunCancelingEvent","RunCanceledEvent","RunSuccessEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","HandledOutputEvent","LoadedInputEvent","LogsCapturedEvent","ObjectStoreOperationEvent","StepExpectationResultEvent","MaterializationEvent","ObservationEvent","EngineEvent","HookCompletedEvent","HookSkippedEvent","HookErroredEvent","AlertStartEvent","AlertSuccessEvent","AlertFailureEvent","AssetMaterializationPlannedEvent","AssetCheckEvaluationPlannedEvent","AssetCheckEvaluationEvent"],"PipelineRunLogsSubscriptionPayload":["PipelineRunLogsSubscriptionSuccess","PipelineRunLogsSubscriptionFailure"],"RunOrError":["Run","RunNotFoundError","PythonError"],"PipelineRunStatsSnapshot":["RunStatsSnapshot"],"RunStatsSnapshotOrError":["RunStatsSnapshot","PythonError"],"PipelineSnapshotOrError":["PipelineNotFoundError","PipelineSnapshot","PipelineSnapshotNotFoundError","PythonError"],"AssetOrError":["Asset","AssetNotFoundError"],"AssetsOrError":["AssetConnection","PythonError"],"DeletePipelineRunResult":["DeletePipelineRunSuccess","UnauthorizedError","PythonError","RunNotFoundError"],"ExecutionPlanOrError":["ExecutionPlan","RunConfigValidationInvalid","PipelineNotFoundError","InvalidSubsetError","PythonError"],"PipelineOrError":["Pipeline","PipelineNotFoundError","InvalidSubsetError","PythonError"],"ReloadRepositoryLocationMutationResult":["WorkspaceLocationEntry","ReloadNotSupported","RepositoryLocationNotFound","UnauthorizedError","PythonError"],"RepositoryLocationOrLoadError":["RepositoryLocation","PythonError"],"ReloadWorkspaceMutationResult":["Workspace","UnauthorizedError","PythonError"],"ShutdownRepositoryLocationMutationResult":["ShutdownRepositoryLocationSuccess","RepositoryLocationNotFound","UnauthorizedError","PythonError"],"TerminatePipelineExecutionFailure":["TerminateRunFailure"],"TerminatePipelineExecutionSuccess":["TerminateRunSuccess"],"TerminateRunResult":["TerminateRunSuccess","TerminateRunFailure","RunNotFoundError","UnauthorizedError","PythonError"],"ScheduleMutationResult":["PythonError","UnauthorizedError","ScheduleStateResult"],"ScheduleOrError":["Schedule","ScheduleNotFoundError","PythonError"],"SchedulerOrError":["Scheduler","SchedulerNotDefinedError","PythonError"],"SchedulesOrError":["Schedules","RepositoryNotFoundError","PythonError"],"ScheduleTickSpecificData":["ScheduleTickSuccessData","ScheduleTickFailureData"],"LaunchBackfillResult":["LaunchBackfillSuccess","PartitionSetNotFoundError","InvalidStepError","InvalidOutputError","RunConfigValidationInvalid","PipelineNotFoundError","RunConflict","UnauthorizedError","PythonError","InvalidSubsetError","PresetNotFoundError","ConflictingExecutionParamsError","NoModeProvidedError"],"ConfigTypeOrError":["EnumConfigType","CompositeConfigType","RegularConfigType","PipelineNotFoundError","ConfigTypeNotFoundError","PythonError"],"ConfigType":["ArrayConfigType","CompositeConfigType","EnumConfigType","NullableConfigType","RegularConfigType","ScalarUnionConfigType","MapConfigType"],"WrappingConfigType":["ArrayConfigType","NullableConfigType"],"DagsterType":["ListDagsterType","NullableDagsterType","RegularDagsterType"],"DagsterTypeOrError":["RegularDagsterType","PipelineNotFoundError","DagsterTypeNotFoundError","PythonError"],"WrappingDagsterType":["ListDagsterType","NullableDagsterType"],"Error":["AssetCheckNeedsMigrationError","AssetCheckNeedsUserCodeUpgrade","AssetCheckNeedsAgentUpgradeError","AssetNotFoundError","ConflictingExecutionParamsError","ConfigTypeNotFoundError","DagsterTypeNotFoundError","InvalidPipelineRunsFilterError","InvalidSubsetError","ModeNotFoundError","NoModeProvidedError","PartitionSetNotFoundError","PipelineNotFoundError","RunConflict","PipelineSnapshotNotFoundError","PresetNotFoundError","PythonError","ErrorChainLink","UnauthorizedError","ReloadNotSupported","RepositoryLocationNotFound","RepositoryNotFoundError","ResourceNotFoundError","RunGroupNotFoundError","RunNotFoundError","ScheduleNotFoundError","SchedulerNotDefinedError","SensorNotFoundError","UnsupportedOperationError","DuplicateDynamicPartitionError","InstigationStateNotFoundError","SolidStepStatusUnavailableError","GraphNotFoundError","BackfillNotFoundError","PartitionSubsetDeserializationError","AutoMaterializeAssetEvaluationNeedsMigrationError"],"PipelineRunConflict":["RunConflict"],"PipelineRunNotFoundError":["RunNotFoundError"],"RepositoriesOrError":["RepositoryConnection","RepositoryNotFoundError","PythonError"],"RepositoryOrError":["PythonError","Repository","RepositoryNotFoundError"],"WorkspaceLocationEntryOrError":["WorkspaceLocationEntry","PythonError"],"InstigationTypeSpecificData":["SensorData","ScheduleData"],"InstigationStateOrError":["InstigationState","InstigationStateNotFoundError","PythonError"],"InstigationStatesOrError":["InstigationStates","PythonError"],"MetadataEntry":["TableColumnLineageMetadataEntry","TableSchemaMetadataEntry","TableMetadataEntry","FloatMetadataEntry","IntMetadataEntry","JsonMetadataEntry","BoolMetadataEntry","MarkdownMetadataEntry","PathMetadataEntry","NotebookMetadataEntry","PythonArtifactMetadataEntry","TextMetadataEntry","UrlMetadataEntry","PipelineRunMetadataEntry","AssetMetadataEntry","JobMetadataEntry","CodeReferencesMetadataEntry","NullMetadataEntry","TimestampMetadataEntry"],"SourceLocation":["LocalFileCodeReference","UrlCodeReference"],"PartitionRunConfigOrError":["PartitionRunConfig","PythonError"],"AssetBackfillStatus":["AssetPartitionsStatusCounts","UnpartitionedAssetStatus"],"PartitionSetOrError":["PartitionSet","PartitionSetNotFoundError","PythonError"],"PartitionSetsOrError":["PartitionSets","PipelineNotFoundError","PythonError"],"PartitionsOrError":["Partitions","PythonError"],"PartitionStatusesOrError":["PartitionStatuses","PythonError"],"PartitionTagsOrError":["PartitionTags","PythonError"],"RunConfigSchemaOrError":["RunConfigSchema","PipelineNotFoundError","InvalidSubsetError","ModeNotFoundError","PythonError"],"LaunchRunResult":["LaunchRunSuccess","InvalidStepError","InvalidOutputError","RunConfigValidationInvalid","PipelineNotFoundError","RunConflict","UnauthorizedError","PythonError","InvalidSubsetError","PresetNotFoundError","ConflictingExecutionParamsError","NoModeProvidedError"],"LaunchRunReexecutionResult":["LaunchRunSuccess","InvalidStepError","InvalidOutputError","RunConfigValidationInvalid","PipelineNotFoundError","RunConflict","UnauthorizedError","PythonError","InvalidSubsetError","PresetNotFoundError","ConflictingExecutionParamsError","NoModeProvidedError"],"LaunchPipelineRunSuccess":["LaunchRunSuccess"],"RunsOrError":["Runs","InvalidPipelineRunsFilterError","PythonError"],"PipelineRuns":["Runs"],"RunGroupOrError":["RunGroup","RunGroupNotFoundError","PythonError"],"SensorOrError":["Sensor","SensorNotFoundError","UnauthorizedError","PythonError"],"SensorsOrError":["Sensors","RepositoryNotFoundError","PythonError"],"StopSensorMutationResultOrError":["StopSensorMutationResult","UnauthorizedError","PythonError"],"ISolidDefinition":["CompositeSolidDefinition","SolidDefinition"],"SolidContainer":["Pipeline","PipelineSnapshot","Job","CompositeSolidDefinition","Graph"],"SolidStepStatsOrError":["SolidStepStatsConnection","SolidStepStatusUnavailableError"],"WorkspaceOrError":["Workspace","PythonError"],"WorkspaceLocationStatusEntriesOrError":["WorkspaceLocationStatusEntries","PythonError"],"GraphOrError":["Graph","GraphNotFoundError","PythonError"],"ResourceDetailsOrError":["ResourceDetails","ResourceNotFoundError","PythonError"],"ResourcesOrError":["ResourceDetailsList","RepositoryNotFoundError","PythonError"],"EnvVarWithConsumersOrError":["EnvVarWithConsumersList","PythonError"],"RunTagKeysOrError":["PythonError","RunTagKeys"],"RunTagsOrError":["PythonError","RunTags"],"RunIdsOrError":["RunIds","InvalidPipelineRunsFilterError","PythonError"],"AssetNodeOrError":["AssetNode","AssetNotFoundError"],"PartitionBackfillOrError":["PartitionBackfill","BackfillNotFoundError","PythonError"],"PartitionBackfillsOrError":["PartitionBackfills","PythonError"],"EventConnectionOrError":["EventConnection","RunNotFoundError","PythonError"],"AutoMaterializeAssetEvaluationRecordsOrError":["AutoMaterializeAssetEvaluationRecords","AutoMaterializeAssetEvaluationNeedsMigrationError"],"PartitionKeysOrError":["PartitionKeys","PartitionSubsetDeserializationError"],"AutoMaterializeRuleEvaluationData":["TextRuleEvaluationData","ParentMaterializedRuleEvaluationData","WaitingOnKeysRuleEvaluationData"],"AssetConditionEvaluationNode":["UnpartitionedAssetConditionEvaluationNode","PartitionedAssetConditionEvaluationNode","SpecificPartitionAssetConditionEvaluationNode"],"AssetConditionEvaluationRecordsOrError":["AssetConditionEvaluationRecords","AutoMaterializeAssetEvaluationNeedsMigrationError"],"SensorDryRunResult":["PythonError","SensorNotFoundError","DryRunInstigationTick"],"ScheduleDryRunResult":["DryRunInstigationTick","PythonError","ScheduleNotFoundError"],"TerminateRunsResultOrError":["TerminateRunsResult","PythonError"],"AssetWipeMutationResult":["AssetNotFoundError","UnauthorizedError","PythonError","UnsupportedOperationError","AssetWipeSuccess"],"ReportRunlessAssetEventsResult":["UnauthorizedError","PythonError","ReportRunlessAssetEventsSuccess"],"ResumeBackfillResult":["ResumeBackfillSuccess","UnauthorizedError","PythonError"],"CancelBackfillResult":["CancelBackfillSuccess","UnauthorizedError","PythonError"],"LogTelemetryMutationResult":["LogTelemetrySuccess","PythonError"],"AddDynamicPartitionResult":["AddDynamicPartitionSuccess","UnauthorizedError","PythonError","DuplicateDynamicPartitionError"],"DeleteDynamicPartitionsResult":["DeleteDynamicPartitionsSuccess","UnauthorizedError","PythonError"]} \ No newline at end of file +{"DisplayableEvent":["EngineEvent","ExecutionStepOutputEvent","ExpectationResult","FailureMetadata","HandledOutputEvent","LoadedInputEvent","ObjectStoreOperationResult","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","MaterializationEvent","ObservationEvent","TypeCheck"],"MarkerEvent":["EngineEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","StepWorkerStartedEvent","StepWorkerStartingEvent"],"ErrorEvent":["EngineEvent","ExecutionStepFailureEvent","ExecutionStepUpForRetryEvent","HookErroredEvent","RunFailureEvent","ResourceInitFailureEvent"],"MessageEvent":["EngineEvent","ExecutionStepFailureEvent","ExecutionStepInputEvent","ExecutionStepOutputEvent","ExecutionStepRestartEvent","ExecutionStepSkippedEvent","ExecutionStepStartEvent","ExecutionStepSuccessEvent","ExecutionStepUpForRetryEvent","HandledOutputEvent","HookCompletedEvent","HookErroredEvent","HookSkippedEvent","LoadedInputEvent","LogMessageEvent","ObjectStoreOperationEvent","RunCanceledEvent","RunCancelingEvent","RunDequeuedEvent","RunEnqueuedEvent","RunFailureEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","RunStartEvent","RunStartingEvent","RunSuccessEvent","StepExpectationResultEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","MaterializationEvent","ObservationEvent","AssetMaterializationPlannedEvent","LogsCapturedEvent","AlertStartEvent","AlertSuccessEvent","AlertFailureEvent","AssetCheckEvaluationPlannedEvent","AssetCheckEvaluationEvent"],"RunEvent":["RunCanceledEvent","RunCancelingEvent","RunDequeuedEvent","RunEnqueuedEvent","RunFailureEvent","RunStartEvent","RunStartingEvent","RunSuccessEvent","AssetMaterializationPlannedEvent","AlertStartEvent","AlertSuccessEvent","AlertFailureEvent"],"PipelineRunStepStats":["RunStepStats"],"StepEvent":["EngineEvent","ExecutionStepFailureEvent","ExecutionStepInputEvent","ExecutionStepOutputEvent","ExecutionStepRestartEvent","ExecutionStepSkippedEvent","ExecutionStepStartEvent","ExecutionStepSuccessEvent","ExecutionStepUpForRetryEvent","HandledOutputEvent","HookCompletedEvent","HookErroredEvent","HookSkippedEvent","LoadedInputEvent","ObjectStoreOperationEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","StepExpectationResultEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","MaterializationEvent","ObservationEvent","AssetCheckEvaluationPlannedEvent","AssetCheckEvaluationEvent"],"AssetOwner":["UserAssetOwner","TeamAssetOwner"],"AssetPartitionStatuses":["DefaultPartitionStatuses","MultiPartitionStatuses","TimePartitionStatuses"],"PartitionStatus1D":["TimePartitionStatuses","DefaultPartitionStatuses"],"AssetChecksOrError":["AssetChecks","AssetCheckNeedsMigrationError","AssetCheckNeedsUserCodeUpgrade","AssetCheckNeedsAgentUpgradeError"],"Instigator":["Schedule","Sensor"],"EvaluationStackEntry":["EvaluationStackListItemEntry","EvaluationStackPathEntry","EvaluationStackMapKeyEntry","EvaluationStackMapValueEntry"],"IPipelineSnapshot":["Pipeline","PipelineSnapshot","Job"],"PipelineConfigValidationError":["FieldNotDefinedConfigError","FieldsNotDefinedConfigError","MissingFieldConfigError","MissingFieldsConfigError","RuntimeMismatchConfigError","SelectorTypeConfigError"],"PipelineConfigValidationInvalid":["RunConfigValidationInvalid"],"PipelineConfigValidationResult":["InvalidSubsetError","PipelineConfigValidationValid","RunConfigValidationInvalid","PipelineNotFoundError","PythonError"],"PipelineReference":["PipelineSnapshot","UnknownPipeline"],"PipelineRun":["Run"],"DagsterRunEvent":["ExecutionStepFailureEvent","ExecutionStepInputEvent","ExecutionStepOutputEvent","ExecutionStepSkippedEvent","ExecutionStepStartEvent","ExecutionStepSuccessEvent","ExecutionStepUpForRetryEvent","ExecutionStepRestartEvent","LogMessageEvent","ResourceInitFailureEvent","ResourceInitStartedEvent","ResourceInitSuccessEvent","RunFailureEvent","RunStartEvent","RunEnqueuedEvent","RunDequeuedEvent","RunStartingEvent","RunCancelingEvent","RunCanceledEvent","RunSuccessEvent","StepWorkerStartedEvent","StepWorkerStartingEvent","HandledOutputEvent","LoadedInputEvent","LogsCapturedEvent","ObjectStoreOperationEvent","StepExpectationResultEvent","MaterializationEvent","ObservationEvent","EngineEvent","HookCompletedEvent","HookSkippedEvent","HookErroredEvent","AlertStartEvent","AlertSuccessEvent","AlertFailureEvent","AssetMaterializationPlannedEvent","AssetCheckEvaluationPlannedEvent","AssetCheckEvaluationEvent"],"PipelineRunLogsSubscriptionPayload":["PipelineRunLogsSubscriptionSuccess","PipelineRunLogsSubscriptionFailure"],"RunOrError":["Run","RunNotFoundError","PythonError"],"PipelineRunStatsSnapshot":["RunStatsSnapshot"],"RunStatsSnapshotOrError":["RunStatsSnapshot","PythonError"],"PipelineSnapshotOrError":["PipelineNotFoundError","PipelineSnapshot","PipelineSnapshotNotFoundError","PythonError"],"AssetOrError":["Asset","AssetNotFoundError"],"AssetsOrError":["AssetConnection","PythonError"],"DeletePipelineRunResult":["DeletePipelineRunSuccess","UnauthorizedError","PythonError","RunNotFoundError"],"ExecutionPlanOrError":["ExecutionPlan","RunConfigValidationInvalid","PipelineNotFoundError","InvalidSubsetError","PythonError"],"PipelineOrError":["Pipeline","PipelineNotFoundError","InvalidSubsetError","PythonError"],"ReloadRepositoryLocationMutationResult":["WorkspaceLocationEntry","ReloadNotSupported","RepositoryLocationNotFound","UnauthorizedError","PythonError"],"RepositoryLocationOrLoadError":["RepositoryLocation","PythonError"],"ReloadWorkspaceMutationResult":["Workspace","UnauthorizedError","PythonError"],"ShutdownRepositoryLocationMutationResult":["ShutdownRepositoryLocationSuccess","RepositoryLocationNotFound","UnauthorizedError","PythonError"],"TerminatePipelineExecutionFailure":["TerminateRunFailure"],"TerminatePipelineExecutionSuccess":["TerminateRunSuccess"],"TerminateRunResult":["TerminateRunSuccess","TerminateRunFailure","RunNotFoundError","UnauthorizedError","PythonError"],"ScheduleMutationResult":["PythonError","UnauthorizedError","ScheduleStateResult"],"ScheduleOrError":["Schedule","ScheduleNotFoundError","PythonError"],"SchedulerOrError":["Scheduler","SchedulerNotDefinedError","PythonError"],"SchedulesOrError":["Schedules","RepositoryNotFoundError","PythonError"],"ScheduleTickSpecificData":["ScheduleTickSuccessData","ScheduleTickFailureData"],"LaunchBackfillResult":["LaunchBackfillSuccess","PartitionSetNotFoundError","InvalidStepError","InvalidOutputError","RunConfigValidationInvalid","PipelineNotFoundError","RunConflict","UnauthorizedError","PythonError","InvalidSubsetError","PresetNotFoundError","ConflictingExecutionParamsError","NoModeProvidedError"],"ConfigTypeOrError":["EnumConfigType","CompositeConfigType","RegularConfigType","PipelineNotFoundError","ConfigTypeNotFoundError","PythonError"],"ConfigType":["ArrayConfigType","CompositeConfigType","EnumConfigType","NullableConfigType","RegularConfigType","ScalarUnionConfigType","MapConfigType"],"WrappingConfigType":["ArrayConfigType","NullableConfigType"],"DagsterType":["ListDagsterType","NullableDagsterType","RegularDagsterType"],"DagsterTypeOrError":["RegularDagsterType","PipelineNotFoundError","DagsterTypeNotFoundError","PythonError"],"WrappingDagsterType":["ListDagsterType","NullableDagsterType"],"Error":["AssetCheckNeedsMigrationError","AssetCheckNeedsUserCodeUpgrade","AssetCheckNeedsAgentUpgradeError","AssetNotFoundError","ConflictingExecutionParamsError","ConfigTypeNotFoundError","DagsterTypeNotFoundError","InvalidPipelineRunsFilterError","InvalidSubsetError","ModeNotFoundError","NoModeProvidedError","PartitionSetNotFoundError","PipelineNotFoundError","RunConflict","PipelineSnapshotNotFoundError","PresetNotFoundError","PythonError","ErrorChainLink","UnauthorizedError","ReloadNotSupported","RepositoryLocationNotFound","RepositoryNotFoundError","ResourceNotFoundError","RunGroupNotFoundError","RunNotFoundError","ScheduleNotFoundError","SchedulerNotDefinedError","SensorNotFoundError","UnsupportedOperationError","DuplicateDynamicPartitionError","InstigationStateNotFoundError","SolidStepStatusUnavailableError","GraphNotFoundError","BackfillNotFoundError","PartitionSubsetDeserializationError","AutoMaterializeAssetEvaluationNeedsMigrationError"],"PipelineRunConflict":["RunConflict"],"PipelineRunNotFoundError":["RunNotFoundError"],"RepositoriesOrError":["RepositoryConnection","RepositoryNotFoundError","PythonError"],"RepositoryOrError":["PythonError","Repository","RepositoryNotFoundError"],"WorkspaceLocationEntryOrError":["WorkspaceLocationEntry","PythonError"],"InstigationTypeSpecificData":["SensorData","ScheduleData"],"InstigationStateOrError":["InstigationState","InstigationStateNotFoundError","PythonError"],"InstigationStatesOrError":["InstigationStates","PythonError"],"MetadataEntry":["TableColumnLineageMetadataEntry","TableSchemaMetadataEntry","TableMetadataEntry","FloatMetadataEntry","IntMetadataEntry","JsonMetadataEntry","BoolMetadataEntry","MarkdownMetadataEntry","PathMetadataEntry","NotebookMetadataEntry","PythonArtifactMetadataEntry","TextMetadataEntry","UrlMetadataEntry","PipelineRunMetadataEntry","AssetMetadataEntry","JobMetadataEntry","CodeReferencesMetadataEntry","NullMetadataEntry","TimestampMetadataEntry"],"SourceLocation":["LocalFileCodeReference","UrlCodeReference"],"PartitionRunConfigOrError":["PartitionRunConfig","PythonError"],"AssetBackfillStatus":["AssetPartitionsStatusCounts","UnpartitionedAssetStatus"],"PartitionSetOrError":["PartitionSet","PartitionSetNotFoundError","PythonError"],"PartitionSetsOrError":["PartitionSets","PipelineNotFoundError","PythonError"],"PartitionsOrError":["Partitions","PythonError"],"PartitionStatusesOrError":["PartitionStatuses","PythonError"],"PartitionTagsOrError":["PartitionTags","PythonError"],"RunConfigSchemaOrError":["RunConfigSchema","PipelineNotFoundError","InvalidSubsetError","ModeNotFoundError","PythonError"],"LaunchRunResult":["LaunchRunSuccess","InvalidStepError","InvalidOutputError","RunConfigValidationInvalid","PipelineNotFoundError","RunConflict","UnauthorizedError","PythonError","InvalidSubsetError","PresetNotFoundError","ConflictingExecutionParamsError","NoModeProvidedError"],"LaunchRunReexecutionResult":["LaunchRunSuccess","InvalidStepError","InvalidOutputError","RunConfigValidationInvalid","PipelineNotFoundError","RunConflict","UnauthorizedError","PythonError","InvalidSubsetError","PresetNotFoundError","ConflictingExecutionParamsError","NoModeProvidedError"],"LaunchPipelineRunSuccess":["LaunchRunSuccess"],"RunsOrError":["Runs","InvalidPipelineRunsFilterError","PythonError"],"PipelineRuns":["Runs"],"RunGroupOrError":["RunGroup","RunGroupNotFoundError","PythonError"],"MegaRunsOrError":["MegaRuns","InvalidPipelineRunsFilterError","PythonError"],"SensorOrError":["Sensor","SensorNotFoundError","UnauthorizedError","PythonError"],"SensorsOrError":["Sensors","RepositoryNotFoundError","PythonError"],"StopSensorMutationResultOrError":["StopSensorMutationResult","UnauthorizedError","PythonError"],"ISolidDefinition":["CompositeSolidDefinition","SolidDefinition"],"SolidContainer":["Pipeline","PipelineSnapshot","Job","CompositeSolidDefinition","Graph"],"SolidStepStatsOrError":["SolidStepStatsConnection","SolidStepStatusUnavailableError"],"WorkspaceOrError":["Workspace","PythonError"],"WorkspaceLocationStatusEntriesOrError":["WorkspaceLocationStatusEntries","PythonError"],"GraphOrError":["Graph","GraphNotFoundError","PythonError"],"ResourceDetailsOrError":["ResourceDetails","ResourceNotFoundError","PythonError"],"ResourcesOrError":["ResourceDetailsList","RepositoryNotFoundError","PythonError"],"EnvVarWithConsumersOrError":["EnvVarWithConsumersList","PythonError"],"RunTagKeysOrError":["PythonError","RunTagKeys"],"RunTagsOrError":["PythonError","RunTags"],"RunIdsOrError":["RunIds","InvalidPipelineRunsFilterError","PythonError"],"AssetNodeOrError":["AssetNode","AssetNotFoundError"],"PartitionBackfillOrError":["PartitionBackfill","BackfillNotFoundError","PythonError"],"PartitionBackfillsOrError":["PartitionBackfills","PythonError"],"EventConnectionOrError":["EventConnection","RunNotFoundError","PythonError"],"AutoMaterializeAssetEvaluationRecordsOrError":["AutoMaterializeAssetEvaluationRecords","AutoMaterializeAssetEvaluationNeedsMigrationError"],"PartitionKeysOrError":["PartitionKeys","PartitionSubsetDeserializationError"],"AutoMaterializeRuleEvaluationData":["TextRuleEvaluationData","ParentMaterializedRuleEvaluationData","WaitingOnKeysRuleEvaluationData"],"AssetConditionEvaluationNode":["UnpartitionedAssetConditionEvaluationNode","PartitionedAssetConditionEvaluationNode","SpecificPartitionAssetConditionEvaluationNode"],"AssetConditionEvaluationRecordsOrError":["AssetConditionEvaluationRecords","AutoMaterializeAssetEvaluationNeedsMigrationError"],"SensorDryRunResult":["PythonError","SensorNotFoundError","DryRunInstigationTick"],"ScheduleDryRunResult":["DryRunInstigationTick","PythonError","ScheduleNotFoundError"],"TerminateRunsResultOrError":["TerminateRunsResult","PythonError"],"AssetWipeMutationResult":["AssetNotFoundError","UnauthorizedError","PythonError","UnsupportedOperationError","AssetWipeSuccess"],"ReportRunlessAssetEventsResult":["UnauthorizedError","PythonError","ReportRunlessAssetEventsSuccess"],"ResumeBackfillResult":["ResumeBackfillSuccess","UnauthorizedError","PythonError"],"CancelBackfillResult":["CancelBackfillSuccess","UnauthorizedError","PythonError"],"LogTelemetryMutationResult":["LogTelemetrySuccess","PythonError"],"AddDynamicPartitionResult":["AddDynamicPartitionSuccess","UnauthorizedError","PythonError","DuplicateDynamicPartitionError"],"DeleteDynamicPartitionsResult":["DeleteDynamicPartitionsSuccess","UnauthorizedError","PythonError"]} \ No newline at end of file diff --git a/js_modules/dagster-ui/packages/ui-core/src/graphql/schema.graphql b/js_modules/dagster-ui/packages/ui-core/src/graphql/schema.graphql index ea61221e20c10..df1933bfdf753 100644 --- a/js_modules/dagster-ui/packages/ui-core/src/graphql/schema.graphql +++ b/js_modules/dagster-ui/packages/ui-core/src/graphql/schema.graphql @@ -2966,6 +2966,32 @@ type RunGroups { results: [RunGroup!]! } +union MegaRunsOrError = MegaRuns | InvalidPipelineRunsFilterError | PythonError + +type MegaRuns { + results: [MegaRun!]! +} + +type MegaRun { + singleRun: Run + backfill: PartitionBackfill + runType: RunType! + runId: String! + status: RunStatus + creationTime: Float + startTime: Float + endTime: Float + tags: [PipelineTag!]! + jobName: String + assetSelection: [AssetKey!] + assetCheckSelection: [AssetCheckhandle!] +} + +enum RunType { + RUN + BACKFILL +} + type Sensor { id: ID! jobOriginId: String! @@ -3232,6 +3258,7 @@ type Query { pipelineRunOrError(runId: ID!): RunOrError! runsOrError(filter: RunsFilter, cursor: String, limit: Int): RunsOrError! runOrError(runId: ID!): RunOrError! + megaRunsOrError(cursor: String, limit: Int): MegaRunsOrError! runTagKeysOrError: RunTagKeysOrError runTagsOrError(tagKeys: [String!], valuePrefix: String, limit: Int): RunTagsOrError runIdsOrError(filter: RunsFilter, cursor: String, limit: Int): RunIdsOrError! diff --git a/js_modules/dagster-ui/packages/ui-core/src/graphql/types.ts b/js_modules/dagster-ui/packages/ui-core/src/graphql/types.ts index f6d4f95a71eaf..2a81f797e9043 100644 --- a/js_modules/dagster-ui/packages/ui-core/src/graphql/types.ts +++ b/js_modules/dagster-ui/packages/ui-core/src/graphql/types.ts @@ -2550,6 +2550,29 @@ export type MaterializedPartitionRangeStatuses2D = { secondaryDim: PartitionStatus1D; }; +export type MegaRun = { + __typename: 'MegaRun'; + assetCheckSelection: Maybe>; + assetSelection: Maybe>; + backfill: Maybe; + creationTime: Maybe; + endTime: Maybe; + jobName: Maybe; + runId: Scalars['String']['output']; + runType: RunType; + singleRun: Maybe; + startTime: Maybe; + status: Maybe; + tags: Array; +}; + +export type MegaRuns = { + __typename: 'MegaRuns'; + results: Array; +}; + +export type MegaRunsOrError = InvalidPipelineRunsFilterError | MegaRuns | PythonError; + export type MessageEvent = { eventType: Maybe; level: LogLevel; @@ -3719,6 +3742,7 @@ export type Query = { isPipelineConfigValid: PipelineConfigValidationResult; locationStatusesOrError: WorkspaceLocationStatusEntriesOrError; logsForRun: EventConnectionOrError; + megaRunsOrError: MegaRunsOrError; partitionBackfillOrError: PartitionBackfillOrError; partitionBackfillsOrError: PartitionBackfillsOrError; partitionSetOrError: PartitionSetOrError; @@ -3876,6 +3900,11 @@ export type QueryLogsForRunArgs = { runId: Scalars['ID']['input']; }; +export type QueryMegaRunsOrErrorArgs = { + cursor?: InputMaybe; + limit?: InputMaybe; +}; + export type QueryPartitionBackfillOrErrorArgs = { backfillId: Scalars['String']['input']; }; @@ -4717,6 +4746,11 @@ export type RunTags = { export type RunTagsOrError = PythonError | RunTags; +export enum RunType { + BACKFILL = 'BACKFILL', + RUN = 'RUN', +} + export type Runs = PipelineRuns & { __typename: 'Runs'; count: Maybe; @@ -9909,6 +9943,58 @@ export const buildMaterializedPartitionRangeStatuses2D = ( }; }; +export const buildMegaRun = ( + overrides?: Partial, + _relationshipsToOmit: Set = new Set(), +): {__typename: 'MegaRun'} & MegaRun => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('MegaRun'); + return { + __typename: 'MegaRun', + assetCheckSelection: + overrides && overrides.hasOwnProperty('assetCheckSelection') + ? overrides.assetCheckSelection! + : [], + assetSelection: + overrides && overrides.hasOwnProperty('assetSelection') ? overrides.assetSelection! : [], + backfill: + overrides && overrides.hasOwnProperty('backfill') + ? overrides.backfill! + : relationshipsToOmit.has('PartitionBackfill') + ? ({} as PartitionBackfill) + : buildPartitionBackfill({}, relationshipsToOmit), + creationTime: + overrides && overrides.hasOwnProperty('creationTime') ? overrides.creationTime! : 1.1, + endTime: overrides && overrides.hasOwnProperty('endTime') ? overrides.endTime! : 2.59, + jobName: overrides && overrides.hasOwnProperty('jobName') ? overrides.jobName! : 'rerum', + runId: overrides && overrides.hasOwnProperty('runId') ? overrides.runId! : 'nesciunt', + runType: + overrides && overrides.hasOwnProperty('runType') ? overrides.runType! : RunType.BACKFILL, + singleRun: + overrides && overrides.hasOwnProperty('singleRun') + ? overrides.singleRun! + : relationshipsToOmit.has('Run') + ? ({} as Run) + : buildRun({}, relationshipsToOmit), + startTime: overrides && overrides.hasOwnProperty('startTime') ? overrides.startTime! : 7.11, + status: + overrides && overrides.hasOwnProperty('status') ? overrides.status! : RunStatus.CANCELED, + tags: overrides && overrides.hasOwnProperty('tags') ? overrides.tags! : [], + }; +}; + +export const buildMegaRuns = ( + overrides?: Partial, + _relationshipsToOmit: Set = new Set(), +): {__typename: 'MegaRuns'} & MegaRuns => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('MegaRuns'); + return { + __typename: 'MegaRuns', + results: overrides && overrides.hasOwnProperty('results') ? overrides.results! : [], + }; +}; + export const buildMessageEvent = ( overrides?: Partial, _relationshipsToOmit: Set = new Set(), @@ -11999,6 +12085,12 @@ export const buildQuery = ( : relationshipsToOmit.has('EventConnection') ? ({} as EventConnection) : buildEventConnection({}, relationshipsToOmit), + megaRunsOrError: + overrides && overrides.hasOwnProperty('megaRunsOrError') + ? overrides.megaRunsOrError! + : relationshipsToOmit.has('InvalidPipelineRunsFilterError') + ? ({} as InvalidPipelineRunsFilterError) + : buildInvalidPipelineRunsFilterError({}, relationshipsToOmit), partitionBackfillOrError: overrides && overrides.hasOwnProperty('partitionBackfillOrError') ? overrides.partitionBackfillOrError! diff --git a/python_modules/dagster-graphql/dagster_graphql/implementation/fetch_runs.py b/python_modules/dagster-graphql/dagster_graphql/implementation/fetch_runs.py index 48cd6de727e3b..f4eb6de8aa2c7 100644 --- a/python_modules/dagster-graphql/dagster_graphql/implementation/fetch_runs.py +++ b/python_modules/dagster-graphql/dagster_graphql/implementation/fetch_runs.py @@ -21,7 +21,7 @@ from dagster._core.instance import DagsterInstance from dagster._core.storage.dagster_run import DagsterRunStatus, RunRecord, RunsFilter from dagster._core.storage.event_log.base import AssetRecord -from dagster._core.storage.tags import TagType, get_tag_type +from dagster._core.storage.tags import BACKFILL_ID_TAG, TagType, get_tag_type from .external import ensure_valid_config, get_external_job_or_raise @@ -33,7 +33,7 @@ from ..schema.execution import GrapheneExecutionPlan from ..schema.logs.events import GrapheneRunStepStats from ..schema.pipelines.config import GraphenePipelineConfigValidationValid - from ..schema.pipelines.pipeline import GrapheneEventConnection, GrapheneRun + from ..schema.pipelines.pipeline import GrapheneEventConnection, GrapheneMegaRun, GrapheneRun from ..schema.pipelines.pipeline_run_stats import GrapheneRunStatsSnapshot from ..schema.runs import GrapheneRunGroup, GrapheneRunTagKeys, GrapheneRunTags from ..schema.util import ResolveInfo @@ -379,3 +379,54 @@ def get_logs_for_run( cursor=conn.cursor, hasMore=conn.has_more, ) + + +def _fetch_runs_not_in_backfill( + instance, cursor: Optional[str], limit: Optional[int] +) -> Sequence[RunRecord]: + if limit is None: + new_runs = instance.get_run_records(cursor=cursor) + return [run for run in new_runs if run.dagster_run.tags.get(BACKFILL_ID_TAG) is None] + + runs = [] + while len(runs) < limit: + new_runs = instance.get_run_records(limit=limit, cursor=cursor) + if len(new_runs) == 0: + return runs + cursor = new_runs[-1].dagster_run.run_id + runs.extend([run for run in new_runs if run.dagster_run.tags.get(BACKFILL_ID_TAG) is None]) + + return runs[:limit] + + +def get_mega_runs( + graphene_info: "ResolveInfo", + cursor: Optional[str] = None, + limit: Optional[int] = None, +) -> Sequence["GrapheneMegaRun"]: + from ..schema.pipelines.pipeline import GrapheneMegaRun + + check.opt_str_param(cursor, "cursor") + check.opt_int_param(limit, "limit") + + instance = graphene_info.context.instance + + run_cursor, backfill_cursor = cursor.split(";") if cursor else (None, None) + + # get_backfills doesn't support many filters. Need to implement some filtering before we can + # add that as a param + backfills = instance.get_backfills(cursor=backfill_cursor, limit=limit) + runs = _fetch_runs_not_in_backfill(instance, cursor=run_cursor, limit=limit) + + # order runs and backfills by create_time. typically we sort by storage id but that won't work here since + # they are different tables + all_mega_runs = sorted( + backfills + runs, + key=lambda x: x.create_timestamp.timestamp() + if isinstance(x, RunRecord) + else x.backfill_timestamp, + ) + if limit: + all_mega_runs = all_mega_runs[:limit] + + return [GrapheneMegaRun(record) for record in all_mega_runs] diff --git a/python_modules/dagster-graphql/dagster_graphql/schema/backfill.py b/python_modules/dagster-graphql/dagster_graphql/schema/backfill.py index 6d3a6f77a7024..d2a89542eb146 100644 --- a/python_modules/dagster-graphql/dagster_graphql/schema/backfill.py +++ b/python_modules/dagster-graphql/dagster_graphql/schema/backfill.py @@ -29,6 +29,8 @@ ) from dagster._core.workspace.permissions import Permissions +from dagster_graphql.schema.pipelines.status import GrapheneRunStatus + from ..implementation.fetch_partition_sets import ( partition_status_counts_from_run_partition_data, partition_statuses_from_run_partition_data, @@ -120,6 +122,18 @@ class GrapheneBulkActionStatus(graphene.Enum): class Meta: name = "BulkActionStatus" + def to_dagster_run_status(self) -> GrapheneRunStatus: + if self == GrapheneBulkActionStatus.REQUESTED: + return GrapheneRunStatus.STARTED + if self == GrapheneBulkActionStatus.COMPLETED: + return GrapheneRunStatus.SUCCESS + if self == GrapheneBulkActionStatus.FAILED: + return GrapheneRunStatus.FAILURE + if self == GrapheneBulkActionStatus.CANCELED: + return GrapheneRunStatus.CANCELED + if self == GrapheneBulkActionStatus.CANCELING: + return GrapheneRunStatus.CANCELING + class GrapheneAssetBackfillTargetPartitions(graphene.ObjectType): class Meta: diff --git a/python_modules/dagster-graphql/dagster_graphql/schema/pipelines/pipeline.py b/python_modules/dagster-graphql/dagster_graphql/schema/pipelines/pipeline.py index 449c6e8d9959e..33efb58ae7a85 100644 --- a/python_modules/dagster-graphql/dagster_graphql/schema/pipelines/pipeline.py +++ b/python_modules/dagster-graphql/dagster_graphql/schema/pipelines/pipeline.py @@ -19,6 +19,7 @@ from dagster._utils.yaml_utils import dump_run_config_yaml from dagster_graphql.implementation.events import iterate_metadata_entries +from dagster_graphql.schema.backfill import GrapheneBulkActionStatus, GraphenePartitionBackfill from dagster_graphql.schema.metadata import GrapheneMetadataEntry from ...implementation.events import from_event_record @@ -326,32 +327,6 @@ class Meta: name = "PipelineRun" -class GrapheneMegaRun(graphene.ObjectType): - id = graphene.NonNull(graphene.ID) - runId = graphene.NonNull(graphene.String) - status = graphene.NonNull(GrapheneRunStatus) - creationTime = graphene.NonNull(graphene.Float) - startTime = graphene.Float() - endTime = graphene.Float() - tags = non_null_list(GraphenePipelineTag) - # some way to have the job name or asset selection in one field? - jobName = graphene.NonNull(graphene.String) - assetSelection = graphene.List(graphene.NonNull(GrapheneAssetKey)) - - class Meta: - name = "MegaRun" - - def __init__(self, record: Union[RunRecord, PartitionBackfill]): - check.inst_param(record, "record", (RunRecord, PartitionBackfill)) - - self._record = record - self._mega_run = record.to_mega_run() - super().__init__( - runId=self._mega_run.run_id, - status=self._mega_run.status.value, - ) - - class GrapheneRun(graphene.ObjectType): id = graphene.NonNull(graphene.ID) runId = graphene.NonNull(graphene.String) @@ -635,6 +610,97 @@ def resolve_rootConcurrencyKeys(self, graphene_info: ResolveInfo): return root_concurrency_keys +class GrapheneRunType(graphene.Enum): + """The underlying kind of run represented by a MegaRun.""" + + RUN = "RUN" + BACKFILL = "BACKFILL" + + class Meta: + name = "RunType" + + +class GrapheneMegaRun(graphene.ObjectType): + singleRun = graphene.Field(GrapheneRun) + backfill = graphene.Field(GraphenePartitionBackfill) + runType = graphene.NonNull(GrapheneRunType) + + # fields promoted to top level in the object since they are used to power the UI + runId = graphene.NonNull(graphene.String) + status = graphene.Field(GrapheneRunStatus) + creationTime = graphene.Float() + startTime = graphene.Float() + endTime = graphene.Float() + tags = non_null_list(GraphenePipelineTag) + # maybe we can combine these into a single target field? not sure if that's an improvement + jobName = graphene.String() + assetSelection = graphene.List(graphene.NonNull(GrapheneAssetKey)) + assetCheckSelection = graphene.List(graphene.NonNull(GrapheneAssetCheckHandle)) + + class Meta: + name = "MegaRun" + + def __init__(self, record: Union[RunRecord, PartitionBackfill]): + check.inst_param(record, "record", (RunRecord, PartitionBackfill)) + + super().__init__( + singleRun=GrapheneRun(record) if isinstance(record, RunRecord) else None, + backfill=GraphenePartitionBackfill(record) + if isinstance(record, PartitionBackfill) + else None, + runType=GrapheneRunType.RUN + if isinstance(record, RunRecord) + else GrapheneRunType.BACKFILL, + ) + + # TODO - return types + # TODO - need to call the resolve_X fn for anything that isn't set at init time + def resolve_runId(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.runId + return self.backfill.id + + def resolve_status(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.status + return GrapheneBulkActionStatus(self.backfill.status).to_dagster_run_status() + + def resolve_creationTime(self, graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.resolve_creationTime(graphene_info) + return self.backfill.timestamp + + def resolve_startTime(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.startTime + return self.backfill.timestamp + + def resolve_endTime(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.endTime + return self.backfill.endTime + + def resolve_tags(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.tags + return self.backfill.tags + + def resolve_jobName(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.jobName + return self.backfill.tags + + def resolve_assetSelection(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.assetSelection + return self.backfill.assetSelection + + def resolve_assetCheckSelection(self, _graphene_info: ResolveInfo): + if self.runType == GrapheneRunType.RUN: + return self.singleRun.assetCheckSelection + return [] + + class GrapheneIPipelineSnapshotMixin: # Mixin this class to implement IPipelineSnapshot # diff --git a/python_modules/dagster-graphql/dagster_graphql/schema/roots/query.py b/python_modules/dagster-graphql/dagster_graphql/schema/roots/query.py index 33dc5d28f92a2..d1056c836de95 100644 --- a/python_modules/dagster-graphql/dagster_graphql/schema/roots/query.py +++ b/python_modules/dagster-graphql/dagster_graphql/schema/roots/query.py @@ -156,6 +156,8 @@ from ..resources import GrapheneResourceDetailsListOrError, GrapheneResourceDetailsOrError from ..run_config import GrapheneRunConfigSchemaOrError from ..runs import ( + GrapheneMegaRuns, + GrapheneMegaRunsOrError, GrapheneRunConfigData, GrapheneRunGroupOrError, GrapheneRunIds, @@ -347,6 +349,12 @@ class Meta: runId=graphene.NonNull(graphene.ID), description="Retrieve a run by its run id.", ) + megaRunsOrError = graphene.Field( + graphene.NonNull(GrapheneMegaRunsOrError), + cursor=graphene.String(), + limit=graphene.Int(), + description="Retireve MegaRuns after applying cursor and limit.", + ) runTagKeysOrError = graphene.Field( GrapheneRunTagKeysOrError, description="Retrieve the distinct tag keys from all runs." ) @@ -803,6 +811,11 @@ def resolve_runIdsOrError( async def resolve_runOrError(self, graphene_info: ResolveInfo, runId): return await gen_run_by_id(graphene_info, runId) + def resolve_megaRunsOrError( + self, _graphene_info: ResolveInfo, cursor: Optional[str] = None, limit: Optional[int] = None + ): + return GrapheneMegaRuns(cursor=cursor, limit=limit) + @capture_error def resolve_partitionSetsOrError( self, graphene_info: ResolveInfo, repositorySelector: RepositorySelector, pipelineName: str diff --git a/python_modules/dagster-graphql/dagster_graphql/schema/runs.py b/python_modules/dagster-graphql/dagster_graphql/schema/runs.py index cb531a5854a1a..da5de821e77a2 100644 --- a/python_modules/dagster-graphql/dagster_graphql/schema/runs.py +++ b/python_modules/dagster-graphql/dagster_graphql/schema/runs.py @@ -9,7 +9,7 @@ from dagster._utils.yaml_utils import load_run_config_yaml from graphene.types.generic import GenericScalar -from ..implementation.fetch_runs import get_run_ids, get_runs, get_runs_count +from ..implementation.fetch_runs import get_mega_runs, get_run_ids, get_runs, get_runs_count from ..implementation.utils import UserFacingGraphQLError from .errors import ( GrapheneInvalidPipelineRunsFilterError, @@ -211,6 +211,28 @@ def parse_run_config_input( return run_config +class GrapheneMegaRuns(graphene.ObjectType): + results = non_null_list("dagster_graphql.schema.pipelines.pipeline.GrapheneMegaRun") + + class Meta: + name = "MegaRuns" + + def __init__(self, cursor, limit): + super().__init__() + + self._cursor = cursor + self._limit = limit + + def resolve_results(self, graphene_info: ResolveInfo): + return get_mega_runs(graphene_info, self._cursor, self._limit) + + +class GrapheneMegaRunsOrError(graphene.Union): + class Meta: + types = (GrapheneMegaRuns, GrapheneInvalidPipelineRunsFilterError, GraphenePythonError) + name = "MegaRunsOrError" + + types = [ GrapheneLaunchRunResult, GrapheneLaunchRunReexecutionResult, @@ -221,4 +243,5 @@ def parse_run_config_input( GrapheneRunGroup, GrapheneRunGroupOrError, GrapheneRunGroups, + GrapheneMegaRunsOrError, ] diff --git a/python_modules/dagster/dagster/_core/execution/backfill.py b/python_modules/dagster/dagster/_core/execution/backfill.py index 92205c189be68..e1bde5621cd3e 100644 --- a/python_modules/dagster/dagster/_core/execution/backfill.py +++ b/python_modules/dagster/dagster/_core/execution/backfill.py @@ -457,7 +457,8 @@ def from_asset_graph_subset( ) def to_mega_run(self) -> MegaRun: - # target = self.asset_selection if self.asset_selection else + # TODO - we don't have the job name on the backfill object, just the partition set? + target = self.asset_selection if self.asset_selection else self.partition_set_name return MegaRun( run_id=self.backfill_id, status=self.status.to_dagster_run_status(), @@ -465,5 +466,5 @@ def to_mega_run(self) -> MegaRun: start_time=self.backfill_timestamp, end_time=None, tags=self.tags, - target=None, + target=target, )