├── .dockerignore ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ ├── documentation.md │ └── feature_request.md ├── dependabot.yml ├── pull_request_template.md ├── release-drafter.yml └── workflows │ ├── ci.yml │ ├── generate_gh_pages.yml │ ├── java-client-v4-build.yml │ ├── java-client-v4-integration-tests.yml │ ├── java-client-v4-publish-release.yml │ ├── publish.yml │ ├── publish_build.yaml │ └── release_draft.yml ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── OSSMETADATA ├── README.md ├── RELATED.md ├── ROADMAP.md ├── SECURITY.md ├── USERS.md ├── amqp ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── contribs │ │ └── queue │ │ └── amqp │ │ ├── AMQPConnection.java │ │ ├── AMQPObservableQueue.java │ │ ├── config │ │ ├── AMQPEventQueueConfiguration.java │ │ ├── AMQPEventQueueProperties.java │ │ ├── AMQPEventQueueProvider.java │ │ └── AMQPRetryPattern.java │ │ └── util │ │ ├── AMQPConfigurations.java │ │ ├── AMQPConstants.java │ │ ├── AMQPSettings.java │ │ ├── ConnectionType.java │ │ └── RetryType.java │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── contribs │ └── queue │ └── amqp │ ├── AMQPEventQueueProviderTest.java │ ├── AMQPObservableQueueTest.java │ └── AMQPSettingsTest.java ├── annotations-processor ├── README.md ├── build.gradle └── src │ ├── example │ └── java │ │ └── com │ │ └── example │ │ └── Example.java │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── annotationsprocessor │ │ │ └── protogen │ │ │ ├── AbstractMessage.java │ │ │ ├── Enum.java │ │ │ ├── Message.java │ │ │ ├── ProtoFile.java │ │ │ ├── ProtoGen.java │ │ │ ├── ProtoGenTask.java │ │ │ └── types │ │ │ ├── AbstractType.java │ │ │ ├── ExternMessageType.java │ │ │ ├── GenericType.java │ │ │ ├── ListType.java │ │ │ ├── MapType.java │ │ │ ├── MessageType.java │ │ │ ├── ScalarType.java │ │ │ ├── TypeMapper.java │ │ │ └── WrappedType.java │ └── resources │ │ └── templates │ │ ├── file.proto │ │ └── message.proto │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── annotationsprocessor │ │ └── protogen │ │ └── ProtoGenTest.java │ └── resources │ └── example.proto.txt ├── annotations ├── README.md ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── netflix │ └── conductor │ └── annotations │ └── protogen │ ├── ProtoEnum.java │ ├── ProtoField.java │ └── ProtoMessage.java ├── awss3-storage ├── README.md ├── build.gradle └── src │ └── main │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── s3 │ │ ├── config │ │ ├── S3Configuration.java │ │ └── S3Properties.java │ │ └── storage │ │ └── S3PayloadStorage.java │ └── resources │ └── META-INF │ └── additional-spring-configuration-metadata.json ├── awssqs-event-queue ├── README.md ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── sqs │ │ │ ├── config │ │ │ ├── SQSEventQueueConfiguration.java │ │ │ ├── SQSEventQueueProperties.java │ │ │ └── SQSEventQueueProvider.java │ │ │ └── eventqueue │ │ │ └── SQSObservableQueue.java │ └── resources │ │ └── META-INF │ │ └── additional-spring-configuration-metadata.json │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── sqs │ └── eventqueue │ ├── DefaultEventQueueProcessorTest.java │ └── SQSObservableQueueTest.java ├── azureblob-storage ├── README.md ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── azureblob │ │ ├── config │ │ ├── AzureBlobConfiguration.java │ │ └── AzureBlobProperties.java │ │ └── storage │ │ └── AzureBlobPayloadStorage.java │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── azureblob │ └── storage │ └── AzureBlobPayloadStorageTest.java ├── build.gradle ├── cassandra-persistence ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── cassandra │ │ │ ├── config │ │ │ ├── CassandraConfiguration.java │ │ │ ├── CassandraProperties.java │ │ │ └── cache │ │ │ │ ├── CacheableEventHandlerDAO.java │ │ │ │ ├── CacheableMetadataDAO.java │ │ │ │ └── CachingConfig.java │ │ │ ├── dao │ │ │ ├── CassandraBaseDAO.java │ │ │ ├── CassandraEventHandlerDAO.java │ │ │ ├── CassandraExecutionDAO.java │ │ │ ├── CassandraMetadataDAO.java │ │ │ └── CassandraPollDataDAO.java │ │ │ └── util │ │ │ ├── Constants.java │ │ │ └── Statements.java │ └── resources │ │ └── META-INF │ │ └── additional-spring-configuration-metadata.json │ └── test │ └── groovy │ └── com │ └── netflix │ └── conductor │ └── cassandra │ ├── dao │ ├── CassandraEventHandlerDAOSpec.groovy │ ├── CassandraExecutionDAOSpec.groovy │ ├── CassandraMetadataDAOSpec.groovy │ └── CassandraSpec.groovy │ └── util │ └── StatementsSpec.groovy ├── client-spring ├── README.md ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── client │ │ │ └── spring │ │ │ ├── ClientProperties.java │ │ │ ├── ConductorClientAutoConfiguration.java │ │ │ ├── ConductorWorkerAutoConfiguration.java │ │ │ └── SpringWorkerConfiguration.java │ └── resources │ │ └── META-INF │ │ ├── spring.factories │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ └── spring │ │ ├── ExampleClient.java │ │ └── Workers.java │ └── resources │ └── application.properties ├── client ├── README.md ├── build.gradle ├── spotbugsExclude.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ ├── automator │ │ ├── PollingSemaphore.java │ │ ├── TaskPollExecutor.java │ │ └── TaskRunnerConfigurer.java │ │ ├── config │ │ ├── ConductorClientConfiguration.java │ │ ├── DefaultConductorClientConfiguration.java │ │ └── PropertyFactory.java │ │ ├── exception │ │ └── ConductorClientException.java │ │ ├── http │ │ ├── ClientBase.java │ │ ├── ClientRequestHandler.java │ │ ├── EventClient.java │ │ ├── MetadataClient.java │ │ ├── PayloadStorage.java │ │ ├── TaskClient.java │ │ └── WorkflowClient.java │ │ ├── telemetry │ │ └── MetricsContainer.java │ │ └── worker │ │ └── Worker.java │ └── test │ ├── groovy │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ └── http │ │ ├── ClientSpecification.groovy │ │ ├── EventClientSpec.groovy │ │ ├── MetadataClientSpec.groovy │ │ ├── TaskClientSpec.groovy │ │ └── WorkflowClientSpec.groovy │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ ├── automator │ │ ├── PollingSemaphoreTest.java │ │ ├── TaskPollExecutorTest.java │ │ └── TaskRunnerConfigurerTest.java │ │ ├── config │ │ └── TestPropertyFactory.java │ │ ├── sample │ │ ├── Main.java │ │ └── SampleWorker.java │ │ ├── testing │ │ ├── AbstractWorkflowTests.java │ │ ├── LoanWorkflowInput.java │ │ ├── LoanWorkflowTest.java │ │ ├── RegressionTest.java │ │ └── SubWorkflowTest.java │ │ └── worker │ │ └── TestWorkflowTask.java │ └── resources │ ├── config.properties │ ├── tasks.json │ ├── test_data │ ├── loan_workflow_input.json │ └── workflow1_run.json │ └── workflows │ ├── PopulationMinMax.json │ ├── calculate_loan_workflow.json │ ├── kitchensink.json │ └── workflow1.json ├── common-persistence ├── build.gradle └── src │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── dao │ ├── ExecutionDAOTest.java │ └── TestBase.java ├── common ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── annotations │ │ └── protogen │ │ │ ├── ProtoEnum.java │ │ │ ├── ProtoField.java │ │ │ └── ProtoMessage.java │ │ └── common │ │ ├── config │ │ ├── ObjectMapperBuilderConfiguration.java │ │ ├── ObjectMapperConfiguration.java │ │ └── ObjectMapperProvider.java │ │ ├── constraints │ │ ├── NoSemiColonConstraint.java │ │ ├── OwnerEmailMandatoryConstraint.java │ │ ├── TaskReferenceNameUniqueConstraint.java │ │ ├── TaskTimeoutConstraint.java │ │ └── ValidNameConstraint.java │ │ ├── jackson │ │ └── JsonProtoModule.java │ │ ├── metadata │ │ ├── Auditable.java │ │ ├── BaseDef.java │ │ ├── SchemaDef.java │ │ ├── acl │ │ │ └── Permission.java │ │ ├── events │ │ │ ├── EventExecution.java │ │ │ └── EventHandler.java │ │ ├── tasks │ │ │ ├── PollData.java │ │ │ ├── Task.java │ │ │ ├── TaskDef.java │ │ │ ├── TaskExecLog.java │ │ │ ├── TaskResult.java │ │ │ └── TaskType.java │ │ └── workflow │ │ │ ├── DynamicForkJoinTask.java │ │ │ ├── DynamicForkJoinTaskList.java │ │ │ ├── IdempotencyStrategy.java │ │ │ ├── RateLimitConfig.java │ │ │ ├── RerunWorkflowRequest.java │ │ │ ├── SkipTaskRequest.java │ │ │ ├── StartWorkflowRequest.java │ │ │ ├── StateChangeEvent.java │ │ │ ├── SubWorkflowParams.java │ │ │ ├── UpgradeWorkflowRequest.java │ │ │ ├── WorkflowDef.java │ │ │ ├── WorkflowDefSummary.java │ │ │ └── WorkflowTask.java │ │ ├── model │ │ └── BulkResponse.java │ │ ├── run │ │ ├── ExternalStorageLocation.java │ │ ├── SearchResult.java │ │ ├── TaskSummary.java │ │ ├── Workflow.java │ │ ├── WorkflowSummary.java │ │ ├── WorkflowSummaryExtended.java │ │ └── WorkflowTestRequest.java │ │ ├── utils │ │ ├── ConstraintParamUtil.java │ │ ├── EnvUtils.java │ │ ├── ExternalPayloadStorage.java │ │ ├── SummaryUtil.java │ │ └── TaskUtils.java │ │ └── validation │ │ ├── ErrorResponse.java │ │ └── ValidationError.java │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── common │ │ ├── config │ │ └── TestObjectMapperConfiguration.java │ │ ├── constraints │ │ └── NameValidatorTest.java │ │ ├── events │ │ └── EventHandlerTest.java │ │ ├── run │ │ └── TaskSummaryTest.java │ │ ├── tasks │ │ ├── TaskDefTest.java │ │ ├── TaskResultTest.java │ │ └── TaskTest.java │ │ ├── utils │ │ ├── ConstraintParamUtilTest.java │ │ └── SummaryUtilTest.java │ │ └── workflow │ │ ├── SubWorkflowParamsTest.java │ │ ├── WorkflowDefValidatorTest.java │ │ └── WorkflowTaskTest.java │ └── resources │ └── application.properties ├── conductor-clients ├── README.md └── java │ └── conductor-java-sdk │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── build.gradle │ ├── buildSrc │ ├── build.gradle │ └── src │ │ └── main │ │ ├── groovy │ │ └── io │ │ │ └── orkes │ │ │ └── conductor │ │ │ └── gradle │ │ │ └── PublishConfigPlugin.groovy │ │ └── resources │ │ └── META-INF │ │ └── gradle-plugins │ │ └── publish-config.properties │ ├── conductor-client-metrics │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ └── metrics │ │ └── prometheus │ │ └── PrometheusMetricsCollector.java │ ├── conductor-client-spring │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── client │ │ │ └── spring │ │ │ ├── ClientProperties.java │ │ │ ├── ConductorClientAutoConfiguration.java │ │ │ ├── ConductorWorkerAutoConfiguration.java │ │ │ └── SpringWorkerConfiguration.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── conductor-client │ ├── README.md │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ ├── client │ │ │ ├── automator │ │ │ │ ├── TaskRunner.java │ │ │ │ ├── TaskRunnerConfigurer.java │ │ │ │ └── filters │ │ │ │ │ └── PollFilter.java │ │ │ ├── config │ │ │ │ ├── ConductorClientConfiguration.java │ │ │ │ ├── DefaultConductorClientConfiguration.java │ │ │ │ └── PropertyFactory.java │ │ │ ├── events │ │ │ │ ├── ConductorClientEvent.java │ │ │ │ ├── dispatcher │ │ │ │ │ └── EventDispatcher.java │ │ │ │ ├── listeners │ │ │ │ │ ├── ListenerRegister.java │ │ │ │ │ ├── TaskClientListener.java │ │ │ │ │ ├── TaskRunnerEventsListener.java │ │ │ │ │ └── WorkflowClientListener.java │ │ │ │ ├── task │ │ │ │ │ ├── TaskClientEvent.java │ │ │ │ │ ├── TaskPayloadUsedEvent.java │ │ │ │ │ └── TaskResultPayloadSizeEvent.java │ │ │ │ ├── taskrunner │ │ │ │ │ ├── PollCompleted.java │ │ │ │ │ ├── PollFailure.java │ │ │ │ │ ├── PollStarted.java │ │ │ │ │ ├── TaskExecutionCompleted.java │ │ │ │ │ ├── TaskExecutionFailure.java │ │ │ │ │ ├── TaskExecutionStarted.java │ │ │ │ │ └── TaskRunnerEvent.java │ │ │ │ └── workflow │ │ │ │ │ ├── WorkflowClientEvent.java │ │ │ │ │ ├── WorkflowInputPayloadSizeEvent.java │ │ │ │ │ ├── WorkflowPayloadUsedEvent.java │ │ │ │ │ └── WorkflowStartedEvent.java │ │ │ ├── exception │ │ │ │ └── ConductorClientException.java │ │ │ ├── http │ │ │ │ ├── ConductorClient.java │ │ │ │ ├── ConductorClientRequest.java │ │ │ │ ├── ConductorClientResponse.java │ │ │ │ ├── ConnectionPoolConfig.java │ │ │ │ ├── EventClient.java │ │ │ │ ├── HeaderSupplier.java │ │ │ │ ├── MetadataClient.java │ │ │ │ ├── Param.java │ │ │ │ ├── PayloadStorage.java │ │ │ │ ├── TaskClient.java │ │ │ │ └── WorkflowClient.java │ │ │ ├── metrics │ │ │ │ └── MetricsCollector.java │ │ │ └── worker │ │ │ │ └── Worker.java │ │ │ └── common │ │ │ ├── config │ │ │ └── ObjectMapperProvider.java │ │ │ ├── metadata │ │ │ ├── Auditable.java │ │ │ ├── SchemaDef.java │ │ │ ├── events │ │ │ │ ├── EventExecution.java │ │ │ │ └── EventHandler.java │ │ │ ├── tasks │ │ │ │ ├── PollData.java │ │ │ │ ├── Task.java │ │ │ │ ├── TaskDef.java │ │ │ │ ├── TaskExecLog.java │ │ │ │ ├── TaskResult.java │ │ │ │ └── TaskType.java │ │ │ └── workflow │ │ │ │ ├── DynamicForkJoinTask.java │ │ │ │ ├── DynamicForkJoinTaskList.java │ │ │ │ ├── IdempotencyStrategy.java │ │ │ │ ├── RateLimitConfig.java │ │ │ │ ├── RerunWorkflowRequest.java │ │ │ │ ├── SkipTaskRequest.java │ │ │ │ ├── StartWorkflowRequest.java │ │ │ │ ├── StateChangeEvent.java │ │ │ │ ├── SubWorkflowParams.java │ │ │ │ ├── UpgradeWorkflowRequest.java │ │ │ │ ├── WorkflowDef.java │ │ │ │ ├── WorkflowDefSummary.java │ │ │ │ └── WorkflowTask.java │ │ │ ├── model │ │ │ └── BulkResponse.java │ │ │ ├── run │ │ │ ├── ExternalStorageLocation.java │ │ │ ├── SearchResult.java │ │ │ ├── TaskSummary.java │ │ │ ├── Workflow.java │ │ │ ├── WorkflowSummary.java │ │ │ └── WorkflowTestRequest.java │ │ │ ├── utils │ │ │ ├── ConstraintParamUtil.java │ │ │ ├── EnvUtils.java │ │ │ ├── ExternalPayloadStorage.java │ │ │ ├── MetadataUtils.java │ │ │ ├── SummaryUtil.java │ │ │ └── TaskUtils.java │ │ │ └── validation │ │ │ ├── ErrorResponse.java │ │ │ └── ValidationError.java │ │ └── test │ │ ├── groovy │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ ├── client │ │ │ └── http │ │ │ │ ├── ClientSpecification.groovy │ │ │ │ ├── EventClientSpec.groovy │ │ │ │ ├── MetadataClientSpec.groovy │ │ │ │ ├── TaskClientSpec.groovy │ │ │ │ └── WorkflowClientSpec.groovy │ │ │ └── common │ │ │ └── utils │ │ │ └── MetadataUtilsSpec.groovy │ │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ ├── client │ │ │ ├── automator │ │ │ │ └── TaskRunnerConfigurerTest.java │ │ │ ├── config │ │ │ │ └── TestPropertyFactory.java │ │ │ ├── sample │ │ │ │ ├── Main.java │ │ │ │ └── SampleWorker.java │ │ │ ├── testing │ │ │ │ ├── AbstractWorkflowTests.java │ │ │ │ ├── LoanWorkflowInput.java │ │ │ │ ├── LoanWorkflowTest.java │ │ │ │ ├── RegressionTest.java │ │ │ │ └── SubWorkflowTest.java │ │ │ └── worker │ │ │ │ └── TestWorkflowTask.java │ │ │ ├── common │ │ │ ├── metadata │ │ │ │ ├── TestAuditablePojoMethods.java │ │ │ │ ├── TestSchemaDefPojoMethods.java │ │ │ │ ├── TestSerDerAuditable.java │ │ │ │ ├── TestSerDerSchemaDef.java │ │ │ │ ├── events │ │ │ │ │ ├── TestEventExecutionPojoMethods.java │ │ │ │ │ ├── TestEventHandlerPojoMethods.java │ │ │ │ │ ├── TestSerDerEventExecution.java │ │ │ │ │ └── TestSerDerEventHandler.java │ │ │ │ ├── tasks │ │ │ │ │ ├── TaskDefSerDerTest.java │ │ │ │ │ ├── TestPollDataPojoMethods.java │ │ │ │ │ ├── TestSerDerPollData.java │ │ │ │ │ ├── TestSerDerTask.java │ │ │ │ │ ├── TestSerDerTaskExecLog.java │ │ │ │ │ ├── TestSerDerTaskResult.java │ │ │ │ │ ├── TestTaskDefPojoMethods.java │ │ │ │ │ ├── TestTaskExecLogPojoMethods.java │ │ │ │ │ ├── TestTaskPojoMethods.java │ │ │ │ │ └── TestTaskResultPojoMethods.java │ │ │ │ └── workflow │ │ │ │ │ ├── TestDynamicForkJoinTaskListPojoMethods.java │ │ │ │ │ ├── TestDynamicForkJoinTaskPojoMethods.java │ │ │ │ │ ├── TestRateLimitConfigPojoMethods.java │ │ │ │ │ ├── TestRerunWorkflowRequestPojoMethods.java │ │ │ │ │ ├── TestSerDerDynamicForkJoinTask.java │ │ │ │ │ ├── TestSerDerDynamicForkJoinTaskList.java │ │ │ │ │ ├── TestSerDerRateLimitConfig.java │ │ │ │ │ ├── TestSerDerRerunWorkflowRequest.java │ │ │ │ │ ├── TestSerDerStartWorkflowRequest.java │ │ │ │ │ ├── TestSerDerStateChangeEvent.java │ │ │ │ │ ├── TestSerDerSubWorkflowParams.java │ │ │ │ │ ├── TestSerDerUpgradeWorkflowRequest.java │ │ │ │ │ ├── TestSerDerWorkflowDef.java │ │ │ │ │ ├── TestSerDerWorkflowDefSummary.java │ │ │ │ │ ├── TestSerDerWorkflowTask.java │ │ │ │ │ ├── TestSkipTaskRequestPojoMethods.java │ │ │ │ │ ├── TestSkipTaskRequestSerDer.java │ │ │ │ │ ├── TestStartWorkflowRequestPojoMethods.java │ │ │ │ │ ├── TestStateChangeEventPojoMethods.java │ │ │ │ │ ├── TestSubWorkflowParamsPojoMethods.java │ │ │ │ │ ├── TestUpgradeWorkflowRequestPojoMethods.java │ │ │ │ │ ├── TestWorkflowDefPojoMethods.java │ │ │ │ │ ├── TestWorkflowDefSummaryPojoMethods.java │ │ │ │ │ ├── TestWorkflowTaskPojoMethods.java │ │ │ │ │ └── WorkflowDefDeserializationTest.java │ │ │ ├── model │ │ │ │ └── TestSerDerBulkResponse.java │ │ │ └── run │ │ │ │ ├── TaskSummarySerDeTest.java │ │ │ │ ├── TestExternalStorageLocationPojoMethods.java │ │ │ │ ├── TestSearchResultPojoMethods.java │ │ │ │ ├── TestSerDerExternalStorageLocation.java │ │ │ │ ├── TestSerDerSearchResult.java │ │ │ │ ├── TestSerDerWorkflow.java │ │ │ │ ├── TestSerDerWorkflowSummary.java │ │ │ │ ├── TestSerDerWorkflowTestRequest.java │ │ │ │ ├── TestTaskSummaryPojoMethods.java │ │ │ │ ├── TestWorkflowPojoMethods.java │ │ │ │ ├── TestWorkflowSummaryPojoMethods.java │ │ │ │ └── TestWorkflowTestRequestPojoMethods.java │ │ │ └── util │ │ │ └── JsonTemplateSerDeserResolverUtil.java │ │ └── resources │ │ ├── conductor-workers.properties │ │ ├── config.properties │ │ ├── ser_deser_json_string.json │ │ ├── tasks.json │ │ ├── test_data │ │ ├── loan_workflow_input.json │ │ └── workflow1_run.json │ │ └── workflows │ │ ├── PopulationMinMax.json │ │ ├── calculate_loan_workflow.json │ │ ├── kitchensink.json │ │ ├── main_workflow.json │ │ └── workflow1.json │ ├── examples │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ ├── java │ │ ├── com │ │ │ └── netflix │ │ │ │ └── conductor │ │ │ │ ├── gettingstarted │ │ │ │ ├── CreateWorkflow.java │ │ │ │ ├── HelloWorker.java │ │ │ │ └── StartWorkflow.java │ │ │ │ └── sdk │ │ │ │ └── examples │ │ │ │ ├── TaskRegistration.java │ │ │ │ ├── TaskRunner.java │ │ │ │ ├── events │ │ │ │ └── EventListenerExample.java │ │ │ │ ├── helloworld │ │ │ │ ├── Main.java │ │ │ │ ├── workers │ │ │ │ │ └── Workers.java │ │ │ │ └── workflowdef │ │ │ │ │ └── GreetingsWorkflow.java │ │ │ │ ├── sendemail │ │ │ │ ├── Main.java │ │ │ │ ├── workers │ │ │ │ │ └── Workers.java │ │ │ │ └── workflowdef │ │ │ │ │ └── SendEmailWorkflow.java │ │ │ │ ├── shipment │ │ │ │ ├── Main.java │ │ │ │ ├── Order.java │ │ │ │ ├── Shipment.java │ │ │ │ ├── ShipmentState.java │ │ │ │ ├── ShipmentWorkers.java │ │ │ │ ├── ShipmentWorkflow.java │ │ │ │ └── User.java │ │ │ │ └── taskdomains │ │ │ │ ├── Main.java │ │ │ │ └── Workers.java │ │ └── io │ │ │ └── orkes │ │ │ └── conductor │ │ │ └── sdk │ │ │ └── examples │ │ │ ├── AuthorizationManagement.java │ │ │ ├── MetadataManagement.java │ │ │ ├── SchedulerManagement.java │ │ │ ├── WorkflowManagement.java │ │ │ ├── WorkflowManagement2.java │ │ │ ├── util │ │ │ └── ClientUtil.java │ │ │ └── workflowops │ │ │ ├── Main.java │ │ │ └── workflowdef │ │ │ └── GreetingsWorkflow.java │ │ └── resources │ │ ├── logback.xml │ │ ├── script.js │ │ ├── task_domain_wf.json │ │ └── workflow.json │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── licenseheader.txt │ ├── orkes-client │ ├── build.gradle │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── orkes │ │ │ └── conductor │ │ │ └── client │ │ │ ├── ApiClient.java │ │ │ ├── AuthorizationClient.java │ │ │ ├── IntegrationClient.java │ │ │ ├── OrkesClients.java │ │ │ ├── PromptClient.java │ │ │ ├── SchedulerClient.java │ │ │ ├── SecretClient.java │ │ │ ├── http │ │ │ ├── ApiCallback.java │ │ │ ├── ApiResponse.java │ │ │ ├── ApplicationResource.java │ │ │ ├── AuthorizationResource.java │ │ │ ├── EventResource.java │ │ │ ├── GroupResource.java │ │ │ ├── IntegrationResource.java │ │ │ ├── MetadataResource.java │ │ │ ├── OrkesAuthentication.java │ │ │ ├── OrkesAuthorizationClient.java │ │ │ ├── OrkesEventClient.java │ │ │ ├── OrkesIntegrationClient.java │ │ │ ├── OrkesMetadataClient.java │ │ │ ├── OrkesPromptClient.java │ │ │ ├── OrkesSchedulerClient.java │ │ │ ├── OrkesSecretClient.java │ │ │ ├── OrkesTaskClient.java │ │ │ ├── OrkesWorkflowClient.java │ │ │ ├── Pair.java │ │ │ ├── SchedulerResource.java │ │ │ ├── SecretResource.java │ │ │ ├── TagsResource.java │ │ │ ├── TokenResource.java │ │ │ ├── UserResource.java │ │ │ ├── WorkflowBulkResource.java │ │ │ └── WorkflowResource.java │ │ │ ├── model │ │ │ ├── AccessKeyResponse.java │ │ │ ├── AccessKeyStatus.java │ │ │ ├── AuthorizationRequest.java │ │ │ ├── ConductorApplication.java │ │ │ ├── ConductorUser.java │ │ │ ├── CorrelationIdsSearchRequest.java │ │ │ ├── CreateAccessKeyResponse.java │ │ │ ├── CreateOrUpdateApplicationRequest.java │ │ │ ├── ExternalStorageLocation.java │ │ │ ├── GenerateTokenRequest.java │ │ │ ├── GrantedAccess.java │ │ │ ├── GrantedAccessResponse.java │ │ │ ├── Group.java │ │ │ ├── Permission.java │ │ │ ├── Role.java │ │ │ ├── SaveScheduleRequest.java │ │ │ ├── SearchResultWorkflowScheduleExecution.java │ │ │ ├── SearchResultWorkflowScheduleExecutionModel.java │ │ │ ├── SearchResultWorkflowSummary.java │ │ │ ├── Subject.java │ │ │ ├── SubjectRef.java │ │ │ ├── Tag.java │ │ │ ├── TagObject.java │ │ │ ├── TagString.java │ │ │ ├── TargetRef.java │ │ │ ├── TaskDetails.java │ │ │ ├── TerminateWorkflow.java │ │ │ ├── TokenResponse.java │ │ │ ├── UpsertGroupRequest.java │ │ │ ├── UpsertUserRequest.java │ │ │ ├── WorkflowRun.java │ │ │ ├── WorkflowSchedule.java │ │ │ ├── WorkflowScheduleExecutionModel.java │ │ │ ├── WorkflowStateUpdate.java │ │ │ ├── WorkflowStatus.java │ │ │ ├── event │ │ │ │ ├── QueueConfiguration.java │ │ │ │ └── QueueWorkerConfiguration.java │ │ │ └── integration │ │ │ │ ├── Category.java │ │ │ │ ├── ConfigKey.java │ │ │ │ ├── Integration.java │ │ │ │ ├── IntegrationApi.java │ │ │ │ ├── IntegrationApiUpdate.java │ │ │ │ ├── IntegrationDef.java │ │ │ │ ├── IntegrationDefFormField.java │ │ │ │ ├── IntegrationUpdate.java │ │ │ │ ├── PromptTemplateTestRequest.java │ │ │ │ └── ai │ │ │ │ ├── ChatCompletion.java │ │ │ │ ├── ChatMessage.java │ │ │ │ ├── EmbeddingRequest.java │ │ │ │ ├── IndexDocInput.java │ │ │ │ ├── IndexedDoc.java │ │ │ │ ├── LLMResponse.java │ │ │ │ ├── LLMWorkerInput.java │ │ │ │ ├── PromptTemplate.java │ │ │ │ ├── PromptTemplateTestRequest.java │ │ │ │ ├── StoreEmbeddingsInput.java │ │ │ │ ├── TextCompletion.java │ │ │ │ └── VectorDBInput.java │ │ │ └── worker │ │ │ ├── WorkerFn.java │ │ │ └── Workers.java │ │ └── test │ │ ├── java │ │ └── io │ │ │ └── orkes │ │ │ └── conductor │ │ │ └── client │ │ │ ├── model │ │ │ ├── TestAuthorizationRequestPojoMethods.java │ │ │ ├── TestConductorApplicationPojoMethods.java │ │ │ ├── TestConductorUserPojoMethods.java │ │ │ ├── TestCreateAccessKeyResponsePojoMethods.java │ │ │ ├── TestCreateOrUpdateApplicationRequestPojoMethods.java │ │ │ ├── TestExternalStorageLocationPojoMethods.java │ │ │ ├── TestGrantedAccessPojoMethods.java │ │ │ ├── TestGrantedAccessResponsePojoMethods.java │ │ │ ├── TestGroupPojoMethods.java │ │ │ ├── TestPermissionPojoMethods.java │ │ │ ├── TestRolePojoMethods.java │ │ │ ├── TestSaveScheduleRequestPojoMethods.java │ │ │ ├── TestSerDerAccessKeyResponse.java │ │ │ ├── TestSerDerAuthorizationRequest.java │ │ │ ├── TestSerDerConductorApplication.java │ │ │ ├── TestSerDerConductorUser.java │ │ │ ├── TestSerDerCorrelationIdsSearchRequest.java │ │ │ ├── TestSerDerCreateAccessKeyResponse.java │ │ │ ├── TestSerDerCreateOrUpdateApplicationRequest.java │ │ │ ├── TestSerDerExternalStorageLocation.java │ │ │ ├── TestSerDerGenerateTokenRequest.java │ │ │ ├── TestSerDerGrantedAccess.java │ │ │ ├── TestSerDerGrantedAccessResponse.java │ │ │ ├── TestSerDerGroup.java │ │ │ ├── TestSerDerPermission.java │ │ │ ├── TestSerDerRole.java │ │ │ ├── TestSerDerSaveScheduleRequest.java │ │ │ ├── TestSerDerSubject.java │ │ │ ├── TestSerDerSubjectRef.java │ │ │ ├── TestSerDerTargetRef.java │ │ │ ├── TestSerDerTaskDetails.java │ │ │ ├── TestSerDerTerminateWorkflow.java │ │ │ ├── TestSerDerTokenResponse.java │ │ │ ├── TestSerDerUpsertGroupRequest.java │ │ │ ├── TestSerDerUpsertUserRequest.java │ │ │ ├── TestSerDerWorkflowSchedule.java │ │ │ ├── TestSerDerWorkflowScheduleExecutionModel.java │ │ │ ├── TestSerDerWorkflowStateUpdate.java │ │ │ ├── TestSerDerWorkflowStatus.java │ │ │ ├── TestSubjectPojoMethods.java │ │ │ ├── TestSubjectRefPojoMethods.java │ │ │ ├── TestTargetRefPojoMethods.java │ │ │ ├── TestTaskDetailsPojoMethods.java │ │ │ ├── TestTerminateWorkflowPojoMethods.java │ │ │ ├── TestUpsertGroupRequestPojoMethods.java │ │ │ ├── TestUpsertUserRequestPojoMethods.java │ │ │ ├── TestWorkflowScheduleExecutionModelPojoMethods.java │ │ │ ├── TestWorkflowSchedulePojoMethods.java │ │ │ ├── TestWorkflowStatusPojoMethods.java │ │ │ └── integration │ │ │ │ ├── TestSerDePromptTemplateTestRequest.java │ │ │ │ ├── TestSerDerIntegration.java │ │ │ │ ├── TestSerDerIntegrationApi.java │ │ │ │ ├── TestSerDerIntegrationApiUpdate.java │ │ │ │ ├── TestSerDerIntegrationDef.java │ │ │ │ ├── TestSerDerIntegrationUpdate.java │ │ │ │ └── ai │ │ │ │ ├── TestIndexDocInputPojoMethods.java │ │ │ │ ├── TestIndexedDocPojoMethods.java │ │ │ │ ├── TestSerDerChatCompletion.java │ │ │ │ ├── TestSerDerChatMessage.java │ │ │ │ ├── TestSerDerEmbeddingRequest.java │ │ │ │ ├── TestSerDerIndexDocInput.java │ │ │ │ ├── TestSerDerIndexedDoc.java │ │ │ │ ├── TestSerDerLLMResponse.java │ │ │ │ ├── TestSerDerLLMWorkerInput.java │ │ │ │ ├── TestSerDerPromptTemplateTestRequest.java │ │ │ │ ├── TestSerDerStoreEmbeddingsInput.java │ │ │ │ ├── TestSerDerTextCompletion.java │ │ │ │ └── TestSerDerVectorDBInput.java │ │ │ └── util │ │ │ └── JsonTemplateSerDeserResolverUtil.java │ │ └── resources │ │ └── ser_deser_json_string.json │ ├── orkes-spring │ ├── build.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── orkes │ │ │ └── conductor │ │ │ └── client │ │ │ └── spring │ │ │ ├── OrkesClientProperties.java │ │ │ └── OrkesConductorClientAutoConfiguration.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── sdk │ ├── README.md │ ├── build.gradle │ ├── src │ │ ├── main │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── netflix │ │ │ │ └── conductor │ │ │ │ └── sdk │ │ │ │ ├── healthcheck │ │ │ │ └── HealthCheckClient.java │ │ │ │ ├── testing │ │ │ │ ├── LocalServerRunner.java │ │ │ │ └── WorkflowTestRunner.java │ │ │ │ └── workflow │ │ │ │ ├── def │ │ │ │ ├── ConductorWorkflow.java │ │ │ │ ├── ValidationError.java │ │ │ │ ├── WorkflowBuilder.java │ │ │ │ └── tasks │ │ │ │ │ ├── DoWhile.java │ │ │ │ │ ├── Dynamic.java │ │ │ │ │ ├── DynamicFork.java │ │ │ │ │ ├── DynamicForkInput.java │ │ │ │ │ ├── Event.java │ │ │ │ │ ├── ForkJoin.java │ │ │ │ │ ├── Http.java │ │ │ │ │ ├── JQ.java │ │ │ │ │ ├── Javascript.java │ │ │ │ │ ├── Join.java │ │ │ │ │ ├── SetVariable.java │ │ │ │ │ ├── SimpleTask.java │ │ │ │ │ ├── SubWorkflow.java │ │ │ │ │ ├── Switch.java │ │ │ │ │ ├── Task.java │ │ │ │ │ ├── TaskRegistry.java │ │ │ │ │ ├── Terminate.java │ │ │ │ │ └── Wait.java │ │ │ │ ├── executor │ │ │ │ ├── WorkflowExecutor.java │ │ │ │ └── task │ │ │ │ │ ├── AnnotatedWorker.java │ │ │ │ │ ├── AnnotatedWorkerExecutor.java │ │ │ │ │ ├── DynamicForkWorker.java │ │ │ │ │ ├── NonRetryableException.java │ │ │ │ │ ├── TaskContext.java │ │ │ │ │ └── WorkerConfiguration.java │ │ │ │ ├── task │ │ │ │ ├── InputParam.java │ │ │ │ ├── OutputParam.java │ │ │ │ ├── WorkerTask.java │ │ │ │ └── WorkflowInstanceIdInputParam.java │ │ │ │ └── utils │ │ │ │ ├── InputOutputGetter.java │ │ │ │ └── MapBuilder.java │ │ └── test │ │ │ ├── java │ │ │ └── com │ │ │ │ └── netflix │ │ │ │ └── conductor │ │ │ │ └── sdk │ │ │ │ └── workflow │ │ │ │ ├── def │ │ │ │ ├── TaskConversionsTests.java │ │ │ │ ├── WorkflowCreationTests.java │ │ │ │ ├── WorkflowDefTaskTests.java │ │ │ │ └── WorkflowState.java │ │ │ │ ├── executor │ │ │ │ └── task │ │ │ │ │ ├── AnnotatedWorkerTests.java │ │ │ │ │ ├── Bike.java │ │ │ │ │ ├── Car.java │ │ │ │ │ ├── CarWorker.java │ │ │ │ │ └── TestWorkerConfig.java │ │ │ │ └── testing │ │ │ │ ├── Task1Input.java │ │ │ │ ├── TestWorkflowInput.java │ │ │ │ └── WorkflowTestFrameworkTests.java │ │ │ └── resources │ │ │ ├── application-integrationtest.properties │ │ │ ├── log4j2.xml │ │ │ ├── script.js │ │ │ ├── simple_workflow.json │ │ │ ├── tasks.json │ │ │ └── test-server.properties │ ├── testing_framework.md │ ├── worker_sdk.md │ └── workflow_sdk.md │ ├── settings.gradle │ ├── tests │ ├── build.gradle │ └── src │ │ └── test │ │ ├── java │ │ └── io │ │ │ └── orkes │ │ │ └── conductor │ │ │ ├── client │ │ │ ├── ApiClientTest.java │ │ │ ├── LoadTestWorker.java │ │ │ ├── LocalWorkerTest.java │ │ │ ├── WorkflowRetryTest.java │ │ │ ├── http │ │ │ │ ├── AuthorizationClientTests.java │ │ │ │ ├── EventClientTests.java │ │ │ │ ├── MetadataClientTests.java │ │ │ │ ├── PathSuffixTest.java │ │ │ │ ├── SchedulerClientTests.java │ │ │ │ ├── SecretClientTests.java │ │ │ │ ├── TaskClientTests.java │ │ │ │ ├── WorkflowClientTests.java │ │ │ │ └── WorkflowStateUpdateTests.java │ │ │ ├── util │ │ │ │ ├── ClientTestUtil.java │ │ │ │ ├── Commons.java │ │ │ │ ├── SimpleWorker.java │ │ │ │ ├── TestUtil.java │ │ │ │ └── WorkflowUtil.java │ │ │ └── worker │ │ │ │ ├── LocalServerWorkflowExecutionTests.java │ │ │ │ └── WorkflowExecutionTests.java │ │ │ └── sdk │ │ │ └── WorkflowSDKTests.java │ │ └── resources │ │ ├── application.properties │ │ ├── logback-test.xml │ │ ├── metadata │ │ ├── sub_workflow_tests.json │ │ └── workflows.json │ │ ├── sample_tasks.json │ │ ├── sample_workflow.json │ │ └── sdk_test.json │ └── versions.gradle ├── core ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ ├── annotations │ │ │ ├── Audit.java │ │ │ ├── Trace.java │ │ │ └── VisibleForTesting.java │ │ │ ├── core │ │ │ ├── LifecycleAwareComponent.java │ │ │ ├── WorkflowContext.java │ │ │ ├── config │ │ │ │ ├── ConductorCoreConfiguration.java │ │ │ │ ├── ConductorProperties.java │ │ │ │ └── SchedulerConfiguration.java │ │ │ ├── dal │ │ │ │ └── ExecutionDAOFacade.java │ │ │ ├── events │ │ │ │ ├── ActionProcessor.java │ │ │ │ ├── DefaultEventProcessor.java │ │ │ │ ├── DefaultEventQueueManager.java │ │ │ │ ├── EventQueueManager.java │ │ │ │ ├── EventQueueProvider.java │ │ │ │ ├── EventQueues.java │ │ │ │ ├── ScriptEvaluator.java │ │ │ │ ├── SimpleActionProcessor.java │ │ │ │ └── queue │ │ │ │ │ ├── ConductorEventQueueProvider.java │ │ │ │ │ ├── ConductorObservableQueue.java │ │ │ │ │ ├── DefaultEventQueueProcessor.java │ │ │ │ │ ├── Message.java │ │ │ │ │ └── ObservableQueue.java │ │ │ ├── exception │ │ │ │ ├── ConflictException.java │ │ │ │ ├── NonTransientException.java │ │ │ │ ├── NotFoundException.java │ │ │ │ ├── TerminateWorkflowException.java │ │ │ │ └── TransientException.java │ │ │ ├── execution │ │ │ │ ├── AsyncSystemTaskExecutor.java │ │ │ │ ├── DeciderService.java │ │ │ │ ├── StartWorkflowInput.java │ │ │ │ ├── WorkflowExecutor.java │ │ │ │ ├── WorkflowExecutorOps.java │ │ │ │ ├── evaluators │ │ │ │ │ ├── Evaluator.java │ │ │ │ │ ├── JavascriptEvaluator.java │ │ │ │ │ ├── PythonEvaluator.java │ │ │ │ │ └── ValueParamEvaluator.java │ │ │ │ ├── mapper │ │ │ │ │ ├── DecisionTaskMapper.java │ │ │ │ │ ├── DoWhileTaskMapper.java │ │ │ │ │ ├── DynamicTaskMapper.java │ │ │ │ │ ├── EventTaskMapper.java │ │ │ │ │ ├── ExclusiveJoinTaskMapper.java │ │ │ │ │ ├── ForkJoinDynamicTaskMapper.java │ │ │ │ │ ├── ForkJoinTaskMapper.java │ │ │ │ │ ├── HTTPTaskMapper.java │ │ │ │ │ ├── HumanTaskMapper.java │ │ │ │ │ ├── InlineTaskMapper.java │ │ │ │ │ ├── JoinTaskMapper.java │ │ │ │ │ ├── JsonJQTransformTaskMapper.java │ │ │ │ │ ├── KafkaPublishTaskMapper.java │ │ │ │ │ ├── LambdaTaskMapper.java │ │ │ │ │ ├── NoopTaskMapper.java │ │ │ │ │ ├── SetVariableTaskMapper.java │ │ │ │ │ ├── SimpleTaskMapper.java │ │ │ │ │ ├── StartWorkflowTaskMapper.java │ │ │ │ │ ├── SubWorkflowTaskMapper.java │ │ │ │ │ ├── SwitchTaskMapper.java │ │ │ │ │ ├── TaskMapper.java │ │ │ │ │ ├── TaskMapperContext.java │ │ │ │ │ ├── TerminateTaskMapper.java │ │ │ │ │ ├── UserDefinedTaskMapper.java │ │ │ │ │ └── WaitTaskMapper.java │ │ │ │ └── tasks │ │ │ │ │ ├── Decision.java │ │ │ │ │ ├── DoWhile.java │ │ │ │ │ ├── Event.java │ │ │ │ │ ├── ExclusiveJoin.java │ │ │ │ │ ├── ExecutionConfig.java │ │ │ │ │ ├── Fork.java │ │ │ │ │ ├── Human.java │ │ │ │ │ ├── Inline.java │ │ │ │ │ ├── IsolatedTaskQueueProducer.java │ │ │ │ │ ├── Join.java │ │ │ │ │ ├── Lambda.java │ │ │ │ │ ├── Noop.java │ │ │ │ │ ├── SetVariable.java │ │ │ │ │ ├── StartWorkflow.java │ │ │ │ │ ├── SubWorkflow.java │ │ │ │ │ ├── Switch.java │ │ │ │ │ ├── SystemTaskRegistry.java │ │ │ │ │ ├── SystemTaskWorker.java │ │ │ │ │ ├── SystemTaskWorkerCoordinator.java │ │ │ │ │ ├── Terminate.java │ │ │ │ │ ├── Wait.java │ │ │ │ │ └── WorkflowSystemTask.java │ │ │ ├── index │ │ │ │ ├── NoopIndexDAO.java │ │ │ │ └── NoopIndexDAOConfiguration.java │ │ │ ├── listener │ │ │ │ ├── TaskStatusListener.java │ │ │ │ ├── TaskStatusListenerStub.java │ │ │ │ ├── WorkflowStatusListener.java │ │ │ │ └── WorkflowStatusListenerStub.java │ │ │ ├── metadata │ │ │ │ └── MetadataMapperService.java │ │ │ ├── reconciliation │ │ │ │ ├── WorkflowReconciler.java │ │ │ │ ├── WorkflowRepairService.java │ │ │ │ └── WorkflowSweeper.java │ │ │ ├── storage │ │ │ │ └── DummyPayloadStorage.java │ │ │ ├── sync │ │ │ │ ├── Lock.java │ │ │ │ ├── local │ │ │ │ │ ├── LocalOnlyLock.java │ │ │ │ │ └── LocalOnlyLockConfiguration.java │ │ │ │ └── noop │ │ │ │ │ └── NoopLock.java │ │ │ └── utils │ │ │ │ ├── DateTimeUtils.java │ │ │ │ ├── ExternalPayloadStorageUtils.java │ │ │ │ ├── IDGenerator.java │ │ │ │ ├── JsonUtils.java │ │ │ │ ├── ParametersUtils.java │ │ │ │ ├── QueueUtils.java │ │ │ │ ├── SemaphoreUtil.java │ │ │ │ └── Utils.java │ │ │ ├── dao │ │ │ ├── ConcurrentExecutionLimitDAO.java │ │ │ ├── EventHandlerDAO.java │ │ │ ├── ExecutionDAO.java │ │ │ ├── IndexDAO.java │ │ │ ├── MetadataDAO.java │ │ │ ├── PollDataDAO.java │ │ │ ├── QueueDAO.java │ │ │ └── RateLimitingDAO.java │ │ │ ├── metrics │ │ │ ├── Monitors.java │ │ │ └── WorkflowMonitor.java │ │ │ ├── model │ │ │ ├── TaskModel.java │ │ │ └── WorkflowModel.java │ │ │ ├── service │ │ │ ├── AdminService.java │ │ │ ├── AdminServiceImpl.java │ │ │ ├── EventService.java │ │ │ ├── EventServiceImpl.java │ │ │ ├── ExecutionLockService.java │ │ │ ├── ExecutionService.java │ │ │ ├── MetadataService.java │ │ │ ├── MetadataServiceImpl.java │ │ │ ├── TaskService.java │ │ │ ├── TaskServiceImpl.java │ │ │ ├── WorkflowBulkService.java │ │ │ ├── WorkflowBulkServiceImpl.java │ │ │ ├── WorkflowService.java │ │ │ ├── WorkflowServiceImpl.java │ │ │ └── WorkflowTestService.java │ │ │ └── validations │ │ │ ├── ValidationContext.java │ │ │ └── WorkflowTaskTypeConstraint.java │ └── resources │ │ └── META-INF │ │ ├── additional-spring-configuration-metadata.json │ │ ├── validation.xml │ │ └── validation │ │ └── constraints.xml │ └── test │ ├── groovy │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── core │ │ └── execution │ │ │ ├── AsyncSystemTaskExecutorTest.groovy │ │ │ └── tasks │ │ │ ├── DoWhileSpec.groovy │ │ │ ├── EventSpec.groovy │ │ │ ├── IsolatedTaskQueueProducerSpec.groovy │ │ │ └── StartWorkflowSpec.groovy │ │ └── model │ │ ├── TaskModelSpec.groovy │ │ └── WorkflowModelSpec.groovy │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── TestUtils.java │ │ ├── core │ │ ├── dal │ │ │ └── ExecutionDAOFacadeTest.java │ │ ├── events │ │ │ ├── MockObservableQueue.java │ │ │ ├── MockQueueProvider.java │ │ │ ├── TestDefaultEventProcessor.java │ │ │ ├── TestScriptEval.java │ │ │ └── TestSimpleActionProcessor.java │ │ ├── execution │ │ │ ├── TestDeciderOutcomes.java │ │ │ ├── TestDeciderService.java │ │ │ ├── TestWorkflowDef.java │ │ │ ├── TestWorkflowExecutor.java │ │ │ ├── WorkflowSystemTaskStub.java │ │ │ ├── mapper │ │ │ │ ├── DecisionTaskMapperTest.java │ │ │ │ ├── DoWhileTaskMapperTest.java │ │ │ │ ├── DynamicTaskMapperTest.java │ │ │ │ ├── EventTaskMapperTest.java │ │ │ │ ├── ForkJoinDynamicTaskMapperTest.java │ │ │ │ ├── ForkJoinTaskMapperTest.java │ │ │ │ ├── HTTPTaskMapperTest.java │ │ │ │ ├── HumanTaskMapperTest.java │ │ │ │ ├── InlineTaskMapperTest.java │ │ │ │ ├── JoinTaskMapperTest.java │ │ │ │ ├── JsonJQTransformTaskMapperTest.java │ │ │ │ ├── KafkaPublishTaskMapperTest.java │ │ │ │ ├── LambdaTaskMapperTest.java │ │ │ │ ├── NoopTaskMapperTest.java │ │ │ │ ├── SetVariableTaskMapperTest.java │ │ │ │ ├── SimpleTaskMapperTest.java │ │ │ │ ├── SubWorkflowTaskMapperTest.java │ │ │ │ ├── SwitchTaskMapperTest.java │ │ │ │ ├── TerminateTaskMapperTest.java │ │ │ │ ├── UserDefinedTaskMapperTest.java │ │ │ │ └── WaitTaskMapperTest.java │ │ │ └── tasks │ │ │ │ ├── EventQueueResolutionTest.java │ │ │ │ ├── InlineTest.java │ │ │ │ ├── TestJoin.java │ │ │ │ ├── TestLambda.java │ │ │ │ ├── TestNoop.java │ │ │ │ ├── TestSubWorkflow.java │ │ │ │ ├── TestSystemTaskWorker.java │ │ │ │ ├── TestSystemTaskWorkerCoordinator.java │ │ │ │ └── TestTerminate.java │ │ ├── metadata │ │ │ └── MetadataMapperServiceTest.java │ │ ├── reconciliation │ │ │ ├── TestWorkflowRepairService.java │ │ │ └── TestWorkflowSweeper.java │ │ ├── storage │ │ │ └── DummyPayloadStorageTest.java │ │ ├── sync │ │ │ └── local │ │ │ │ └── LocalOnlyLockTest.java │ │ └── utils │ │ │ ├── DateTimeUtilsTest.java │ │ │ ├── ExternalPayloadStorageUtilsTest.java │ │ │ ├── JsonUtilsTest.java │ │ │ ├── ParametersUtilsTest.java │ │ │ ├── QueueUtilsTest.java │ │ │ └── SemaphoreUtilTest.java │ │ ├── dao │ │ ├── ExecutionDAOTest.java │ │ └── PollDataDAOTest.java │ │ ├── metrics │ │ └── WorkflowMonitorTest.java │ │ ├── service │ │ ├── EventServiceTest.java │ │ ├── ExecutionServiceTest.java │ │ ├── MetadataServiceTest.java │ │ ├── TaskServiceTest.java │ │ ├── WorkflowBulkServiceTest.java │ │ └── WorkflowServiceTest.java │ │ └── validations │ │ ├── WorkflowDefConstraintTest.java │ │ └── WorkflowTaskTypeConstraintTest.java │ └── resources │ ├── completed.json │ ├── conditional_flow.json │ ├── conditional_flow_with_switch.json │ ├── payload.json │ └── test.json ├── dependencies.gradle ├── deploy.gradle ├── docker ├── README.md ├── ci │ └── Dockerfile ├── docker-compose-mysql.yaml ├── docker-compose-postgres-es7.yaml ├── docker-compose-postgres.yaml ├── docker-compose-redis-os.yaml ├── docker-compose.yaml ├── server │ ├── Dockerfile │ ├── bin │ │ └── startup.sh │ ├── config │ │ ├── config-mysql.properties │ │ ├── config-postgres-es7.properties │ │ ├── config-postgres.properties │ │ ├── config-redis-os.properties │ │ ├── config-redis.properties │ │ ├── config.properties │ │ ├── log4j-file-appender.properties │ │ ├── log4j.properties │ │ └── redis.conf │ └── nginx │ │ └── nginx.conf └── ui │ ├── Dockerfile │ └── README.md ├── docs ├── assets │ └── images │ │ └── favicon.png ├── css │ └── custom.css ├── devguide │ ├── architecture │ │ ├── PollTimeoutSeconds.png │ │ ├── ResponseTimeoutSeconds.png │ │ ├── TaskFailure.png │ │ ├── TimeoutSeconds.png │ │ ├── conductor-architecture.png │ │ ├── dag_workflow.png │ │ ├── dag_workflow2.png │ │ ├── directed-acyclic-graph.md │ │ ├── directed_graph.png │ │ ├── index.md │ │ ├── overview.png │ │ ├── pirate_graph.gif │ │ ├── regular_graph.png │ │ ├── task_states.png │ │ ├── tasklifecycle.md │ │ └── technicaldetails.md │ ├── bestpractices.md │ ├── concepts │ │ ├── index.md │ │ ├── tasks.md │ │ ├── why.md │ │ ├── workers.md │ │ └── workflows.md │ ├── faq.md │ ├── how-tos │ │ ├── Monitoring │ │ │ └── Conductor-LogLevel.md │ │ ├── Tasks │ │ │ ├── creating-tasks.md │ │ │ ├── dynamic-vs-switch-tasks.md │ │ │ ├── extending-system-tasks.md │ │ │ ├── monitoring-task-queues.md │ │ │ ├── reusing-tasks.md │ │ │ ├── task-configurations.md │ │ │ ├── task-inputs.md │ │ │ ├── task-timeouts.md │ │ │ └── updating-tasks.md │ │ ├── Workers │ │ │ ├── build-a-golang-task-worker.md │ │ │ ├── build-a-java-task-worker.md │ │ │ ├── build-a-python-task-worker.md │ │ │ └── scaling-workers.md │ │ └── Workflows │ │ │ ├── debugging-workflows.md │ │ │ ├── handling-errors.md │ │ │ ├── searching-workflows.md │ │ │ ├── starting-workflows.md │ │ │ ├── updating-workflows.md │ │ │ ├── versioning-workflows.md │ │ │ ├── view-workflow-executions.md │ │ │ ├── workflow_debugging.png │ │ │ ├── workflow_execution_view.png │ │ │ └── workflow_task_fail.png │ ├── labs │ │ ├── eventhandlers.md │ │ ├── first-workflow.md │ │ ├── img │ │ │ ├── EventHandlerCycle.png │ │ │ ├── bgnr_complete_workflow.png │ │ │ ├── bgnr_state_scheduled.png │ │ │ └── bgnr_systask_state.png │ │ ├── index.md │ │ ├── kitchensink.md │ │ ├── kitchensink.png │ │ ├── metadataWorkflowPost.png │ │ ├── metadataWorkflowRun.png │ │ ├── uiWorkflowDefinition.png │ │ ├── uiWorkflowDefinitionVisual.png │ │ ├── workflowLoaded.png │ │ └── workflowRunIdCopy.png │ └── running │ │ ├── conductorUI.png │ │ ├── docker.md │ │ ├── hosted.md │ │ ├── source.md │ │ └── swagger.png ├── documentation │ ├── advanced │ │ ├── annotation-processor.md │ │ ├── archival-of-workflows.md │ │ ├── azureblob-storage.md │ │ ├── extend.md │ │ ├── externalpayloadstorage.md │ │ ├── isolationgroups.md │ │ ├── postgresql.md │ │ └── redis.md │ ├── api │ │ ├── index.md │ │ ├── metadata.md │ │ ├── startworkflow.md │ │ ├── task.md │ │ ├── taskdomains.md │ │ └── workflow.md │ ├── clientsdks │ │ ├── clojure-sdk.md │ │ ├── csharp-sdk.md │ │ ├── go-sdk.md │ │ ├── index.md │ │ ├── java-sdk.md │ │ ├── js-sdk.md │ │ └── python-sdk.md │ ├── configuration │ │ ├── appconf.md │ │ ├── eventhandlers.md │ │ ├── taskdef.md │ │ └── workflowdef │ │ │ ├── index.md │ │ │ ├── operators │ │ │ ├── ShippingWorkflow.png │ │ │ ├── ShippingWorkflowRunning.png │ │ │ ├── ShippingWorkflowUPS.png │ │ │ ├── Switch_Fedex.png │ │ │ ├── Terminate_Task.png │ │ │ ├── do-while-task.md │ │ │ ├── dynamic-fork-task.md │ │ │ ├── dynamic-task-diagram.png │ │ │ ├── dynamic-task.md │ │ │ ├── fork-task-diagram.png │ │ │ ├── fork-task.md │ │ │ ├── index.md │ │ │ ├── join-task.md │ │ │ ├── set-variable-task.md │ │ │ ├── start-workflow-task.md │ │ │ ├── sub-workflow-task.md │ │ │ ├── subworkflow_diagram.png │ │ │ ├── switch-task.md │ │ │ ├── terminate-task.md │ │ │ └── workflow_fork.png │ │ │ └── systemtasks │ │ │ ├── event-task.md │ │ │ ├── http-task.md │ │ │ ├── human-task.md │ │ │ ├── index.md │ │ │ ├── inline-task.md │ │ │ ├── json-jq-transform-task.md │ │ │ ├── kafka-publish-task.md │ │ │ └── wait-task.md │ └── metrics │ │ ├── client.md │ │ └── server.md ├── home │ ├── devex.png │ ├── icons │ │ ├── brackets.svg │ │ ├── conductor.svg │ │ ├── modular.svg │ │ ├── network.svg │ │ ├── osi.svg │ │ ├── server.svg │ │ ├── shield.svg │ │ └── wrench.svg │ ├── redirect.html │ ├── timeline.png │ └── workflow.svg ├── img │ └── logo.svg ├── index.md ├── overrides │ └── partials │ │ └── logo.html └── resources │ ├── contributing.md │ ├── license.md │ └── related.md ├── es6-persistence ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── es6 │ │ │ ├── config │ │ │ ├── ElasticSearchConditions.java │ │ │ ├── ElasticSearchProperties.java │ │ │ ├── ElasticSearchV6Configuration.java │ │ │ ├── IsHttpProtocol.java │ │ │ └── IsTcpProtocol.java │ │ │ └── dao │ │ │ ├── index │ │ │ ├── BulkRequestBuilderWrapper.java │ │ │ ├── BulkRequestWrapper.java │ │ │ ├── ElasticSearchBaseDAO.java │ │ │ ├── ElasticSearchDAOV6.java │ │ │ └── ElasticSearchRestDAOV6.java │ │ │ └── query │ │ │ └── parser │ │ │ ├── Expression.java │ │ │ ├── FilterProvider.java │ │ │ ├── GroupedExpression.java │ │ │ ├── NameValue.java │ │ │ └── internal │ │ │ ├── AbstractNode.java │ │ │ ├── BooleanOp.java │ │ │ ├── ComparisonOp.java │ │ │ ├── ConstValue.java │ │ │ ├── FunctionThrowingException.java │ │ │ ├── ListConst.java │ │ │ ├── Name.java │ │ │ ├── ParserException.java │ │ │ └── Range.java │ └── resources │ │ ├── mappings_docType_task.json │ │ ├── mappings_docType_workflow.json │ │ ├── template_event.json │ │ ├── template_message.json │ │ └── template_task_log.json │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── es6 │ │ ├── dao │ │ ├── index │ │ │ ├── ElasticSearchDaoBaseTest.java │ │ │ ├── ElasticSearchRestDaoBaseTest.java │ │ │ ├── ElasticSearchTest.java │ │ │ ├── TestElasticSearchDAOV6.java │ │ │ ├── TestElasticSearchDAOV6Batch.java │ │ │ ├── TestElasticSearchRestDAOV6.java │ │ │ └── TestElasticSearchRestDAOV6Batch.java │ │ └── query │ │ │ └── parser │ │ │ ├── TestExpression.java │ │ │ └── internal │ │ │ ├── TestAbstractParser.java │ │ │ ├── TestBooleanOp.java │ │ │ ├── TestComparisonOp.java │ │ │ ├── TestConstValue.java │ │ │ └── TestName.java │ │ └── utils │ │ └── TestUtils.java │ └── resources │ ├── expected_template_task_log.json │ ├── task_summary.json │ └── workflow_summary.json ├── es7-persistence ├── README.md ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── es7 │ │ │ ├── config │ │ │ ├── ElasticSearchConditions.java │ │ │ ├── ElasticSearchProperties.java │ │ │ └── ElasticSearchV7Configuration.java │ │ │ └── dao │ │ │ ├── index │ │ │ ├── BulkRequestBuilderWrapper.java │ │ │ ├── BulkRequestWrapper.java │ │ │ ├── ElasticSearchBaseDAO.java │ │ │ └── ElasticSearchRestDAOV7.java │ │ │ └── query │ │ │ └── parser │ │ │ ├── Expression.java │ │ │ ├── FilterProvider.java │ │ │ ├── GroupedExpression.java │ │ │ ├── NameValue.java │ │ │ └── internal │ │ │ ├── AbstractNode.java │ │ │ ├── BooleanOp.java │ │ │ ├── ComparisonOp.java │ │ │ ├── ConstValue.java │ │ │ ├── FunctionThrowingException.java │ │ │ ├── ListConst.java │ │ │ ├── Name.java │ │ │ ├── ParserException.java │ │ │ └── Range.java │ └── resources │ │ ├── mappings_docType_task.json │ │ ├── mappings_docType_workflow.json │ │ ├── template_event.json │ │ ├── template_message.json │ │ └── template_task_log.json │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── es7 │ │ ├── dao │ │ ├── index │ │ │ ├── ElasticSearchRestDaoBaseTest.java │ │ │ ├── ElasticSearchTest.java │ │ │ ├── TestBulkRequestBuilderWrapper.java │ │ │ ├── TestElasticSearchRestDAOV7.java │ │ │ └── TestElasticSearchRestDAOV7Batch.java │ │ └── query │ │ │ └── parser │ │ │ ├── TestExpression.java │ │ │ ├── TestGroupedExpression.java │ │ │ └── internal │ │ │ ├── AbstractParserTest.java │ │ │ ├── TestBooleanOp.java │ │ │ ├── TestComparisonOp.java │ │ │ ├── TestConstValue.java │ │ │ └── TestName.java │ │ └── utils │ │ └── TestUtils.java │ └── resources │ ├── expected_template_task_log.json │ ├── task_summary.json │ └── workflow_summary.json ├── family.properties ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── grpc-client ├── README.md ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ └── grpc │ │ ├── ClientBase.java │ │ ├── EventClient.java │ │ ├── MetadataClient.java │ │ ├── TaskClient.java │ │ └── WorkflowClient.java │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── client │ │ └── grpc │ │ ├── EventClientTest.java │ │ ├── TaskClientTest.java │ │ └── WorkflowClientTest.java │ └── resources │ └── mockito-extensions │ └── org.mockito.plugins.MockMaker ├── grpc-server ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── grpc │ │ └── server │ │ ├── GRPCServer.java │ │ ├── GRPCServerProperties.java │ │ ├── GrpcConfiguration.java │ │ └── service │ │ ├── EventServiceImpl.java │ │ ├── GRPCHelper.java │ │ ├── HealthServiceImpl.java │ │ ├── MetadataServiceImpl.java │ │ ├── TaskServiceImpl.java │ │ └── WorkflowServiceImpl.java │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── grpc │ │ └── server │ │ └── service │ │ ├── HealthServiceImplTest.java │ │ ├── TaskServiceImplTest.java │ │ └── WorkflowServiceImplTest.java │ └── resources │ └── log4j.properties ├── grpc ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── grpc │ │ │ ├── AbstractProtoMapper.java │ │ │ └── ProtoMapper.java │ └── proto │ │ ├── grpc │ │ ├── event_service.proto │ │ ├── metadata_service.proto │ │ ├── search.proto │ │ ├── task_service.proto │ │ └── workflow_service.proto │ │ └── model │ │ ├── dynamicforkjointask.proto │ │ ├── dynamicforkjointasklist.proto │ │ ├── eventexecution.proto │ │ ├── eventhandler.proto │ │ ├── polldata.proto │ │ ├── ratelimitconfig.proto │ │ ├── rerunworkflowrequest.proto │ │ ├── schemadef.proto │ │ ├── skiptaskrequest.proto │ │ ├── startworkflowrequest.proto │ │ ├── statechangeevent.proto │ │ ├── subworkflowparams.proto │ │ ├── task.proto │ │ ├── taskdef.proto │ │ ├── taskexeclog.proto │ │ ├── taskresult.proto │ │ ├── tasksummary.proto │ │ ├── upgradeworkflowrequest.proto │ │ ├── workflow.proto │ │ ├── workflowdef.proto │ │ ├── workflowdefsummary.proto │ │ ├── workflowsummary.proto │ │ └── workflowtask.proto │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── grpc │ └── TestProtoMapper.java ├── http-task ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── tasks │ │ │ └── http │ │ │ ├── HttpTask.java │ │ │ └── providers │ │ │ ├── DefaultRestTemplateProvider.java │ │ │ └── RestTemplateProvider.java │ └── resources │ │ └── META-INF │ │ └── additional-spring-configuration-metadata.json │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── tasks │ └── http │ ├── HttpTaskTest.java │ └── providers │ └── DefaultRestTemplateProviderTest.java ├── java-sdk ├── README.md ├── build.gradle ├── example │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── sdk │ │ │ └── example │ │ │ └── shipment │ │ │ ├── Order.java │ │ │ ├── Shipment.java │ │ │ ├── ShipmentState.java │ │ │ ├── ShipmentWorkers.java │ │ │ ├── ShipmentWorkflow.java │ │ │ └── User.java │ └── resources │ │ └── script.js ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── netflix │ │ │ │ └── conductor │ │ │ │ └── sdk │ │ │ │ ├── healthcheck │ │ │ │ └── HealthCheckClient.java │ │ │ │ ├── testing │ │ │ │ ├── LocalServerRunner.java │ │ │ │ └── WorkflowTestRunner.java │ │ │ │ └── workflow │ │ │ │ ├── def │ │ │ │ ├── ConductorWorkflow.java │ │ │ │ ├── ValidationError.java │ │ │ │ ├── WorkflowBuilder.java │ │ │ │ └── tasks │ │ │ │ │ ├── DoWhile.java │ │ │ │ │ ├── Dynamic.java │ │ │ │ │ ├── DynamicFork.java │ │ │ │ │ ├── DynamicForkInput.java │ │ │ │ │ ├── Event.java │ │ │ │ │ ├── ForkJoin.java │ │ │ │ │ ├── Http.java │ │ │ │ │ ├── JQ.java │ │ │ │ │ ├── Javascript.java │ │ │ │ │ ├── Join.java │ │ │ │ │ ├── Python.java │ │ │ │ │ ├── SetVariable.java │ │ │ │ │ ├── SimpleTask.java │ │ │ │ │ ├── SubWorkflow.java │ │ │ │ │ ├── Switch.java │ │ │ │ │ ├── Task.java │ │ │ │ │ ├── TaskRegistry.java │ │ │ │ │ ├── Terminate.java │ │ │ │ │ └── Wait.java │ │ │ │ ├── executor │ │ │ │ ├── WorkflowExecutor.java │ │ │ │ └── task │ │ │ │ │ ├── AnnotatedWorker.java │ │ │ │ │ ├── AnnotatedWorkerExecutor.java │ │ │ │ │ ├── DynamicForkWorker.java │ │ │ │ │ ├── NonRetryableException.java │ │ │ │ │ ├── TaskContext.java │ │ │ │ │ └── WorkerConfiguration.java │ │ │ │ ├── task │ │ │ │ ├── InputParam.java │ │ │ │ ├── OutputParam.java │ │ │ │ └── WorkerTask.java │ │ │ │ └── utils │ │ │ │ ├── InputOutputGetter.java │ │ │ │ ├── MapBuilder.java │ │ │ │ └── ObjectMapperProvider.java │ │ └── resources │ │ │ └── test-server.properties │ └── test │ │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── sdk │ │ │ └── workflow │ │ │ ├── def │ │ │ ├── TaskConversionsTests.java │ │ │ ├── WorkflowCreationTests.java │ │ │ ├── WorkflowDefTaskTests.java │ │ │ └── WorkflowState.java │ │ │ ├── executor │ │ │ └── task │ │ │ │ ├── AnnotatedWorkerTests.java │ │ │ │ └── TestWorkerConfig.java │ │ │ └── testing │ │ │ ├── Task1Input.java │ │ │ ├── TestWorkflowInput.java │ │ │ └── WorkflowTestFrameworkTests.java │ │ └── resources │ │ ├── application-integrationtest.properties │ │ ├── log4j2.xml │ │ ├── script.js │ │ ├── simple_workflow.json │ │ └── tasks.json ├── testing_framework.md ├── worker_sdk.md └── workflow_sdk.md ├── json-jq-task ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── tasks │ │ └── json │ │ └── JsonJqTransform.java │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── tasks │ └── json │ └── JsonJqTransformTest.java ├── kafka-event-queue ├── README.md ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── kafkaeq │ │ │ ├── config │ │ │ ├── KafkaEventQueueConfiguration.java │ │ │ ├── KafkaEventQueueProperties.java │ │ │ └── KafkaEventQueueProvider.java │ │ │ └── eventqueue │ │ │ └── KafkaObservableQueue.java │ └── resources │ │ └── META-INF │ │ └── additional-spring-configuration-metadata.json │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── kafkaeq │ └── eventqueue │ └── KafkaObservableQueueTest.java ├── kafka ├── README.md ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── contribs │ │ └── tasks │ │ │ └── kafka │ │ │ ├── KafkaProducerManager.java │ │ │ └── KafkaPublishTask.java │ │ └── core │ │ └── execution │ │ └── mapper │ │ └── KafkaPublishTaskMapper.java │ └── test │ ├── groovy │ └── com │ │ └── netflix │ │ └── conductor │ │ └── test │ │ └── integration │ │ └── KafkaPublishTaskSpec.groovy │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── contribs │ │ └── tasks │ │ │ └── kafka │ │ │ ├── KafkaProducerManagerTest.java │ │ │ └── KafkaPublishTaskTest.java │ │ └── core │ │ └── execution │ │ └── mapper │ │ └── KafkaPublishTaskMapperTest.java │ └── resources │ ├── application-integrationtest.properties │ ├── input.json │ ├── output.json │ └── simple_json_jq_transform_integration_test.json ├── licenseheader.txt ├── main.py ├── metrics ├── README.md ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── contribs │ │ └── metrics │ │ ├── LoggingMetricsConfiguration.java │ │ ├── MetricsRegistryConfiguration.java │ │ └── PrometheusMetricsConfiguration.java │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── contribs │ └── metrics │ ├── LoggingMetricsConfigurationTest.java │ └── PrometheusMetricsConfigurationTest.java ├── mkdocs.yml ├── mysql-persistence ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── mysql │ │ │ ├── config │ │ │ ├── MySQLConfiguration.java │ │ │ └── MySQLProperties.java │ │ │ ├── dao │ │ │ ├── MySQLBaseDAO.java │ │ │ ├── MySQLExecutionDAO.java │ │ │ ├── MySQLMetadataDAO.java │ │ │ └── MySQLQueueDAO.java │ │ │ └── util │ │ │ ├── ExecuteFunction.java │ │ │ ├── LazyToString.java │ │ │ ├── Query.java │ │ │ ├── QueryFunction.java │ │ │ ├── ResultSetHandler.java │ │ │ └── TransactionalFunction.java │ └── resources │ │ └── db │ │ └── migration │ │ ├── V1__initial_schema.sql │ │ ├── V2__queue_message_timestamps.sql │ │ ├── V3__queue_add_priority.sql │ │ ├── V4__1009_Fix_MySQLExecutionDAO_Index.sql │ │ ├── V5__correlation_id_index.sql │ │ ├── V6__new_qm_index_with_priority.sql │ │ ├── V7__new_queue_message_pk.sql │ │ └── V8__update_pk.sql │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── mysql │ │ └── dao │ │ │ ├── MySQLExecutionDAOTest.java │ │ │ ├── MySQLMetadataDAOTest.java │ │ │ └── MySQLQueueDAOTest.java │ │ └── test │ │ └── integration │ │ └── grpc │ │ └── mysql │ │ └── MySQLGrpcEndToEndTest.java │ └── resources │ └── application.properties ├── nats-streaming ├── README.md ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── netflix │ └── conductor │ └── contribs │ └── queue │ └── stan │ ├── NATSAbstractQueue.java │ ├── NATSObservableQueue.java │ ├── NATSStreamObservableQueue.java │ └── config │ ├── NATSConfiguration.java │ ├── NATSEventQueueProvider.java │ ├── NATSStreamConfiguration.java │ ├── NATSStreamEventQueueProvider.java │ └── NATSStreamProperties.java ├── nats ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── netflix │ └── conductor │ └── contribs │ └── queue │ └── nats │ ├── JetStreamObservableQueue.java │ ├── JsmMessage.java │ ├── LoggingNatsErrorListener.java │ ├── NATSAbstractQueue.java │ ├── NATSObservableQueue.java │ ├── NatsException.java │ └── config │ ├── JetStreamConfiguration.java │ ├── JetStreamEventQueueProvider.java │ ├── JetStreamProperties.java │ ├── NATSConfiguration.java │ └── NATSEventQueueProvider.java ├── os-persistence ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── os │ │ │ ├── config │ │ │ ├── OpenSearchConditions.java │ │ │ ├── OpenSearchConfiguration.java │ │ │ └── OpenSearchProperties.java │ │ │ └── dao │ │ │ ├── index │ │ │ ├── BulkRequestBuilderWrapper.java │ │ │ ├── BulkRequestWrapper.java │ │ │ ├── OpenSearchBaseDAO.java │ │ │ └── OpenSearchRestDAO.java │ │ │ └── query │ │ │ └── parser │ │ │ ├── Expression.java │ │ │ ├── FilterProvider.java │ │ │ ├── GroupedExpression.java │ │ │ ├── NameValue.java │ │ │ └── internal │ │ │ ├── AbstractNode.java │ │ │ ├── BooleanOp.java │ │ │ ├── ComparisonOp.java │ │ │ ├── ConstValue.java │ │ │ ├── FunctionThrowingException.java │ │ │ ├── ListConst.java │ │ │ ├── Name.java │ │ │ ├── ParserException.java │ │ │ └── Range.java │ └── resources │ │ ├── mappings_docType_task.json │ │ ├── mappings_docType_workflow.json │ │ ├── template_event.json │ │ ├── template_message.json │ │ └── template_task_log.json │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── os │ │ ├── dao │ │ ├── index │ │ │ ├── OpenSearchRestDaoBaseTest.java │ │ │ ├── OpenSearchTest.java │ │ │ ├── TestBulkRequestBuilderWrapper.java │ │ │ ├── TestOpenSearchRestDAO.java │ │ │ └── TestOpenSearchRestDAOBatch.java │ │ └── query │ │ │ └── parser │ │ │ ├── TestExpression.java │ │ │ ├── TestGroupedExpression.java │ │ │ └── internal │ │ │ ├── AbstractParserTest.java │ │ │ ├── TestBooleanOp.java │ │ │ ├── TestComparisonOp.java │ │ │ ├── TestConstValue.java │ │ │ └── TestName.java │ │ └── utils │ │ └── TestUtils.java │ └── resources │ ├── expected_template_task_log.json │ ├── task_summary.json │ └── workflow_summary.json ├── polyglot-clients └── README.md ├── postgres-external-storage ├── README.md ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── postgres │ │ │ ├── config │ │ │ ├── PostgresPayloadConfiguration.java │ │ │ └── PostgresPayloadProperties.java │ │ │ ├── controller │ │ │ └── ExternalPostgresPayloadResource.java │ │ │ └── storage │ │ │ └── PostgresPayloadStorage.java │ └── resources │ │ └── db │ │ └── migration_external_postgres │ │ └── R__initial_schema.sql │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── postgres │ ├── controller │ └── ExternalPostgresPayloadResourceTest.java │ └── storage │ ├── PostgresPayloadStorageTest.java │ └── PostgresPayloadTestUtil.java ├── postgres-persistence ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── postgres │ │ │ ├── config │ │ │ ├── PostgresConfiguration.java │ │ │ └── PostgresProperties.java │ │ │ ├── dao │ │ │ ├── PostgresBaseDAO.java │ │ │ ├── PostgresExecutionDAO.java │ │ │ ├── PostgresIndexDAO.java │ │ │ ├── PostgresLockDAO.java │ │ │ ├── PostgresMetadataDAO.java │ │ │ ├── PostgresPollDataDAO.java │ │ │ └── PostgresQueueDAO.java │ │ │ └── util │ │ │ ├── ExecuteFunction.java │ │ │ ├── ExecutorsUtil.java │ │ │ ├── LazyToString.java │ │ │ ├── PostgresIndexQueryBuilder.java │ │ │ ├── PostgresQueueListener.java │ │ │ ├── Query.java │ │ │ ├── QueryFunction.java │ │ │ ├── QueueStats.java │ │ │ ├── ResultSetHandler.java │ │ │ └── TransactionalFunction.java │ └── resources │ │ └── db │ │ ├── migration_postgres │ │ ├── V10__poll_data_check.sql │ │ ├── V11__locking.sql │ │ ├── V12__task_index_columns.sql │ │ ├── V13.1__workflow_index_columns.sql │ │ ├── V1__initial_schema.sql │ │ ├── V2__1009_Fix_PostgresExecutionDAO_Index.sql │ │ ├── V3__correlation_id_index.sql │ │ ├── V4__new_qm_index_with_priority.sql │ │ ├── V5__new_queue_message_pk.sql │ │ ├── V6__update_pk.sql │ │ ├── V7__new_qm_index_desc_priority.sql │ │ ├── V8__indexing.sql │ │ └── V9__indexing_index_fix.sql │ │ ├── migration_postgres_data │ │ └── V13.2__workflow_index_backfill_update_time.sql │ │ └── migration_postgres_notify │ │ └── V10.1__notify.sql │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── postgres │ │ ├── config │ │ │ └── PostgresConfigurationDataMigrationTest.java │ │ ├── dao │ │ │ ├── PostgresExecutionDAOTest.java │ │ │ ├── PostgresIndexDAOStatusChangeOnlyTest.java │ │ │ ├── PostgresIndexDAOTest.java │ │ │ ├── PostgresLockDAOTest.java │ │ │ ├── PostgresMetadataDAOTest.java │ │ │ ├── PostgresPollDataDAOCacheTest.java │ │ │ ├── PostgresPollDataDAONoCacheTest.java │ │ │ └── PostgresQueueDAOTest.java │ │ ├── performance │ │ │ └── PerformanceTest.java │ │ └── util │ │ │ ├── PostgresIndexQueryBuilderTest.java │ │ │ └── PostgresQueueListenerTest.java │ │ └── test │ │ └── integration │ │ └── grpc │ │ └── postgres │ │ └── PostgresGrpcEndToEndTest.java │ └── resources │ └── application.properties ├── redis-concurrency-limit ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── redis │ │ └── limit │ │ ├── RedisConcurrentExecutionLimitDAO.java │ │ └── config │ │ ├── RedisConcurrentExecutionLimitConfiguration.java │ │ └── RedisConcurrentExecutionLimitProperties.java │ └── test │ └── groovy │ └── com │ └── netflix │ └── conductor │ └── redis │ └── limit │ └── RedisConcurrentExecutionLimitDAOSpec.groovy ├── redis-lock ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── redislock │ │ │ ├── config │ │ │ ├── RedisHealthIndicator.java │ │ │ ├── RedisLockConfiguration.java │ │ │ └── RedisLockProperties.java │ │ │ └── lock │ │ │ └── RedisLock.java │ └── resources │ │ └── META-INF │ │ └── additional-spring-configuration-metadata.json │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ ├── redis │ └── lock │ │ └── RedisLockTest.java │ └── redislock │ └── config │ └── RedisHealthIndicatorTest.java ├── redis-persistence ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── netflix │ │ └── conductor │ │ └── redis │ │ ├── config │ │ ├── AnyRedisCondition.java │ │ ├── DynomiteClusterConfiguration.java │ │ ├── InMemoryRedisConfiguration.java │ │ ├── JedisCommandsConfigurer.java │ │ ├── RedisClusterConfiguration.java │ │ ├── RedisCommonConfiguration.java │ │ ├── RedisProperties.java │ │ ├── RedisSentinelConfiguration.java │ │ └── RedisStandaloneConfiguration.java │ │ ├── dao │ │ ├── BaseDynoDAO.java │ │ ├── DynoQueueDAO.java │ │ ├── RedisEventHandlerDAO.java │ │ ├── RedisExecutionDAO.java │ │ ├── RedisMetadataDAO.java │ │ ├── RedisPollDataDAO.java │ │ └── RedisRateLimitingDAO.java │ │ ├── dynoqueue │ │ ├── ConfigurationHostSupplier.java │ │ ├── LocalhostHostSupplier.java │ │ └── RedisQueuesShardingStrategyProvider.java │ │ └── jedis │ │ ├── JedisCluster.java │ │ ├── JedisMock.java │ │ ├── JedisProxy.java │ │ ├── JedisSentinel.java │ │ └── JedisStandalone.java │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── redis │ ├── config │ └── utils │ │ └── RedisQueuesShardingStrategyProviderTest.java │ ├── dao │ ├── BaseDynoDAOTest.java │ ├── DynoQueueDAOTest.java │ ├── RedisEventHandlerDAOTest.java │ ├── RedisExecutionDAOTest.java │ ├── RedisMetadataDAOTest.java │ ├── RedisPollDataDAOTest.java │ └── RedisRateLimitDAOTest.java │ └── jedis │ ├── ConfigurationHostSupplierTest.java │ ├── JedisClusterTest.java │ └── JedisSentinelTest.java ├── requirements.txt ├── rest ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── rest │ │ │ ├── config │ │ │ ├── RequestMappingConstants.java │ │ │ └── RestConfiguration.java │ │ │ ├── controllers │ │ │ ├── AdminResource.java │ │ │ ├── ApplicationExceptionMapper.java │ │ │ ├── EventResource.java │ │ │ ├── HealthCheckResource.java │ │ │ ├── MetadataResource.java │ │ │ ├── QueueAdminResource.java │ │ │ ├── TaskResource.java │ │ │ ├── ValidationExceptionMapper.java │ │ │ ├── WorkflowBulkResource.java │ │ │ └── WorkflowResource.java │ │ │ └── startup │ │ │ └── KitchenSinkInitializer.java │ └── resources │ │ ├── kitchensink │ │ ├── kitchenSink-ephemeralWorkflowWithEphemeralTasks.json │ │ ├── kitchenSink-ephemeralWorkflowWithStoredTasks.json │ │ ├── kitchensink.json │ │ ├── sub_flow_1.json │ │ ├── wf1.json │ │ └── wf2.json │ │ └── static │ │ ├── favicon.ico │ │ ├── index.html │ │ └── logo.png │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── rest │ └── controllers │ ├── AdminResourceTest.java │ ├── ApplicationExceptionMapperTest.java │ ├── EventResourceTest.java │ ├── MetadataResourceTest.java │ ├── TaskResourceTest.java │ └── WorkflowResourceTest.java ├── server-lite ├── build.gradle ├── build_ui.sh └── src │ └── main │ ├── java │ └── org │ │ └── conductoross │ │ └── conductor │ │ ├── Conductor.java │ │ ├── RestConfiguration.java │ │ └── SpaInterceptor.java │ └── resources │ └── application.properties ├── server ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── Conductor.java │ └── resources │ │ ├── META-INF │ │ └── additional-spring-configuration-metadata.json │ │ ├── application.properties │ │ ├── banner.txt │ │ └── log4j2.xml │ └── test │ └── java │ └── com │ └── netflix │ └── conductor │ └── common │ └── config │ └── ConductorObjectMapperTest.java ├── settings.gradle ├── springboot-bom-overrides.gradle ├── sqlite-persistence ├── build.gradle └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── netflix │ │ │ └── conductor │ │ │ └── sqlite │ │ │ ├── config │ │ │ ├── SqliteConfiguration.java │ │ │ └── SqliteProperties.java │ │ │ ├── dao │ │ │ ├── SqliteBaseDAO.java │ │ │ ├── SqliteExecutionDAO.java │ │ │ ├── SqliteIndexDAO.java │ │ │ ├── SqlitePollDataDAO.java │ │ │ ├── SqliteQueueDAO.java │ │ │ └── metadata │ │ │ │ ├── SqliteEventHandlerMetadataDAO.java │ │ │ │ ├── SqliteMetadataDAO.java │ │ │ │ ├── SqliteTaskMetadataDAO.java │ │ │ │ └── SqliteWorkflowMetadataDAO.java │ │ │ └── util │ │ │ ├── ExecuteFunction.java │ │ │ ├── ExecutorsUtil.java │ │ │ ├── LazyToString.java │ │ │ ├── Query.java │ │ │ ├── QueryFunction.java │ │ │ ├── QueueStats.java │ │ │ ├── ResultSetHandler.java │ │ │ ├── SqliteIndexQueryBuilder.java │ │ │ └── TransactionalFunction.java │ └── resources │ │ └── db │ │ └── migration_sqlite │ │ └── V1__initial_schema.sql │ └── test │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── sqlite │ │ └── dao │ │ ├── SqliteExecutionDAOTest.java │ │ ├── SqliteIndexDAOTest.java │ │ ├── SqliteMetadataDAOTest.java │ │ ├── SqlitePollDataTest.java │ │ └── SqliteQueueDAOTest.java │ └── resources │ └── application.properties ├── task-status-listener ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── netflix │ └── conductor │ └── contribs │ └── listener │ ├── RestClientManager.java │ ├── StatusNotifier.java │ ├── StatusNotifierNotificationProperties.java │ ├── TaskNotification.java │ ├── TaskStatusPublisher.java │ └── TaskStatusPublisherConfiguration.java ├── test-harness ├── build.gradle └── src │ └── test │ ├── groovy │ └── com │ │ └── netflix │ │ └── conductor │ │ └── test │ │ ├── base │ │ ├── AbstractResiliencySpecification.groovy │ │ └── AbstractSpecification.groovy │ │ ├── integration │ │ ├── DecisionTaskSpec.groovy │ │ ├── DoWhileSpec.groovy │ │ ├── DynamicForkJoinSpec.groovy │ │ ├── EventTaskSpec.groovy │ │ ├── ExclusiveJoinSpec.groovy │ │ ├── ExternalPayloadStorageSpec.groovy │ │ ├── FailureWorkflowSpec.groovy │ │ ├── ForkJoinSpec.groovy │ │ ├── HierarchicalForkJoinSubworkflowRerunSpec.groovy │ │ ├── HierarchicalForkJoinSubworkflowRestartSpec.groovy │ │ ├── HierarchicalForkJoinSubworkflowRetrySpec.groovy │ │ ├── JsonJQTransformSpec.groovy │ │ ├── LambdaAndTerminateTaskSpec.groovy │ │ ├── NestedForkJoinSubWorkflowSpec.groovy │ │ ├── SetVariableTaskSpec.groovy │ │ ├── SimpleWorkflowSpec.groovy │ │ ├── StartWorkflowSpec.groovy │ │ ├── SubWorkflowRerunSpec.groovy │ │ ├── SubWorkflowRestartSpec.groovy │ │ ├── SubWorkflowRetrySpec.groovy │ │ ├── SubWorkflowSpec.groovy │ │ ├── SwitchTaskSpec.groovy │ │ ├── SystemTaskSpec.groovy │ │ ├── TaskLimitsWorkflowSpec.groovy │ │ ├── TestWorkflowSpec.groovy │ │ ├── WaitTaskSpec.groovy │ │ └── WorkflowAndTaskConfigurationSpec.groovy │ │ ├── resiliency │ │ ├── QueueResiliencySpec.groovy │ │ └── TaskResiliencySpec.groovy │ │ └── util │ │ └── WorkflowTestUtil.groovy │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── ConductorTestApp.java │ │ └── test │ │ ├── integration │ │ ├── AbstractEndToEndTest.java │ │ ├── grpc │ │ │ ├── AbstractGrpcEndToEndTest.java │ │ │ └── GrpcEndToEndTest.java │ │ └── http │ │ │ ├── AbstractHttpEndToEndTest.java │ │ │ └── HttpEndToEndTest.java │ │ └── utils │ │ ├── MockExternalPayloadStorage.java │ │ └── UserTask.java │ └── resources │ ├── application-integrationtest.properties │ ├── concurrency_limited_task_workflow_integration_test.json │ ├── conditional_switch_task_workflow_integration_test.json │ ├── conditional_system_task_workflow_integration_test.json │ ├── conditional_task_workflow_integration_test.json │ ├── decision_and_fork_join_integration_test.json │ ├── decision_and_terminate_integration_test.json │ ├── do_while_as_subtask_integration_test.json │ ├── do_while_five_loop_over_integration_test.json │ ├── do_while_integration_test.json │ ├── do_while_iteration_fix_test.json │ ├── do_while_multiple_integration_test.json │ ├── do_while_set_variable_fix.json │ ├── do_while_sub_workflow_integration_test.json │ ├── do_while_system_tasks.json │ ├── do_while_with_decision_task.json │ ├── dynamic_fork_join_integration_test.json │ ├── event_workflow_integration_test.json │ ├── exclusive_join_integration_test.json │ ├── failure_workflow_for_terminate_task_workflow.json │ ├── fork_join_integration_test.json │ ├── fork_join_permissive_integration_test.json │ ├── fork_join_sub_workflow.json │ ├── fork_join_with_no_permissive_task_retry_integration_test.json │ ├── fork_join_with_no_task_retry_integration_test.json │ ├── fork_join_with_optional_sub_workflow_forks_integration_test.json │ ├── hierarchical_fork_join_swf.json │ ├── input.json │ ├── json_jq_transform_result_integration_test.json │ ├── nested_fork_join_integration_test.json │ ├── nested_fork_join_swf.json │ ├── nested_fork_join_with_sub_workflow_integration_test.json │ ├── output.json │ ├── rate_limited_simple_task_workflow_integration_test.json │ ├── rate_limited_system_task_workflow_integration_test.json │ ├── sequential_json_jq_transform_integration_test.json │ ├── set_variable_workflow_integration_test.json │ ├── simple_decision_task_integration_test.json │ ├── simple_json_jq_transform_integration_test.json │ ├── simple_lambda_workflow_integration_test.json │ ├── simple_one_task_sub_workflow_integration_test.json │ ├── simple_set_variable_workflow_integration_test.json │ ├── simple_switch_task_integration_test.json │ ├── simple_wait_task_workflow_integration_test.json │ ├── simple_workflow_1_input_template_integration_test.json │ ├── simple_workflow_1_integration_test.json │ ├── simple_workflow_3_integration_test.json │ ├── simple_workflow_with_async_complete_system_task_integration_test.json │ ├── simple_workflow_with_optional_task_integration_test.json │ ├── simple_workflow_with_permissive_optional_task_integration_test.json │ ├── simple_workflow_with_permissive_task_integration_test.json │ ├── simple_workflow_with_resp_time_out_integration_test.json │ ├── simple_workflow_with_sub_workflow_inline_def_integration_test.json │ ├── start_workflow_input.json │ ├── switch_and_fork_join_integration_test.json │ ├── switch_and_terminate_integration_test.json │ ├── switch_with_no_default_case_integration_test.json │ ├── terminate_task_completed_workflow_integration_test.json │ ├── terminate_task_failed_workflow_integration.json │ ├── terminate_task_parent_workflow.json │ ├── terminate_task_sub_workflow.json │ ├── test_task_failed_parent_workflow.json │ ├── test_task_failed_sub_workflow.json │ ├── wait_workflow_integration_test.json │ ├── workflow_that_starts_another_workflow.json │ ├── workflow_with_sub_workflow_1_integration_test.json │ └── workflow_with_synchronous_system_task.json ├── test-util ├── build.gradle └── src │ └── test │ ├── groovy │ └── com │ │ └── netflix │ │ └── conductor │ │ └── test │ │ ├── base │ │ ├── AbstractResiliencySpecification.groovy │ │ └── AbstractSpecification.groovy │ │ └── util │ │ └── WorkflowTestUtil.groovy │ ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ ├── ConductorTestApp.java │ │ ├── common │ │ └── config │ │ │ └── TestObjectMapperConfiguration.java │ │ └── test │ │ └── integration │ │ ├── AbstractEndToEndTest.java │ │ └── grpc │ │ └── AbstractGrpcEndToEndTest.java │ └── resources │ └── application-integrationtest.properties ├── ui ├── .env ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── README.md ├── cypress.config.ts ├── cypress │ ├── e2e │ │ └── spec.cy.js │ ├── fixtures │ │ ├── doWhile │ │ │ └── doWhileSwitch.json │ │ ├── dynamicFork.json │ │ ├── dynamicFork │ │ │ ├── externalizedInput.json │ │ │ ├── noneSpawned.json │ │ │ ├── notExecuted.json │ │ │ ├── oneFailed.json │ │ │ └── success.json │ │ ├── metadataTasks.json │ │ ├── metadataWorkflow.json │ │ ├── taskSearch.json │ │ └── workflowSearch.json │ └── support │ │ ├── commands.ts │ │ ├── component-index.html │ │ ├── component.ts │ │ └── e2e.ts ├── package-lock.json ├── package.json ├── public │ ├── diagramDotBg.svg │ ├── favicon.svg │ ├── index.html │ ├── logo.svg │ └── robots.txt ├── src │ ├── App.jsx │ ├── components │ │ ├── Banner.jsx │ │ ├── Button.jsx │ │ ├── ButtonGroup.jsx │ │ ├── ConfirmChoiceDialog.jsx │ │ ├── CustomButtons.jsx │ │ ├── DataTable.jsx │ │ ├── DateRangePicker.jsx │ │ ├── Dropdown.jsx │ │ ├── DropdownButton.jsx │ │ ├── Heading.jsx │ │ ├── Input.jsx │ │ ├── KeyValueTable.jsx │ │ ├── LinearProgress.jsx │ │ ├── NavLink.jsx │ │ ├── Paper.jsx │ │ ├── Pill.jsx │ │ ├── PrimaryButton.jsx │ │ ├── ReactJson.jsx │ │ ├── SecondaryButton.jsx │ │ ├── Select.jsx │ │ ├── SplitButton.jsx │ │ ├── StatusBadge.jsx │ │ ├── Tabs.jsx │ │ ├── TaskLink.jsx │ │ ├── TaskNameInput.jsx │ │ ├── TertiaryButton.jsx │ │ ├── Text.jsx │ │ ├── WorkflowNameInput.jsx │ │ ├── definitionList │ │ │ └── DefinitionList.jsx │ │ ├── diagram │ │ │ ├── PanAndZoomWrapper.jsx │ │ │ ├── TaskPointer.d.ts │ │ │ ├── TaskResult.d.ts │ │ │ ├── WorkflowDAG.js │ │ │ ├── WorkflowGraph.jsx │ │ │ ├── WorkflowGraph.test.cy.js │ │ │ ├── ZoomControlButton.jsx │ │ │ ├── ZoomControls.jsx │ │ │ └── diagram.scss │ │ ├── formik │ │ │ ├── FormikCronEditor.jsx │ │ │ ├── FormikDropdown.jsx │ │ │ ├── FormikInput.jsx │ │ │ ├── FormikJsonInput.jsx │ │ │ ├── FormikSwitch.jsx │ │ │ ├── FormikVersionDropdown.jsx │ │ │ ├── FormikWorkflowNameInput.jsx │ │ │ └── cron.css │ │ ├── icons │ │ │ ├── FitToFrame.jsx │ │ │ ├── Home.jsx │ │ │ ├── Minus.jsx │ │ │ └── Plus.jsx │ │ └── index.js │ ├── data │ │ ├── actions.js │ │ ├── bulkactions.js │ │ ├── common.js │ │ ├── misc.js │ │ ├── task.js │ │ └── workflow.js │ ├── hooks │ │ └── useTime.js │ ├── index.css │ ├── index.js │ ├── pages │ │ ├── definition │ │ │ ├── EventHandler.jsx │ │ │ ├── ResetConfirmationDialog.jsx │ │ │ ├── SaveTaskDialog.jsx │ │ │ ├── SaveWorkflowDialog.jsx │ │ │ ├── TaskDefinition.jsx │ │ │ └── WorkflowDefinition.jsx │ │ ├── definitions │ │ │ ├── EventHandler.jsx │ │ │ ├── Header.jsx │ │ │ ├── Task.jsx │ │ │ └── Workflow.jsx │ │ ├── errors │ │ │ ├── ErrorsInspector.jsx │ │ │ ├── components │ │ │ │ ├── FailureReasonChart.jsx │ │ │ │ ├── LiveTailButton.jsx │ │ │ │ ├── Notification.jsx │ │ │ │ ├── StatusChart.jsx │ │ │ │ ├── SummaryCard.jsx │ │ │ │ ├── TimeRangeDropdown.jsx │ │ │ │ ├── TimeSeriesChart.jsx │ │ │ │ └── WorkflowTypeChart.jsx │ │ │ ├── errorsInspectorStyles.js │ │ │ └── hooks │ │ │ │ └── useWorkflowErrorGroups.js │ │ ├── execution │ │ │ ├── ActionModule.jsx │ │ │ ├── Execution.jsx │ │ │ ├── ExecutionInputOutput.jsx │ │ │ ├── ExecutionJson.jsx │ │ │ ├── ExecutionSummary.jsx │ │ │ ├── Legend.jsx │ │ │ ├── RightPanel.jsx │ │ │ ├── TaskDetails.jsx │ │ │ ├── TaskList.jsx │ │ │ ├── TaskLogs.jsx │ │ │ ├── TaskPollData.jsx │ │ │ ├── TaskSummary.jsx │ │ │ ├── Timeline.jsx │ │ │ └── timeline.scss │ │ ├── executions │ │ │ ├── BulkActionModule.jsx │ │ │ ├── ResultsTable.jsx │ │ │ ├── SearchTabs.jsx │ │ │ ├── TaskResultsTable.jsx │ │ │ ├── TaskSearch.jsx │ │ │ ├── WorkflowSearch.jsx │ │ │ └── executionsStyles.js │ │ ├── kitchensink │ │ │ ├── DataTableDemo.jsx │ │ │ ├── DiagramTest.jsx │ │ │ ├── Dropdown.jsx │ │ │ ├── EnhancedTable.jsx │ │ │ ├── Examples.jsx │ │ │ ├── Gantt.jsx │ │ │ ├── KitchenSink.jsx │ │ │ └── sampleMovieData.js │ │ ├── misc │ │ │ └── TaskQueue.jsx │ │ ├── styles.js │ │ └── workbench │ │ │ ├── ExecutionHistory.jsx │ │ │ ├── RunHistory.tsx │ │ │ ├── Workbench.jsx │ │ │ └── WorkbenchForm.jsx │ ├── plugins │ │ ├── AppBarModules.jsx │ │ ├── AppLogo.jsx │ │ ├── CustomAppBarButtons.jsx │ │ ├── CustomRoutes.jsx │ │ ├── constants.js │ │ ├── customTypeRenderers.jsx │ │ ├── env.js │ │ └── fetch.js │ ├── react-app-env.d.ts │ ├── schema │ │ ├── task.js │ │ └── workflow.js │ ├── serviceWorker.js │ ├── setupProxy.js │ ├── setupTests.js │ ├── theme │ │ ├── colorOverrides.js │ │ ├── colors.js │ │ ├── index.js │ │ ├── provider.jsx │ │ ├── theme.js │ │ └── variables.js │ └── utils │ │ ├── constants.js │ │ ├── helperFunctions.js │ │ ├── helpers.js │ │ ├── localstorage.ts │ │ └── path.js ├── test-karbon.sh ├── tsconfig.json └── yarn.lock └── workflow-event-listener ├── README.md ├── build.gradle └── src ├── main ├── java │ └── com │ │ └── netflix │ │ └── conductor │ │ └── contribs │ │ └── listener │ │ ├── archive │ │ ├── ArchivingWithTTLWorkflowStatusListener.java │ │ ├── ArchivingWorkflowListenerConfiguration.java │ │ ├── ArchivingWorkflowListenerProperties.java │ │ ├── ArchivingWorkflowStatusListener.java │ │ └── ArchivingWorkflowToS3.java │ │ ├── conductorqueue │ │ ├── ConductorQueueStatusPublisher.java │ │ ├── ConductorQueueStatusPublisherConfiguration.java │ │ └── ConductorQueueStatusPublisherProperties.java │ │ ├── kafka │ │ ├── KafkaWorkflowStatusPublisher.java │ │ ├── KafkaWorkflowStatusPublisherConfiguration.java │ │ └── KafkaWorkflowStatusPublisherProperties.java │ │ └── statuschange │ │ ├── StatusChangeNotification.java │ │ ├── StatusChangePublisher.java │ │ └── StatusChangePublisherConfiguration.java └── resources │ └── META-INF │ └── additional-spring-configuration-metadata.json └── test ├── java └── com │ └── netflix │ └── conductor │ ├── contribs │ └── listener │ │ └── ArchivingWorkflowStatusListenerTest.java │ └── test │ └── listener │ └── WorkflowStatusPublisherIntegrationTest.java └── resources └── application-integrationtest.properties /.dockerignore: -------------------------------------------------------------------------------- 1 | # General 2 | 3 | # Backend 4 | server/build/libs 5 | 6 | # UI 7 | **/node_modules 8 | ui/build -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | gradlew eol=lf 2 | *.gradle eol=lf 3 | *.java eol=lf 4 | *.groovy eol=lf 5 | spring.factories eol=lf 6 | *.sh eol=lf 7 | 8 | docs/* linguist-documentation 9 | server/src/main/resources/swagger-ui/* linguist-vendored 10 | 11 | 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "" 5 | labels: 'type: bug' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **Details** 14 | Conductor version: 15 | Persistence implementation: Cassandra, Postgres, MySQL, Dynomite etc 16 | Queue implementation: Postgres, MySQL, Dynoqueues etc 17 | Lock: Redis or Zookeeper? 18 | Workflow definition: 19 | Task definition: 20 | Event handler definition: 21 | 22 | 23 | **To Reproduce** 24 | Steps to reproduce the behavior: 25 | 1. Go to '...' 26 | 2. Click on '....' 27 | 3. Scroll down to '....' 28 | 4. See error 29 | 30 | **Expected behavior** 31 | A clear and concise description of what you expected to happen. 32 | 33 | **Screenshots** 34 | If applicable, add screenshots to help explain your problem. 35 | 36 | **Additional context** 37 | Add any other context about the problem here. 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Documentation 3 | about: Something in the documentation that needs improvement 4 | title: "[DOC]: " 5 | labels: 'type: docs' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## What are you missing in the docs 11 | 12 | ## Proposed text 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Propose a new feature 4 | title: "[FEATURE]: " 5 | labels: 'type: feature' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Please read our [contributor guide](https://github.com/conductor-oss/conductor/blob/main/CONTRIBUTING.md) before creating an issue. 11 | Also consider discussing your idea on the [discussion forum](https://github.com/conductor-oss/conductor/discussions) first. 12 | 13 | ## Describe the Feature Request 14 | _A clear and concise description of what the feature request is._ 15 | 16 | ## Describe Preferred Solution 17 | _A clear and concise description of what you want to happen._ 18 | 19 | ## Describe Alternatives 20 | _A clear and concise description of any alternative solutions or features you've considered._ 21 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "gradle" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | reviewers: 8 | - "v1r3n" 9 | - "boney9" 10 | - "c4lm" 11 | - package-ecosystem: "github-actions" 12 | directory: "/" 13 | schedule: 14 | interval: "weekly" 15 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Pull Request type 2 | ---- 3 | - [ ] Bugfix 4 | - [ ] Feature 5 | - [ ] Refactoring (no functional changes, no api changes) 6 | - [ ] Build related changes 7 | - [ ] WHOSUSING.md 8 | - [ ] Other (please describe): 9 | 10 | **NOTE**: Please remember to run `./gradlew spotlessApply` to fix any format violations. 11 | 12 | Changes in this PR 13 | ---- 14 | 15 | _Describe the new behavior from this PR, and why it's needed_ 16 | Issue # 17 | 18 | Alternatives considered 19 | ---- 20 | 21 | _Describe alternative implementation you have considered_ 22 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | template: | 2 | ## What’s Changed 3 | 4 | $CHANGES 5 | 6 | name-template: 'v$RESOLVED_VERSION' 7 | tag-template: 'v$RESOLVED_VERSION' 8 | 9 | categories: 10 | - title: 'IMPORTANT' 11 | label: 'type: important' 12 | - title: 'New' 13 | label: 'type: feature' 14 | - title: 'Bug Fixes' 15 | label: 'type: bug' 16 | - title: 'Refactor' 17 | label: 'type: maintenance' 18 | - title: 'Documentation' 19 | label: 'type: docs' 20 | - title: 'Dependency Updates' 21 | label: 'type: dependencies' 22 | 23 | version-resolver: 24 | minor: 25 | labels: 26 | - 'type: important' 27 | 28 | patch: 29 | labels: 30 | - 'type: bug' 31 | - 'type: maintenance' 32 | - 'type: docs' 33 | - 'type: dependencies' 34 | - 'type: feature' 35 | 36 | exclude-labels: 37 | - 'skip-changelog' 38 | - 'gradle-wrapper' 39 | - 'github_actions' 40 | -------------------------------------------------------------------------------- /.github/workflows/generate_gh_pages.yml: -------------------------------------------------------------------------------- 1 | name: Publish docs via GitHub Pages 2 | on: 3 | workflow_dispatch 4 | 5 | jobs: 6 | build: 7 | name: Deploy docs 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout main 11 | uses: actions/checkout@v2 12 | 13 | - name: Deploy docs 14 | uses: mhausenblas/mkdocs-deploy-gh-pages@master 15 | env: 16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 17 | CONFIG_FILE: mkdocs.yml 18 | REQUIREMENTS: requirements.txt 19 | -------------------------------------------------------------------------------- /.github/workflows/release_draft.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths-ignore: 8 | - 'conductor-clients/**' 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | update_release_draft: 15 | permissions: 16 | contents: write # for release-drafter/release-drafter to create a github release 17 | pull-requests: write # for release-drafter/release-drafter to add label to PR 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: release-drafter/release-drafter@v5 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Java Build 2 | .gradle 3 | .classpath 4 | dump.rdb 5 | out 6 | bin 7 | target 8 | buildscan.log 9 | /docs/site 10 | 11 | # Python 12 | /polyglot-clients/python/conductor.egg-info 13 | *.pyc 14 | 15 | # OS & IDE 16 | .DS_Store 17 | .settings 18 | .vscode 19 | .idea 20 | .project 21 | *.iml 22 | 23 | # JS & UI Related 24 | node_modules 25 | /ui/build 26 | /ui/public/monaco-editor 27 | 28 | # publishing secrets 29 | secrets/signing-key 30 | 31 | # local builds 32 | lib/ 33 | build/ 34 | */build/ 35 | 36 | # asdf version file 37 | .tool-versions 38 | 39 | 40 | .qodo 41 | conductorosstest.db 42 | conductorosstest.db 43 | /server-lite/src/main/resources/static 44 | yarn.lock 45 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/CHANGELOG.md -------------------------------------------------------------------------------- /OSSMETADATA: -------------------------------------------------------------------------------- 1 | osslifecycle=active 2 | -------------------------------------------------------------------------------- /RELATED.md: -------------------------------------------------------------------------------- 1 | [Related Projects](docs/resources/related.md) 2 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | | Version | Supported | 6 | | ------- | ------------------ | 7 | | 3.x.x | :white_check_mark: | 8 | | 2.x.x | :x: | 9 | | 1.x.x | :x: | 10 | 11 | ## Reporting a Vulnerability 12 | 13 | Please email oss@orkes.com to report vulnerabilities. 14 | -------------------------------------------------------------------------------- /amqp/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-common') 3 | implementation project(':conductor-core') 4 | 5 | implementation "com.rabbitmq:amqp-client:${revAmqpClient}" 6 | implementation "org.apache.commons:commons-lang3:" 7 | implementation "com.google.guava:guava:${revGuava}" 8 | implementation "io.reactivex:rxjava:${revRxJava}" 9 | 10 | compileOnly 'org.springframework.boot:spring-boot-starter' 11 | compileOnly 'org.springframework.boot:spring-boot-starter-web' 12 | } -------------------------------------------------------------------------------- /amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.contribs.queue.amqp.util; 14 | 15 | public enum ConnectionType { 16 | PUBLISHER, 17 | SUBSCRIBER 18 | } 19 | -------------------------------------------------------------------------------- /amqp/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.contribs.queue.amqp.util; 14 | 15 | /** RetryType holds the retry type */ 16 | public enum RetryType { 17 | REGULARINTERVALS, 18 | EXPONENTIALBACKOFF, 19 | INCREMENTALINTERVALS 20 | } 21 | -------------------------------------------------------------------------------- /annotations-processor/README.md: -------------------------------------------------------------------------------- 1 | Annotation processor is used to generate protobuf files from the annotations. 2 | -------------------------------------------------------------------------------- /annotations-processor/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | sourceSets { 3 | example 4 | } 5 | 6 | dependencies { 7 | implementation project(':conductor-annotations') 8 | api 'com.google.guava:guava:31.1-jre' 9 | api 'com.squareup:javapoet:1.13.0' 10 | api 'com.github.jknack:handlebars:4.3.1' 11 | api 'com.google.protobuf:protobuf-java:3.21.12' 12 | api 'jakarta.annotation:jakarta.annotation-api:2.1.1' 13 | api gradleApi() 14 | 15 | exampleImplementation sourceSets.main.output 16 | exampleImplementation project(':conductor-annotations') 17 | } 18 | 19 | task exampleJar(type: Jar) { 20 | archiveFileName = 'example.jar' 21 | from sourceSets.example.output.classesDirs 22 | } 23 | 24 | testClasses.finalizedBy(exampleJar) 25 | -------------------------------------------------------------------------------- /annotations-processor/src/example/java/com/example/Example.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.example; 14 | 15 | import com.netflix.conductor.annotations.protogen.ProtoField; 16 | import com.netflix.conductor.annotations.protogen.ProtoMessage; 17 | 18 | @ProtoMessage 19 | public class Example { 20 | @ProtoField(id = 1) 21 | public String name; 22 | 23 | @ProtoField(id = 2) 24 | public Long count; 25 | } 26 | -------------------------------------------------------------------------------- /annotations-processor/src/main/resources/templates/file.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package {{protoPackageName}}; 3 | 4 | {{#includes}} 5 | import "{{this}}"; 6 | {{/includes}} 7 | 8 | option java_package = "{{javaPackageName}}"; 9 | option java_outer_classname = "{{javaClassName}}"; 10 | option go_package = "{{goPackageName}}"; 11 | 12 | {{#message}} 13 | {{>message}} 14 | {{/message}} 15 | -------------------------------------------------------------------------------- /annotations-processor/src/main/resources/templates/message.proto: -------------------------------------------------------------------------------- 1 | {{protoClass}} {{name}} { 2 | {{#nested}} 3 | {{>message}} 4 | {{/nested}} 5 | {{#fields}} 6 | {{protoTypeDeclaration}}; 7 | {{/fields}} 8 | } 9 | -------------------------------------------------------------------------------- /annotations-processor/src/test/resources/example.proto.txt: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package protoPackage; 3 | 4 | 5 | option java_package = "abc.protogen.example"; 6 | option java_outer_classname = "ExamplePb"; 7 | option go_package = "goPackage"; 8 | 9 | message Example { 10 | string name = 1; 11 | int64 count = 2; 12 | } 13 | -------------------------------------------------------------------------------- /annotations/README.md: -------------------------------------------------------------------------------- 1 | # Annotations 2 | Used for Conductor to convert Java POJs to protobuf files. 3 | 4 | - `protogen` Annotations 5 | - Original Author: Vicent Martí - https://github.com/vmg 6 | - Original Repo: https://github.com/vmg/protogen 7 | 8 | 9 | -------------------------------------------------------------------------------- /annotations/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | 3 | dependencies { 4 | 5 | } -------------------------------------------------------------------------------- /awss3-storage/README.md: -------------------------------------------------------------------------------- 1 | # S3 external storage support 2 | Used by Conductor to support external payload into S3 blob. 3 | 4 | See [https://docs.conductor-oss.org/documentation/advanced/externalpayloadstorage.html](https://docs.conductor-oss.org/documentation/advanced/externalpayloadstorage.html) for more details 5 | -------------------------------------------------------------------------------- /awss3-storage/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor authors 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | 14 | dependencies { 15 | implementation project(':conductor-common') 16 | implementation project(':conductor-core') 17 | compileOnly 'org.springframework.boot:spring-boot-starter' 18 | 19 | implementation "com.amazonaws:aws-java-sdk-s3:${revAwsSdk}" 20 | implementation "com.amazonaws:aws-java-sdk-sts:${revAwsSdk}" 21 | implementation "org.apache.commons:commons-lang3" 22 | } 23 | -------------------------------------------------------------------------------- /awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "hints": [ 3 | { 4 | "name": "conductor.external-payload-storage.type", 5 | "values": [ 6 | { 7 | "value": "s3", 8 | "description": "Use AWS S3 as the external payload storage." 9 | } 10 | ] 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /awssqs-event-queue/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/awssqs-event-queue/README.md -------------------------------------------------------------------------------- /awssqs-event-queue/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-common') 3 | implementation project(':conductor-core') 4 | compileOnly 'org.springframework.boot:spring-boot-starter' 5 | 6 | implementation "org.apache.commons:commons-lang3" 7 | // SBMTODO: remove guava dep 8 | implementation "com.google.guava:guava:${revGuava}" 9 | 10 | implementation "com.amazonaws:aws-java-sdk-sqs:${revAwsSdk}" 11 | 12 | implementation "io.reactivex:rxjava:${revRxJava}" 13 | 14 | testImplementation 'org.springframework.boot:spring-boot-starter' 15 | testImplementation project(':conductor-common').sourceSets.test.output 16 | } -------------------------------------------------------------------------------- /awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "conductor.event-queues.sqs.enabled", 5 | "type": "java.lang.Boolean", 6 | "description": "Enable the use of AWS SQS implementation to provide queues for consuming events.", 7 | "sourceType": "com.netflix.conductor.sqs.config.SQSEventQueueConfiguration" 8 | }, 9 | { 10 | "name": "conductor.default-event-queue.type", 11 | "type": "java.lang.String", 12 | "description": "The default event queue type to listen on for the WAIT task.", 13 | "sourceType": "com.netflix.conductor.sqs.config.SQSEventQueueConfiguration" 14 | } 15 | ], 16 | "hints": [ 17 | { 18 | "name": "conductor.default-event-queue.type", 19 | "values": [ 20 | { 21 | "value": "sqs", 22 | "description": "Use AWS SQS as the event queue to listen on for the WAIT task." 23 | } 24 | ] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /azureblob-storage/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly 'org.springframework.boot:spring-boot-starter' 3 | implementation project(':conductor-common') 4 | implementation project(':conductor-core') 5 | 6 | implementation "com.azure:azure-storage-blob:${revAzureStorageBlobSdk}" 7 | implementation "org.apache.commons:commons-lang3" 8 | } 9 | -------------------------------------------------------------------------------- /cassandra-persistence/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "conductor.cassandra.write-consistency-level", 5 | "defaultValue": "LOCAL_QUORUM" 6 | }, 7 | { 8 | "name": "conductor.cassandra.read-consistency-level", 9 | "defaultValue": "LOCAL_QUORUM" 10 | } 11 | ], 12 | "hints": [ 13 | { 14 | "name": "conductor.cassandra.write-consistency-level", 15 | "providers": [ 16 | { 17 | "name": "handle-as", 18 | "parameters": { 19 | "target": "java.lang.Enum" 20 | } 21 | } 22 | ] 23 | }, 24 | { 25 | "name": "conductor.cassandra.read-consistency-level", 26 | "providers": [ 27 | { 28 | "name": "handle-as", 29 | "parameters": { 30 | "target": "java.lang.Enum" 31 | } 32 | } 33 | ] 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /client-spring/README.md: -------------------------------------------------------------------------------- 1 | # Deprecation Notice 2 | 3 | **IMPORTANT - 2024-09-19** 4 | 5 | This Spring module along with Client (v3) are being **deprecated** and will be **removed**. 6 | 7 | It will be replaced by [**Client v4**](../conductor-clients/java/conductor-java-sdk/conductor-client), which offers improved features, better performance, 8 | and other enhancements. 9 | 10 | We strongly encourage all users to migrate to [**Client v4**](../conductor-clients/java/conductor-java-sdk/conductor-client) as soon as it becomes available. Expected release date: **2024-10-15**. 11 | 12 | ## Deprecation Timeline 13 | 14 | - **Current Phase:** Client v3 is currently in maintenance phase and will receive critical fixes only. 15 | - **Final Phase Out:** Client v3 will be fully removed from the codebase on **2024-11-20**. The artifacts will remain available in Maven repo. 16 | -------------------------------------------------------------------------------- /client-spring/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | dependencies { 3 | 4 | implementation project(':conductor-common') 5 | api project(':conductor-client') 6 | api project(':conductor-java-sdk') 7 | 8 | implementation "com.netflix.eureka:eureka-client:${revEurekaClient}" 9 | implementation 'org.springframework.boot:spring-boot-starter' 10 | } 11 | -------------------------------------------------------------------------------- /client-spring/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.netflix.conductor.client.spring.ConductorClientAutoConfiguration 3 | -------------------------------------------------------------------------------- /client-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.netflix.conductor.client.spring.ConductorClientAutoConfiguration -------------------------------------------------------------------------------- /client-spring/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | conductor.client.rootUri=http://localhost:8080/api/ 2 | conductor.worker.hello.threadCount=100 3 | conductor.worker.hello_again.domain=test -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Deprecation Notice 2 | 3 | **IMPORTANT - 2024-09-19** 4 | 5 | This Client (v3) is being **deprecated** and will be **removed**. 6 | 7 | It will be replaced by [**Client v4**](../conductor-clients/java/conductor-java-sdk/conductor-client), which offers improved features, better performance, 8 | and other enhancements. 9 | 10 | We strongly encourage all users to migrate to [**Client v4**](../conductor-clients/java/conductor-java-sdk/conductor-client) as soon as it becomes available. Expected release date: **2024-10-15**. 11 | 12 | ## Deprecation Timeline 13 | 14 | - **Current Phase:** Client v3 is currently in maintenance phase and will receive critical fixes only. 15 | - **Final Phase Out:** Client v3 will be fully removed from the codebase on **2024-11-20**. The artifacts will remain available in Maven repo. 16 | -------------------------------------------------------------------------------- /client/spotbugsExclude.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /client/src/test/resources/config.properties: -------------------------------------------------------------------------------- 1 | conductor.worker.pollingInterval=2 2 | conductor.worker.paused=false 3 | conductor.worker.workerA.paused=true 4 | conductor.worker.workerA.domain=domainA 5 | conductor.worker.workerB.batchSize=84 6 | conductor.worker.workerB.domain=domainB 7 | conductor.worker.Test.paused=true 8 | conductor.worker.domainTestTask2.domain=visinghDomain 9 | conductor.worker.task_run_always.pollOutOfDiscovery=true 10 | conductor.worker.task_explicit_do_not_run_always.pollOutOfDiscovery=false 11 | conductor.worker.task_ignore_override.pollOutOfDiscovery=true -------------------------------------------------------------------------------- /client/src/test/resources/test_data/loan_workflow_input.json: -------------------------------------------------------------------------------- 1 | { 2 | "fetch_user_details": [{ 3 | "status": "COMPLETED", 4 | "output": { 5 | "userAccount": 12345 6 | } 7 | }], 8 | "get_credit_score": [{ 9 | "status": "COMPLETED", 10 | "output": { 11 | "creditRating": 750 12 | } 13 | }], 14 | "calculate_loan_amount": [{ 15 | "status": "COMPLETED", 16 | "output": { 17 | "authorizedLoanAmount": 10000 18 | } 19 | }] 20 | } -------------------------------------------------------------------------------- /common-persistence/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | 3 | implementation project(':conductor-common') 4 | implementation project(':conductor-core') 5 | 6 | implementation "com.fasterxml.jackson.core:jackson-databind" 7 | implementation "com.fasterxml.jackson.core:jackson-core" 8 | implementation "org.apache.commons:commons-lang3" 9 | 10 | } -------------------------------------------------------------------------------- /common-persistence/src/test/java/com/netflix/conductor/dao/TestBase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.dao; 14 | 15 | public class TestBase {} 16 | -------------------------------------------------------------------------------- /common/src/main/java/com/netflix/conductor/common/metadata/acl/Permission.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.common.metadata.acl; 14 | 15 | import com.netflix.conductor.annotations.protogen.ProtoEnum; 16 | 17 | @ProtoEnum 18 | @Deprecated 19 | public enum Permission { 20 | OWNER, 21 | OPERATOR 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/java/com/netflix/conductor/common/metadata/workflow/IdempotencyStrategy.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.common.metadata.workflow; 14 | 15 | public enum IdempotencyStrategy { 16 | FAIL, 17 | RETURN_EXISTING, 18 | FAIL_ON_RUNNING 19 | } 20 | -------------------------------------------------------------------------------- /common/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | conductor.app.workflow.name-validation.enabled=true 2 | -------------------------------------------------------------------------------- /conductor-clients/README.md: -------------------------------------------------------------------------------- 1 | # Conductor Clients 2 | 3 | This directory serves as the central repository for various officially supported Conductor client projects. 4 | 5 | > **Note (2024-09-17):** 6 | > 7 | > Currently, it only contains the incubating Java client/SDK v3. 8 | > 9 | > We are in the process of refactoring our clients/SDKs (see: [conductor-sdk](https://github.com/conductor-sdk)) and will be moving them here soon. 10 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/buildSrc/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'groovy' 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | implementation gradleApi() 11 | implementation localGroovy() 12 | } 13 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/buildSrc/src/main/resources/META-INF/gradle-plugins/publish-config.properties: -------------------------------------------------------------------------------- 1 | implementation-class=io.orkes.conductor.gradle.PublishConfigPlugin -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client-metrics/README.md: -------------------------------------------------------------------------------- 1 | # Conductor Client Metrics 2 | 3 | **Status: Incubating.** 4 | 5 | Provides metrics and monitoring capabilities for Conductor clients. 6 | 7 | It helps developers track the performance and health of their workers, offering insights into task execution times, error rates, and system throughput. 8 | 9 | As an incubating module, it's still under development and subject to changes. -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client-metrics/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'idea' 4 | // id 'maven-publish' 5 | // id 'signing' 6 | } 7 | 8 | //ext { 9 | // artifactName = 'Conductor Client Metrics' 10 | // artifactDescription = 'Conductor Client Metrics' 11 | //} 12 | // 13 | //apply plugin: 'publish-config' 14 | 15 | dependencies { 16 | implementation 'io.micrometer:micrometer-registry-prometheus:1.10.5' 17 | implementation project(":conductor-client") 18 | 19 | testImplementation 'org.mockito:mockito-core:5.4.0' 20 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' 21 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' 22 | } 23 | 24 | java { 25 | withSourcesJar() 26 | withJavadocJar() 27 | } 28 | 29 | test { 30 | useJUnitPlatform() 31 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client-spring/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'idea' 4 | id 'maven-publish' 5 | id 'signing' 6 | } 7 | 8 | ext { 9 | artifactName = 'Conductor OSS Client Spring' 10 | artifactDescription = 'Spring autoconfig for Conductor Client and SDK' 11 | } 12 | 13 | apply plugin: 'publish-config' 14 | 15 | compileJava { 16 | sourceCompatibility = 17 17 | targetCompatibility = 17 18 | } 19 | 20 | repositories { 21 | mavenCentral() 22 | } 23 | 24 | dependencies { 25 | api project(":conductor-client") 26 | api project(":sdk") 27 | 28 | implementation 'org.springframework.boot:spring-boot-starter:3.3.0' 29 | } 30 | 31 | java { 32 | withSourcesJar() 33 | withJavadocJar() 34 | } 35 | 36 | test { 37 | useJUnitPlatform() 38 | } 39 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.netflix.conductor.client.spring.ConductorClientAutoConfiguration 2 | com.netflix.conductor.client.spring.ConductorWorkerAutoConfiguration 3 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/main/java/com/netflix/conductor/client/automator/filters/PollFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.client.automator.filters; 14 | 15 | @FunctionalInterface 16 | public interface PollFilter { 17 | boolean filter(String type, String domain); 18 | } 19 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/main/java/com/netflix/conductor/client/events/ConductorClientEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.client.events; 14 | 15 | import java.time.Instant; 16 | 17 | import lombok.Getter; 18 | import lombok.ToString; 19 | 20 | @Getter 21 | @ToString 22 | public abstract class ConductorClientEvent { 23 | private final Instant time = Instant.now(); 24 | } 25 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/main/java/com/netflix/conductor/client/events/taskrunner/PollStarted.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.client.events.taskrunner; 14 | 15 | import lombok.ToString; 16 | 17 | @ToString 18 | public final class PollStarted extends TaskRunnerEvent { 19 | 20 | public PollStarted(String taskType) { 21 | super(taskType); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/main/java/com/netflix/conductor/client/http/HeaderSupplier.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.client.http; 14 | 15 | import java.util.Map; 16 | 17 | 18 | public interface HeaderSupplier { 19 | 20 | void init(ConductorClient client); 21 | 22 | Map get(String method, String path); 23 | } 24 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/main/java/com/netflix/conductor/common/metadata/workflow/IdempotencyStrategy.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.common.metadata.workflow; 14 | 15 | public enum IdempotencyStrategy { 16 | 17 | FAIL, RETURN_EXISTING, 18 | FAIL_ON_RUNNING 19 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/main/java/com/netflix/conductor/common/run/SearchResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.common.run; 14 | 15 | import java.util.List; 16 | 17 | import lombok.*; 18 | 19 | @Data 20 | @NoArgsConstructor 21 | @Builder 22 | @AllArgsConstructor 23 | public class SearchResult { 24 | 25 | private long totalHits; 26 | 27 | private List results; 28 | 29 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/test/resources/conductor-workers.properties: -------------------------------------------------------------------------------- 1 | conductor.worker.pollingInterval=2 2 | conductor.worker.paused=false 3 | conductor.worker.workerA.paused=true 4 | conductor.worker.workerA.domain=domainA 5 | conductor.worker.workerB.batchSize=84 6 | conductor.worker.workerB.domain=domainB 7 | conductor.worker.Test.paused=true 8 | conductor.worker.domainTestTask2.domain=visinghDomain 9 | conductor.worker.task_run_always.pollOutOfDiscovery=true 10 | conductor.worker.task_explicit_do_not_run_always.pollOutOfDiscovery=false 11 | conductor.worker.task_ignore_override.pollOutOfDiscovery=true -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/test/resources/config.properties: -------------------------------------------------------------------------------- 1 | conductor.worker.pollingInterval=2 2 | conductor.worker.paused=false 3 | conductor.worker.workerA.paused=true 4 | conductor.worker.workerA.domain=domainA 5 | conductor.worker.workerB.batchSize=84 6 | conductor.worker.workerB.domain=domainB 7 | conductor.worker.Test.paused=true 8 | conductor.worker.domainTestTask2.domain=visinghDomain 9 | conductor.worker.task_run_always.pollOutOfDiscovery=true 10 | conductor.worker.task_explicit_do_not_run_always.pollOutOfDiscovery=false 11 | conductor.worker.task_ignore_override.pollOutOfDiscovery=true -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/test/resources/test_data/loan_workflow_input.json: -------------------------------------------------------------------------------- 1 | { 2 | "fetch_user_details": [{ 3 | "status": "COMPLETED", 4 | "output": { 5 | "userAccount": 12345 6 | } 7 | }], 8 | "get_credit_score": [{ 9 | "status": "COMPLETED", 10 | "output": { 11 | "creditRating": 750 12 | } 13 | }], 14 | "calculate_loan_amount": [{ 15 | "status": "COMPLETED", 16 | "output": { 17 | "authorizedLoanAmount": 10000 18 | } 19 | }] 20 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/conductor-client/src/test/resources/workflows/main_workflow.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "main_workflow_with_priority", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "fetch_priority_config", 7 | "taskReferenceName": "fetchPriority", 8 | "type": "SIMPLE", 9 | "outputParameters": { 10 | "priority": 42 11 | } 12 | }, 13 | { 14 | "name": "sub_workflow_example", 15 | "taskReferenceName": "subWorkflowTask", 16 | "type": "SUB_WORKFLOW", 17 | "subWorkflowParam": { 18 | "name": "sub_workflow_example", 19 | "version": 1, 20 | "priority": "${fetchPriority.output.priority}" 21 | } 22 | } 23 | ], 24 | "schemaVersion": 2 25 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/examples/README.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | This module provides simple, illustrative examples to help users get started with the Conductor Java Client/SDK v4. 4 | 5 | It demonstrates basic use cases and integrations, serving as a reference for developers to understand how to use Conductor from their applications. -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/examples/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | implementation project(':conductor-client') 11 | implementation project(':sdk') 12 | implementation project(':orkes-client') 13 | implementation "ch.qos.logback:logback-classic:1.5.6" 14 | implementation 'io.micrometer:micrometer-registry-prometheus:1.10.5' 15 | 16 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' 17 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' 18 | } 19 | 20 | test { 21 | useJUnitPlatform() 22 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/examples/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{}): %msg%n%throwable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/examples/src/main/resources/script.js: -------------------------------------------------------------------------------- 1 | function e() { 2 | if ($.value > 1){ 3 | return { 4 | "key": "value", 5 | "key2": 42 6 | }; 7 | } else { 8 | return {}; 9 | } 10 | } 11 | e(); -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/examples/src/main/resources/workflow.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello", 3 | "description": "hello workflow", 4 | "version": 1, 5 | "tasks": [ 6 | { 7 | "name": "greet", 8 | "taskReferenceName": "greet_ref", 9 | "type": "SIMPLE", 10 | "inputParameters": { 11 | "name": "${workflow.input.name}" 12 | } 13 | } 14 | ], 15 | "timeoutPolicy": "TIME_OUT_WF", 16 | "timeoutSeconds": 60 17 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/gradle.properties: -------------------------------------------------------------------------------- 1 | version=4.0.4 2 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/conductor-clients/java/conductor-java-sdk/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/licenseheader.txt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright $YEAR Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/model/AccessKeyResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.model; 14 | 15 | import lombok.*; 16 | 17 | @Data 18 | @NoArgsConstructor 19 | @Builder 20 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 21 | public class AccessKeyResponse { 22 | private String id; 23 | private Long createdAt; 24 | private AccessKeyStatus status; 25 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/model/AccessKeyStatus.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.model; 14 | 15 | public enum AccessKeyStatus { 16 | ACTIVE, 17 | INACTIVE 18 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/model/CreateAccessKeyResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.model; 14 | 15 | import lombok.*; 16 | 17 | @Data 18 | @NoArgsConstructor 19 | @Builder 20 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 21 | public class CreateAccessKeyResponse { 22 | private String id; 23 | private String secret; 24 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/model/Tag.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2025 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.model; 14 | 15 | import lombok.*; 16 | 17 | @Data 18 | @NoArgsConstructor 19 | @Builder 20 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 21 | public class Tag { 22 | 23 | private String key; 24 | private String value; 25 | } 26 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/model/TokenResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.model; 14 | 15 | import lombok.*; 16 | 17 | @Data 18 | @NoArgsConstructor 19 | @Builder 20 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 21 | public class TokenResponse { 22 | 23 | private String token; 24 | 25 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/model/integration/Category.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.model.integration; 14 | 15 | public enum Category { 16 | 17 | API, 18 | 19 | AI_MODEL, 20 | 21 | VECTOR_DB, 22 | 23 | RELATIONAL_DB, 24 | 25 | MESSAGE_BROKER, 26 | 27 | GIT, 28 | 29 | EMAIL 30 | 31 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-client/src/main/java/io/orkes/conductor/client/worker/WorkerFn.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package io.orkes.conductor.client.worker; 14 | 15 | import com.netflix.conductor.common.metadata.tasks.Task; 16 | import com.netflix.conductor.common.metadata.tasks.TaskResult; 17 | 18 | @FunctionalInterface 19 | public interface WorkerFn { 20 | TaskResult execute(Task task); 21 | } 22 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-spring/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'idea' 4 | id 'maven-publish' 5 | id 'signing' 6 | } 7 | 8 | group = 'io.orkes.conductor' 9 | 10 | ext { 11 | artifactId = 'orkes-conductor-client-spring' 12 | artifactName = 'Orkes Conductor Client/SDK Spring' 13 | artifactDescription = 'Spring autoconfig for Orkes Conductor Client and SDK' 14 | } 15 | 16 | apply plugin: 'publish-config' 17 | 18 | compileJava { 19 | sourceCompatibility = 17 20 | targetCompatibility = 17 21 | } 22 | 23 | repositories { 24 | mavenCentral() 25 | } 26 | 27 | dependencies { 28 | api project(":conductor-client") 29 | api project(":orkes-client") 30 | api project(":sdk") 31 | api project(":conductor-client-spring") 32 | 33 | implementation 'org.springframework.boot:spring-boot-starter:3.3.0' 34 | } 35 | 36 | java { 37 | withSourcesJar() 38 | withJavadocJar() 39 | } 40 | 41 | test { 42 | useJUnitPlatform() 43 | } 44 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/orkes-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.orkes.conductor.client.spring.OrkesConductorClientAutoConfiguration 2 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/README.md: -------------------------------------------------------------------------------- 1 | # SDK for Conductor 2 | Conductor SDK allows developers to create, test and execute workflows using code. 3 | 4 | There are three main features of the SDK: 5 | 6 | 1. [Create and run workflows using code](workflow_sdk.md) 7 | 2. [Create and run strongly typed workers](worker_sdk.md) 8 | 3. [Unit Testing framework for workflows and workers](testing_framework.md) 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'idea' 4 | id 'maven-publish' 5 | id 'signing' 6 | } 7 | 8 | ext { 9 | artifactId = 'java-sdk' 10 | artifactName = 'Orkes Conductor SDK' 11 | artifactDescription = 'OSS & Orkes Conductor SDK' 12 | } 13 | 14 | apply plugin: 'publish-config' 15 | 16 | dependencies { 17 | implementation project(":conductor-client") 18 | testImplementation 'org.mockito:mockito-core:5.4.0' 19 | testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' 20 | testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' 21 | } 22 | 23 | java { 24 | withSourcesJar() 25 | withJavadocJar() 26 | } 27 | 28 | test { 29 | useJUnitPlatform() 30 | } -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ValidationError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.sdk.workflow.def; 14 | 15 | public class ValidationError extends RuntimeException { 16 | 17 | public ValidationError(String message) { 18 | super(message); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/src/test/java/com/netflix/conductor/sdk/workflow/executor/task/Bike.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.sdk.workflow.executor.task; 14 | 15 | public class Bike { 16 | String brand; 17 | 18 | String getBrand() { 19 | return brand; 20 | } 21 | 22 | void setBrand(String brand) { 23 | this.brand = brand; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/src/test/java/com/netflix/conductor/sdk/workflow/executor/task/Car.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.sdk.workflow.executor.task; 14 | 15 | public class Car { 16 | String brand; 17 | 18 | String getBrand() { 19 | return brand; 20 | } 21 | 22 | void setBrand(String brand) { 23 | this.brand = brand; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/src/test/resources/script.js: -------------------------------------------------------------------------------- 1 | function e() { 2 | if ($.value > 1){ 3 | return { 4 | "key": "value", 5 | "key2": 42 6 | }; 7 | } else { 8 | return {}; 9 | } 10 | } 11 | e(); -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/sdk/src/test/resources/test-server.properties: -------------------------------------------------------------------------------- 1 | conductor.db.type=memory 2 | conductor.indexing.enabled=false 3 | conductor.workflow-repair-service.enabled=false 4 | loadSample=true 5 | conductor.system-task-workers.enabled=false -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'conductor-java-sdk' 2 | include 'conductor-client' 3 | include 'conductor-client-metrics' 4 | include 'conductor-client-spring' 5 | include 'sdk' 6 | include 'examples' 7 | include 'tests' 8 | include 'orkes-client' 9 | include 'orkes-spring' 10 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/tests/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | conductor.worker.all.domain=domainx 2 | conductor.worker.all.pollingInterval=3 3 | #conductor.worker.all.threadCount=7 4 | 5 | conductor.worker.hello.domain=helo_domain 6 | conductor.worker.hello.pollingInterval=1 7 | conductor.worker.hello.threadCount=13 -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/tests/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{}): %msg%n%throwable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /conductor-clients/java/conductor-java-sdk/versions.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | versions = [ 3 | okHttp : '4.12.0', 4 | guava : '32.1.2-jre', 5 | jackson : '2.17.1', 6 | archaius : '0.7.12', 7 | slf4j : '1.7.36', 8 | log4j : '2.23.1', 9 | lombok : '1.18.30', 10 | commonsLang : '3.12.0', 11 | junit : '5.10.3', 12 | awaitility : '4.2.0', 13 | wiremock : '2.33.2', 14 | mockito : '5.12.0', 15 | testContainers: '1.19.8', 16 | ] 17 | } -------------------------------------------------------------------------------- /core/src/main/java/com/netflix/conductor/annotations/Trace.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.annotations; 14 | 15 | import java.lang.annotation.Retention; 16 | import java.lang.annotation.Target; 17 | 18 | import static java.lang.annotation.ElementType.TYPE; 19 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 20 | 21 | @Target({TYPE}) 22 | @Retention(RUNTIME) 23 | public @interface Trace {} 24 | -------------------------------------------------------------------------------- /core/src/main/java/com/netflix/conductor/core/events/ActionProcessor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.core.events; 14 | 15 | import java.util.Map; 16 | 17 | import com.netflix.conductor.common.metadata.events.EventHandler; 18 | 19 | public interface ActionProcessor { 20 | 21 | Map execute( 22 | EventHandler.Action action, Object payloadObject, String event, String messageId); 23 | } 24 | -------------------------------------------------------------------------------- /core/src/main/java/com/netflix/conductor/core/events/EventQueueManager.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.core.events; 14 | 15 | import java.util.Map; 16 | 17 | public interface EventQueueManager { 18 | 19 | Map getQueues(); 20 | 21 | Map> getQueueSizes(); 22 | } 23 | -------------------------------------------------------------------------------- /core/src/main/java/com/netflix/conductor/core/exception/NonTransientException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.core.exception; 14 | 15 | public class NonTransientException extends RuntimeException { 16 | 17 | public NonTransientException(String message) { 18 | super(message); 19 | } 20 | 21 | public NonTransientException(String message, Throwable cause) { 22 | super(message, cause); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /core/src/main/java/com/netflix/conductor/core/exception/TransientException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.core.exception; 14 | 15 | public class TransientException extends RuntimeException { 16 | 17 | public TransientException(String message) { 18 | super(message); 19 | } 20 | 21 | public TransientException(String message, Throwable cause) { 22 | super(message, cause); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docker/ci/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:17-jdk 2 | 3 | WORKDIR /workspace/conductor 4 | COPY . /workspace/conductor 5 | 6 | RUN ./gradlew clean build 7 | -------------------------------------------------------------------------------- /docker/server/config/config-mysql.properties: -------------------------------------------------------------------------------- 1 | # Database persistence type. 2 | conductor.db.type=mysql 3 | 4 | 5 | # mysql 6 | spring.datasource.url=jdbc:mysql://mysql:3306/conductor 7 | spring.datasource.username=conductor 8 | spring.datasource.password=conductor 9 | 10 | # redis queues 11 | conductor.queue.type=redis_standalone 12 | conductor.redis.hosts=rs:6379:us-east-1c 13 | conductor.redis-lock.serverAddress=redis://rs:6379 14 | 15 | 16 | # Elastic search instance indexing is enabled. 17 | conductor.indexing.enabled=true 18 | conductor.elasticsearch.url=http://es:9200 19 | conductor.elasticsearch.indexName=conductor 20 | conductor.elasticsearch.version=7 21 | conductor.elasticsearch.clusterHealthColor=yellow 22 | 23 | # Additional modules for metrics collection exposed to Prometheus (optional) 24 | conductor.metrics-prometheus.enabled=true 25 | management.endpoints.web.exposure.include=prometheus 26 | 27 | # Load sample kitchen-sink workflow 28 | loadSample=true 29 | -------------------------------------------------------------------------------- /docker/server/config/config-postgres.properties: -------------------------------------------------------------------------------- 1 | # Database persistence type. 2 | conductor.db.type=postgres 3 | conductor.queue.type=postgres 4 | conductor.external-payload-storage.type=postgres 5 | 6 | # Database connectivity 7 | spring.datasource.url=jdbc:postgresql://postgresdb:5432/postgres 8 | spring.datasource.username=conductor 9 | spring.datasource.password=conductor 10 | 11 | 12 | # Indexing Properties 13 | conductor.indexing.enabled=true 14 | conductor.indexing.type=postgres 15 | # Required to disable connecting to elasticsearch. 16 | conductor.elasticsearch.version=0 17 | 18 | # Additional modules for metrics collection exposed to Prometheus (optional) 19 | conductor.metrics-prometheus.enabled=true 20 | management.endpoints.web.exposure.include=prometheus 21 | 22 | # Load sample kitchen-sink workflow 23 | loadSample=true -------------------------------------------------------------------------------- /docker/server/config/redis.conf: -------------------------------------------------------------------------------- 1 | appendonly yes -------------------------------------------------------------------------------- /docker/ui/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # conductor:ui - Conductor UI 3 | # 4 | FROM node:20-alpine 5 | LABEL maintainer="Orkes OSS " 6 | 7 | # Install the required packages for the node build 8 | # to run on alpine 9 | RUN apk update && apk add --no-cache python3 py3-pip make g++ 10 | 11 | # A directory within the virtualized Docker environment 12 | # Becomes more relevant when using Docker Compose later 13 | WORKDIR /usr/src/app 14 | 15 | # Copies package.json to Docker environment in a separate layer as a performance optimization 16 | COPY ./ui/package.json ./ 17 | 18 | # Installs all node packages. Cached unless package.json changes 19 | RUN yarn install && mkdir -p public && cp -r node_modules/monaco-editor public/ 20 | 21 | # Copies everything else over to Docker environment 22 | # node_modules excluded in .dockerignore. 23 | COPY ./ui . 24 | 25 | # Include monaco sources into bundle (instead of using CDN) 26 | ENV REACT_APP_MONACO_EDITOR_USING_CDN=false 27 | ENV REACT_APP_ENABLE_ERRORS_INSPECTOR=true 28 | CMD [ "yarn", "start" ] 29 | -------------------------------------------------------------------------------- /docker/ui/README.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | ## Conductor UI 3 | This Dockerfile create the conductor:ui image 4 | 5 | ## Building the image 6 | 7 | Run the following commands from the project root. 8 | 9 | `docker build -f docker/ui/Dockerfile -t conductor:ui .` 10 | 11 | ## Running the conductor server 12 | - With localhost conductor server: `docker run -p 5000:5000 -d -t conductor:ui` 13 | - With external conductor server: `docker run -p 5000:5000 -d -t -e "WF_SERVER=http://conductor-server:8080" conductor:ui` 14 | -------------------------------------------------------------------------------- /docs/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/assets/images/favicon.png -------------------------------------------------------------------------------- /docs/devguide/architecture/PollTimeoutSeconds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/PollTimeoutSeconds.png -------------------------------------------------------------------------------- /docs/devguide/architecture/ResponseTimeoutSeconds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/ResponseTimeoutSeconds.png -------------------------------------------------------------------------------- /docs/devguide/architecture/TaskFailure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/TaskFailure.png -------------------------------------------------------------------------------- /docs/devguide/architecture/TimeoutSeconds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/TimeoutSeconds.png -------------------------------------------------------------------------------- /docs/devguide/architecture/conductor-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/conductor-architecture.png -------------------------------------------------------------------------------- /docs/devguide/architecture/dag_workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/dag_workflow.png -------------------------------------------------------------------------------- /docs/devguide/architecture/dag_workflow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/dag_workflow2.png -------------------------------------------------------------------------------- /docs/devguide/architecture/directed_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/directed_graph.png -------------------------------------------------------------------------------- /docs/devguide/architecture/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/overview.png -------------------------------------------------------------------------------- /docs/devguide/architecture/pirate_graph.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/pirate_graph.gif -------------------------------------------------------------------------------- /docs/devguide/architecture/regular_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/regular_graph.png -------------------------------------------------------------------------------- /docs/devguide/architecture/task_states.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/architecture/task_states.png -------------------------------------------------------------------------------- /docs/devguide/bestpractices.md: -------------------------------------------------------------------------------- 1 | # Best Practices 2 | 3 | ## Response Timeout 4 | - Configure the responseTimeoutSeconds of each task to be > 0. 5 | - Should be less than or equal to timeoutSeconds. 6 | 7 | ## Payload sizes 8 | - Configure your workflows such that conductor is not used as a persistence store. 9 | - Ensure that the output data in the task result set in your worker is used by your workflow for execution. If the values in the output payloads are not used by subsequent tasks in your workflow, this data should not be sent back to conductor in the task result. 10 | - In cases where the output data of your task is used within subsequent tasks in your workflow but is substantially large (> 100KB), consider uploading this data to an object store (S3 or similar) and set the location to the object in your task output. The subsequent tasks can then download this data from the given location and use it during execution. 11 | -------------------------------------------------------------------------------- /docs/devguide/concepts/workers.md: -------------------------------------------------------------------------------- 1 | # Workers 2 | A worker is responsible for executing a task. Workers can be implemented in any language, and Conductor provides a polyglot set of worker frameworks that provide features such as polling threads, metrics and server communication that makes creating workers easy. 3 | 4 | Each worker embodies the Microservice design pattern and follows certain basic principles: 5 | 6 | 1. Workers are stateless and do not implement a workflow specific logic. 7 | 2. Each worker executes a very specific task and produces well defined output given specific inputs. 8 | 3. Workers are meant to be idempotent (or should handle cases where the task that partially executed gets rescheduled due to timeouts etc.) 9 | 4. Workers do not implement the logic to handle retries etc, that is taken care by the Conductor server. 10 | 11 | Conductor maintains a registry of worker tasks. A task MUST be registered before being used in a workflow. This can be done by creating and saving a **Task Definition**. -------------------------------------------------------------------------------- /docs/devguide/how-tos/Monitoring/Conductor-LogLevel.md: -------------------------------------------------------------------------------- 1 | # Conductor Log Level 2 | 3 | Conductor is based on Spring Boot, so the log levels are set via [Spring Boot properties](https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-logging.html): 4 | 5 | From the Spring Boot Docs: 6 | 7 | 8 | > All the supported logging systems can have the logger levels set in the Spring Environment (for example, in application.properties) by using ```logging.level.=``` where level is one of TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF. The ```root``` logger can be configured by using logging.level.root. 9 | 10 | > The following example shows potential logging settings in ```application.properties```: 11 | 12 | ``` 13 | logging.level.root=warn 14 | logging.level.org.springframework.web=debug 15 | logging.level.org.hibernate=error 16 | ``` 17 | 18 | It’s also possible to set logging levels using environment variables. For example, ```LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG``` will set ```org.springframework.web``` to `DEBUG`. 19 | -------------------------------------------------------------------------------- /docs/devguide/how-tos/Tasks/reusing-tasks.md: -------------------------------------------------------------------------------- 1 | # Reusing Tasks 2 | 3 | A powerful feature of Conductor is that it supports and enables re-usability out of the box. Task workers typically 4 | perform a unit of work and is usually a part of a larger workflow. Such workers are often re-usable in multiple 5 | workflows. Once a task is defined, you can use it across as any workflow. 6 | 7 | When re-using tasks, it's important to think of situations that a multi-tenant system faces. All the work assigned to 8 | this worker by default goes to the same task scheduling queue. This could result in your worker not being polled quickly 9 | if there is a noisy neighbour in the ecosystem. One way you can tackle this situation is by re-using the worker code, 10 | but having different task names registered for different use cases. And for each task name, you can run an appropriate 11 | number of workers based on expected load. 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/devguide/how-tos/Tasks/task-configurations.md: -------------------------------------------------------------------------------- 1 | # Task Configurations 2 | 3 | Refer to [Task Definitions](../../../documentation/configuration/taskdef.md) for details on how to configure task definitions 4 | 5 | ## Example 6 | 7 | Here is a task template payload with commonly used fields: 8 | 9 | ```json 10 | { 11 | "createdBy": "user", 12 | "name": "sample_task_name_1", 13 | "description": "This is a sample task for demo", 14 | "responseTimeoutSeconds": 10, 15 | "timeoutSeconds": 30, 16 | "inputKeys": [], 17 | "outputKeys": [], 18 | "timeoutPolicy": "TIME_OUT_WF", 19 | "retryCount": 3, 20 | "retryLogic": "FIXED", 21 | "retryDelaySeconds": 5, 22 | "inputTemplate": {}, 23 | "rateLimitPerFrequency": 0, 24 | "rateLimitFrequencyInSeconds": 1 25 | } 26 | ``` 27 | 28 | ## Best Practices 29 | 30 | 1. Refer to [Task Timeouts](task-timeouts.md) for additional information on how the various timeout settings work 31 | 2. Refer to [Monitoring Task Queues](monitoring-task-queues.md) on how to monitor task queues 32 | -------------------------------------------------------------------------------- /docs/devguide/how-tos/Workers/build-a-golang-task-worker.md: -------------------------------------------------------------------------------- 1 | # Build a Go Task Worker 2 | 3 | See [conductor-sdk/conductor-go](https://github.com/conductor-sdk/conductor-go/blob/main/README.md) 4 | -------------------------------------------------------------------------------- /docs/devguide/how-tos/Workers/build-a-python-task-worker.md: -------------------------------------------------------------------------------- 1 | # Build a Python Task Worker 2 | 3 | See 4 | [conductor-sdk/conductor-python](https://github.com/conductor-sdk/conductor-python/blob/main/README.md) 5 | -------------------------------------------------------------------------------- /docs/devguide/how-tos/Workflows/workflow_debugging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/how-tos/Workflows/workflow_debugging.png -------------------------------------------------------------------------------- /docs/devguide/how-tos/Workflows/workflow_execution_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/how-tos/Workflows/workflow_execution_view.png -------------------------------------------------------------------------------- /docs/devguide/how-tos/Workflows/workflow_task_fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/how-tos/Workflows/workflow_task_fail.png -------------------------------------------------------------------------------- /docs/devguide/labs/img/EventHandlerCycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/img/EventHandlerCycle.png -------------------------------------------------------------------------------- /docs/devguide/labs/img/bgnr_complete_workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/img/bgnr_complete_workflow.png -------------------------------------------------------------------------------- /docs/devguide/labs/img/bgnr_state_scheduled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/img/bgnr_state_scheduled.png -------------------------------------------------------------------------------- /docs/devguide/labs/img/bgnr_systask_state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/img/bgnr_systask_state.png -------------------------------------------------------------------------------- /docs/devguide/labs/index.md: -------------------------------------------------------------------------------- 1 | # Guided Tutorial 2 | 3 | ## High Level Steps 4 | Generally, these are the steps necessary in order to put Conductor to work for your business workflow: 5 | 6 | 1. Create task worker(s) that poll for scheduled tasks at regular interval 7 | 2. Create task definitions for these workers and register them. 8 | 3. Create the workflow definition 9 | 10 | ## Before We Begin 11 | Ensure you have a Conductor instance up and running. This includes both the Server and the UI. We recommend following the [Docker Instructions](../running/docker.md). 12 | 13 | ## Tools 14 | For the purpose of testing and issuing API calls, the following tools are useful 15 | 16 | - Linux cURL command 17 | - [Postman](https://www.postman.com) or similar REST client 18 | 19 | ## Let's Go 20 | We will begin by defining a simple workflow that utilizes System Tasks. 21 | 22 | [Next](first-workflow.md) 23 | 24 | -------------------------------------------------------------------------------- /docs/devguide/labs/kitchensink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/kitchensink.png -------------------------------------------------------------------------------- /docs/devguide/labs/metadataWorkflowPost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/metadataWorkflowPost.png -------------------------------------------------------------------------------- /docs/devguide/labs/metadataWorkflowRun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/metadataWorkflowRun.png -------------------------------------------------------------------------------- /docs/devguide/labs/uiWorkflowDefinition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/uiWorkflowDefinition.png -------------------------------------------------------------------------------- /docs/devguide/labs/uiWorkflowDefinitionVisual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/uiWorkflowDefinitionVisual.png -------------------------------------------------------------------------------- /docs/devguide/labs/workflowLoaded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/workflowLoaded.png -------------------------------------------------------------------------------- /docs/devguide/labs/workflowRunIdCopy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/labs/workflowRunIdCopy.png -------------------------------------------------------------------------------- /docs/devguide/running/conductorUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/running/conductorUI.png -------------------------------------------------------------------------------- /docs/devguide/running/swagger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/devguide/running/swagger.png -------------------------------------------------------------------------------- /docs/documentation/advanced/annotation-processor.md: -------------------------------------------------------------------------------- 1 | # Annotation Processor 2 | 3 | This module is strictly for code generation tasks during builds based on annotations. 4 | Currently supports `protogen` 5 | 6 | ### Usage 7 | 8 | This is an actual example of this module which is implemented in common/build.gradle 9 | 10 | ```groovy 11 | task protogen(dependsOn: jar, type: JavaExec) { 12 | classpath configurations.annotationsProcessorCodegen 13 | main = 'com.netflix.conductor.annotationsprocessor.protogen.ProtoGenTask' 14 | args( 15 | "conductor.proto", 16 | "com.netflix.conductor.proto", 17 | "github.com/netflix/conductor/client/gogrpc/conductor/model", 18 | "${rootDir}/grpc/src/main/proto", 19 | "${rootDir}/grpc/src/main/java/com/netflix/conductor/grpc", 20 | "com.netflix.conductor.grpc", 21 | jar.archivePath, 22 | "com.netflix.conductor.common", 23 | ) 24 | } 25 | ``` 26 | 27 | -------------------------------------------------------------------------------- /docs/documentation/api/index.md: -------------------------------------------------------------------------------- 1 | # API Specification 2 | 3 | See the following sections for API endpoint documentation. 4 | 5 | - [Metadata API](metadata.md) 6 | - [Start Workflow API](startworkflow.md) 7 | - [Workflow API](workflow.md) 8 | - [Task API](task.md) 9 | 10 | [Task Domains](taskdomains.md) can be used to address tasks to specific pools of workers at runtime. 11 | 12 | ## Swagger UI 13 | As an alternative resource, the [Swagger UI]({{ server_host }}/swagger_ui/index.html) will always have the definitive interface description. 14 | -------------------------------------------------------------------------------- /docs/documentation/clientsdks/index.md: -------------------------------------------------------------------------------- 1 | # Client SDKs 2 | Conductor tasks that are executed by remote workers communicate over HTTP endpoints/gRPC to poll for the task and update the status of the execution. The follow SDKs are provided for implementing Conductor workers. 3 | 4 | * [Java](java-sdk.md) 5 | * [Clojure](clojure-sdk.md) 6 | * [C#](csharp-sdk.md) 7 | * [Go](go-sdk.md) 8 | * [Python](python-sdk.md) 9 | * [Javascript/Typescript](js-sdk.md) 10 | 11 | The non-Java Conductor SDKs are hosted on a separate GitHub repository: [github.com/conductor-sdk](https://github.com/conductor-sdk). Contributions from the community are encouraged! 12 | -------------------------------------------------------------------------------- /docs/documentation/clientsdks/js-sdk.md: -------------------------------------------------------------------------------- 1 | # Javascript/TypeScript SDK 2 | 3 | See [conductor-sdk/conductor-javascript](https://github.com/conductor-sdk/conductor-javascript/blob/main/README.md) -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/ShippingWorkflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/ShippingWorkflow.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/ShippingWorkflowRunning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/ShippingWorkflowRunning.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/ShippingWorkflowUPS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/ShippingWorkflowUPS.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/Switch_Fedex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/Switch_Fedex.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/Terminate_Task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/Terminate_Task.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/dynamic-task-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/dynamic-task-diagram.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/fork-task-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/fork-task-diagram.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/subworkflow_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/subworkflow_diagram.png -------------------------------------------------------------------------------- /docs/documentation/configuration/workflowdef/operators/workflow_fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/documentation/configuration/workflowdef/operators/workflow_fork.png -------------------------------------------------------------------------------- /docs/home/devex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/home/devex.png -------------------------------------------------------------------------------- /docs/home/icons/server.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/home/icons/shield.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/home/icons/wrench.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/home/redirect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Redirecting ...

7 | 8 | -------------------------------------------------------------------------------- /docs/home/timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/docs/home/timeline.png -------------------------------------------------------------------------------- /docs/overrides/partials/logo.html: -------------------------------------------------------------------------------- 1 | {% if config.theme.logo %} 2 | 5 | {% endif %} -------------------------------------------------------------------------------- /docs/resources/license.md: -------------------------------------------------------------------------------- 1 | # License 2 | 3 | Copyright 2023 Conductor authors. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | -------------------------------------------------------------------------------- /es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/FilterProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.es6.dao.query.parser; 14 | 15 | import org.elasticsearch.index.query.QueryBuilder; 16 | 17 | public interface FilterProvider { 18 | 19 | /** 20 | * @return FilterBuilder for elasticsearch 21 | */ 22 | public QueryBuilder getFilterBuilder(); 23 | } 24 | -------------------------------------------------------------------------------- /es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/internal/FunctionThrowingException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.es6.dao.query.parser.internal; 14 | 15 | @FunctionalInterface 16 | public interface FunctionThrowingException { 17 | 18 | void accept(T t) throws Exception; 19 | } 20 | -------------------------------------------------------------------------------- /es6-persistence/src/main/resources/template_message.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 0, 3 | "template": "*message*", 4 | "settings": { 5 | "index": { 6 | "refresh_interval": "1s" 7 | } 8 | }, 9 | "mappings": { 10 | "message": { 11 | "properties": { 12 | "created": { 13 | "type": "long" 14 | }, 15 | "messageId": { 16 | "type": "keyword", 17 | "index": true 18 | }, 19 | "payload": { 20 | "type": "keyword", 21 | "index": true 22 | }, 23 | "queue": { 24 | "type": "keyword", 25 | "index": true 26 | } 27 | } 28 | } 29 | }, 30 | "aliases": {} 31 | } -------------------------------------------------------------------------------- /es6-persistence/src/main/resources/template_task_log.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 0, 3 | "template": "*task*log*", 4 | "settings": { 5 | "index": { 6 | "refresh_interval": "1s" 7 | } 8 | }, 9 | "mappings": { 10 | "task_log": { 11 | "properties": { 12 | "createdTime": { 13 | "type": "long" 14 | }, 15 | "log": { 16 | "type": "keyword", 17 | "index": true 18 | }, 19 | "taskId": { 20 | "type": "keyword", 21 | "index": true 22 | } 23 | } 24 | } 25 | }, 26 | "aliases": {} 27 | } -------------------------------------------------------------------------------- /es6-persistence/src/test/resources/expected_template_task_log.json: -------------------------------------------------------------------------------- 1 | { 2 | "order": 0, 3 | "template": "*conductor_task*log*", 4 | "settings": { 5 | "index": { 6 | "refresh_interval": "1s" 7 | } 8 | }, 9 | "mappings": { 10 | "task_log": { 11 | "properties": { 12 | "createdTime": { 13 | "type": "long" 14 | }, 15 | "log": { 16 | "type": "keyword", 17 | "index": true 18 | }, 19 | "taskId": { 20 | "type": "keyword", 21 | "index": true 22 | } 23 | } 24 | } 25 | }, 26 | "aliases": {} 27 | } -------------------------------------------------------------------------------- /es6-persistence/src/test/resources/task_summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "taskId": "9dea4567-0240-4eab-bde8-99f4535ea3fc", 3 | "taskDefName": "templated_task", 4 | "taskType": "templated_task", 5 | "workflowId": "WORKFLOW_INSTANCE_ID", 6 | "workflowType": "template_workflow", 7 | "correlationId": "testTaskDefTemplate", 8 | "scheduledTime": "2021-08-22T05:18:25.121Z", 9 | "startTime": "0", 10 | "endTime": "0", 11 | "updateTime": "2021-08-23T00:18:25.121Z", 12 | "status": "SCHEDULED", 13 | "workflowPriority": 1, 14 | "queueWaitTime": 0, 15 | "executionTime": 0, 16 | "input": "{http_request={method=GET, vipStack=test_stack, body={requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath, inputPaths=[file://path1, file://path2]}, uri=/get/something}}" 17 | } -------------------------------------------------------------------------------- /es6-persistence/src/test/resources/workflow_summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "workflowType": "template_workflow", 3 | "version": 1, 4 | "workflowId": "WORKFLOW_INSTANCE_ID", 5 | "priority": 1, 6 | "correlationId": "testTaskDefTemplate", 7 | "startTime": 1534983505050, 8 | "updateTime": 1534983505131, 9 | "endTime": 0, 10 | "status": "RUNNING", 11 | "input": "{path1=file://path1, path2=file://path2, requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath}" 12 | } 13 | -------------------------------------------------------------------------------- /es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/FilterProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.es7.dao.query.parser; 14 | 15 | import org.elasticsearch.index.query.QueryBuilder; 16 | 17 | /** 18 | * @author Viren 19 | */ 20 | public interface FilterProvider { 21 | 22 | /** 23 | * @return FilterBuilder for elasticsearch 24 | */ 25 | public QueryBuilder getFilterBuilder(); 26 | } 27 | -------------------------------------------------------------------------------- /es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/FunctionThrowingException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.es7.dao.query.parser.internal; 14 | 15 | /** 16 | * @author Viren 17 | */ 18 | @FunctionalInterface 19 | public interface FunctionThrowingException { 20 | 21 | void accept(T t) throws Exception; 22 | } 23 | -------------------------------------------------------------------------------- /es7-persistence/src/main/resources/template_message.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": [ "*message*" ], 3 | "template": { 4 | "settings": { 5 | "refresh_interval": "1s" 6 | }, 7 | "mappings": { 8 | "properties": { 9 | "created": { 10 | "type": "long" 11 | }, 12 | "messageId": { 13 | "type": "keyword", 14 | "index": true 15 | }, 16 | "payload": { 17 | "type": "keyword", 18 | "index": true 19 | }, 20 | "queue": { 21 | "type": "keyword", 22 | "index": true 23 | } 24 | } 25 | }, 26 | "aliases": { } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /es7-persistence/src/main/resources/template_task_log.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": [ "*task*log*" ], 3 | "template": { 4 | "settings": { 5 | "refresh_interval": "1s" 6 | }, 7 | "mappings": { 8 | "properties": { 9 | "createdTime": { 10 | "type": "long" 11 | }, 12 | "log": { 13 | "type": "keyword", 14 | "index": true 15 | }, 16 | "taskId": { 17 | "type": "keyword", 18 | "index": true 19 | } 20 | } 21 | }, 22 | "aliases": { } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestGroupedExpression.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.es7.dao.query.parser; 14 | 15 | import org.junit.Test; 16 | 17 | /** 18 | * @author Viren 19 | */ 20 | public class TestGroupedExpression { 21 | 22 | @Test 23 | public void test() {} 24 | } 25 | -------------------------------------------------------------------------------- /es7-persistence/src/test/resources/expected_template_task_log.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns" : [ "*conductor_task*log*" ], 3 | "template" : { 4 | "settings" : { 5 | "refresh_interval" : "1s" 6 | }, 7 | "mappings" : { 8 | "properties" : { 9 | "createdTime" : { 10 | "type" : "long" 11 | }, 12 | "log" : { 13 | "type" : "keyword", 14 | "index" : true 15 | }, 16 | "taskId" : { 17 | "type" : "keyword", 18 | "index" : true 19 | } 20 | } 21 | }, 22 | "aliases" : { } 23 | } 24 | } -------------------------------------------------------------------------------- /es7-persistence/src/test/resources/task_summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "taskId": "9dea4567-0240-4eab-bde8-99f4535ea3fc", 3 | "taskDefName": "templated_task", 4 | "taskType": "templated_task", 5 | "workflowId": "WORKFLOW_INSTANCE_ID", 6 | "workflowType": "template_workflow", 7 | "correlationId": "testTaskDefTemplate", 8 | "scheduledTime": "2021-08-22T05:18:25.121Z", 9 | "startTime": "0", 10 | "endTime": "0", 11 | "updateTime": "2021-08-23T00:18:25.121Z", 12 | "status": "SCHEDULED", 13 | "workflowPriority": 1, 14 | "queueWaitTime": 0, 15 | "executionTime": 0, 16 | "input": "{http_request={method=GET, vipStack=test_stack, body={requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath, inputPaths=[file://path1, file://path2]}, uri=/get/something}}" 17 | } -------------------------------------------------------------------------------- /es7-persistence/src/test/resources/workflow_summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "workflowType": "template_workflow", 3 | "version": 1, 4 | "workflowId": "WORKFLOW_INSTANCE_ID", 5 | "priority": 1, 6 | "correlationId": "testTaskDefTemplate", 7 | "startTime": 1534983505050, 8 | "updateTime": 1534983505131, 9 | "endTime": 0, 10 | "status": "RUNNING", 11 | "input": "{path1=file://path1, path2=file://path2, requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath}" 12 | } 13 | -------------------------------------------------------------------------------- /family.properties: -------------------------------------------------------------------------------- 1 | generation=1 2 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.daemon=true 2 | org.gradle.jvmargs=-Xmx1g 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /grpc-client/README.md: -------------------------------------------------------------------------------- 1 | # gRPC client for Conductor OSS 2 | 3 | > **Note:** This module will be relocated to [conductor-clients/java/conductor-java-sdk/sdk](conductor-clients/java/conductor-java-sdk/). 4 | > 5 | > Expected completion date: 2024-10-15. 6 | -------------------------------------------------------------------------------- /grpc-client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline 2 | -------------------------------------------------------------------------------- /grpc-server/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-common') 3 | implementation project(':conductor-core') 4 | implementation project(':conductor-grpc') 5 | 6 | compileOnly 'org.springframework.boot:spring-boot-starter' 7 | 8 | implementation "io.grpc:grpc-netty:${revGrpc}" 9 | implementation "io.grpc:grpc-services:${revGrpc}" 10 | implementation "io.grpc:grpc-protobuf:${revGrpc}" 11 | implementation "com.google.guava:guava:${revGuava}" 12 | implementation "org.apache.commons:commons-lang3" 13 | implementation "com.fasterxml.jackson.core:jackson-databind" 14 | implementation "com.fasterxml.jackson.core:jackson-core" 15 | implementation "com.fasterxml.jackson.core:jackson-annotations" 16 | 17 | testImplementation "io.grpc:grpc-testing:${revGrpc}" 18 | testImplementation "io.grpc:grpc-protobuf:${revGrpc}" 19 | testImplementation "org.testinfected.hamcrest-matchers:all-matchers:${revHamcrestAllMatchers}" 20 | } 21 | -------------------------------------------------------------------------------- /grpc-server/src/test/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2023 Conductor authors 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | # Set root logger level to WARN and its only appender to A1. 18 | log4j.rootLogger=WARN, A1 19 | 20 | # A1 is set to be a ConsoleAppender. 21 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 22 | 23 | # A1 uses PatternLayout. 24 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout 25 | log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n -------------------------------------------------------------------------------- /grpc/src/main/proto/grpc/search.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.grpc.search; 3 | 4 | option java_package = "com.netflix.conductor.grpc"; 5 | option java_outer_classname = "SearchPb"; 6 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/grpc/search"; 7 | 8 | message Request { 9 | int32 start = 1; 10 | int32 size = 2; 11 | string sort = 3; 12 | string free_text = 4; 13 | string query = 5; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/dynamicforkjointask.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "DynamicForkJoinTaskPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message DynamicForkJoinTask { 11 | string task_name = 1; 12 | string workflow_name = 2; 13 | string reference_name = 3; 14 | map input = 4; 15 | string type = 5; 16 | } 17 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/dynamicforkjointasklist.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "model/dynamicforkjointask.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "DynamicForkJoinTaskListPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message DynamicForkJoinTaskList { 11 | repeated DynamicForkJoinTask dynamic_tasks = 1; 12 | } 13 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/eventexecution.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "model/eventhandler.proto"; 5 | import "google/protobuf/struct.proto"; 6 | 7 | option java_package = "com.netflix.conductor.proto"; 8 | option java_outer_classname = "EventExecutionPb"; 9 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 10 | 11 | message EventExecution { 12 | enum Status { 13 | IN_PROGRESS = 0; 14 | COMPLETED = 1; 15 | FAILED = 2; 16 | SKIPPED = 3; 17 | } 18 | string id = 1; 19 | string message_id = 2; 20 | string name = 3; 21 | string event = 4; 22 | int64 created = 5; 23 | EventExecution.Status status = 6; 24 | EventHandler.Action.Type action = 7; 25 | map output = 8; 26 | } 27 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/polldata.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | 5 | option java_package = "com.netflix.conductor.proto"; 6 | option java_outer_classname = "PollDataPb"; 7 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 8 | 9 | message PollData { 10 | string queue_name = 1; 11 | string domain = 2; 12 | string worker_id = 3; 13 | int64 last_poll_time = 4; 14 | } 15 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/ratelimitconfig.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | 5 | option java_package = "com.netflix.conductor.proto"; 6 | option java_outer_classname = "RateLimitConfigPb"; 7 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 8 | 9 | message RateLimitConfig { 10 | string rate_limit_key = 1; 11 | int32 concurrent_exec_limit = 2; 12 | } 13 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/rerunworkflowrequest.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "RerunWorkflowRequestPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message RerunWorkflowRequest { 11 | string re_run_from_workflow_id = 1; 12 | map workflow_input = 2; 13 | string re_run_from_task_id = 3; 14 | map task_input = 4; 15 | string correlation_id = 5; 16 | } 17 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/schemadef.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | 5 | option java_package = "com.netflix.conductor.proto"; 6 | option java_outer_classname = "SchemaDefPb"; 7 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 8 | 9 | message SchemaDef { 10 | enum Type { 11 | JSON = 0; 12 | AVRO = 1; 13 | PROTOBUF = 2; 14 | } 15 | string name = 1; 16 | int32 version = 2; 17 | SchemaDef.Type type = 3; 18 | } 19 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/skiptaskrequest.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | import "google/protobuf/any.proto"; 6 | 7 | option java_package = "com.netflix.conductor.proto"; 8 | option java_outer_classname = "SkipTaskRequestPb"; 9 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 10 | 11 | message SkipTaskRequest { 12 | map task_input = 1; 13 | map task_output = 2; 14 | google.protobuf.Any task_input_message = 3; 15 | google.protobuf.Any task_output_message = 4; 16 | } 17 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/startworkflowrequest.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "model/workflowdef.proto"; 5 | import "google/protobuf/struct.proto"; 6 | 7 | option java_package = "com.netflix.conductor.proto"; 8 | option java_outer_classname = "StartWorkflowRequestPb"; 9 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 10 | 11 | message StartWorkflowRequest { 12 | string name = 1; 13 | int32 version = 2; 14 | string correlation_id = 3; 15 | map input = 4; 16 | map task_to_domain = 5; 17 | WorkflowDef workflow_def = 6; 18 | string external_input_payload_storage_path = 7; 19 | int32 priority = 8; 20 | string created_by = 9; 21 | } 22 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/statechangeevent.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "StateChangeEventPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message StateChangeEvent { 11 | string type = 1; 12 | map payload = 2; 13 | } 14 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/subworkflowparams.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "SubWorkflowParamsPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message SubWorkflowParams { 11 | string name = 1; 12 | int32 version = 2; 13 | map task_to_domain = 3; 14 | google.protobuf.Value workflow_definition = 4; 15 | } 16 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/taskexeclog.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | 5 | option java_package = "com.netflix.conductor.proto"; 6 | option java_outer_classname = "TaskExecLogPb"; 7 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 8 | 9 | message TaskExecLog { 10 | string log = 1; 11 | string task_id = 2; 12 | int64 created_time = 3; 13 | } 14 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/taskresult.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | import "google/protobuf/any.proto"; 6 | 7 | option java_package = "com.netflix.conductor.proto"; 8 | option java_outer_classname = "TaskResultPb"; 9 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 10 | 11 | message TaskResult { 12 | enum Status { 13 | IN_PROGRESS = 0; 14 | FAILED = 1; 15 | FAILED_WITH_TERMINAL_ERROR = 2; 16 | COMPLETED = 3; 17 | } 18 | string workflow_instance_id = 1; 19 | string task_id = 2; 20 | string reason_for_incompletion = 3; 21 | int64 callback_after_seconds = 4; 22 | string worker_id = 5; 23 | TaskResult.Status status = 6; 24 | map output_data = 7; 25 | google.protobuf.Any output_message = 8; 26 | } 27 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/tasksummary.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "model/task.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "TaskSummaryPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message TaskSummary { 11 | string workflow_id = 1; 12 | string workflow_type = 2; 13 | string correlation_id = 3; 14 | string scheduled_time = 4; 15 | string start_time = 5; 16 | string update_time = 6; 17 | string end_time = 7; 18 | Task.Status status = 8; 19 | string reason_for_incompletion = 9; 20 | int64 execution_time = 10; 21 | int64 queue_wait_time = 11; 22 | string task_def_name = 12; 23 | string task_type = 13; 24 | string input = 14; 25 | string output = 15; 26 | string task_id = 16; 27 | string external_input_payload_storage_path = 17; 28 | string external_output_payload_storage_path = 18; 29 | int32 workflow_priority = 19; 30 | string domain = 20; 31 | } 32 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/upgradeworkflowrequest.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | import "google/protobuf/struct.proto"; 5 | 6 | option java_package = "com.netflix.conductor.proto"; 7 | option java_outer_classname = "UpgradeWorkflowRequestPb"; 8 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 9 | 10 | message UpgradeWorkflowRequest { 11 | map task_output = 4; 12 | map workflow_input = 3; 13 | int32 version = 2; 14 | string name = 1; 15 | } 16 | -------------------------------------------------------------------------------- /grpc/src/main/proto/model/workflowdefsummary.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package conductor.proto; 3 | 4 | 5 | option java_package = "com.netflix.conductor.proto"; 6 | option java_outer_classname = "WorkflowDefSummaryPb"; 7 | option go_package = "github.com/netflix/conductor/client/gogrpc/conductor/model"; 8 | 9 | message WorkflowDefSummary { 10 | string name = 1; 11 | int32 version = 2; 12 | int64 create_time = 3; 13 | } 14 | -------------------------------------------------------------------------------- /http-task/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "conductor.tasks.http.readTimeout", 5 | "type": "java.lang.Integer", 6 | "description": "The read timeout of the underlying HttpClient used by the HTTP task." 7 | }, 8 | { 9 | "name": "conductor.tasks.http.connectTimeout", 10 | "type": "java.lang.Integer", 11 | "description": "The connection timeout of the underlying HttpClient used by the HTTP task." 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /java-sdk/README.md: -------------------------------------------------------------------------------- 1 | # SDK for Conductor 2 | 3 | > **Note:** This module will be relocated to [conductor-clients/java/conductor-java-sdk/sdk](conductor-clients/java/conductor-java-sdk/sdk). As part of the Java Client v4 effort, it will also undergo several enhancements. 4 | > 5 | > Expected completion date: 2024-10-15. 6 | 7 | Conductor SDK allows developers to create, test and execute workflows using code. 8 | 9 | There are three main features of the SDK: 10 | 11 | 1. [Create and run workflows using code](workflow_sdk.md) 12 | 2. [Create and run strongly typed workers](worker_sdk.md) 13 | 3. [Unit Testing framework for workflows and workers](testing_framework.md) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /java-sdk/example/resources/script.js: -------------------------------------------------------------------------------- 1 | function e() { 2 | if ($.value > 1){ 3 | return { 4 | "key": "value", 5 | "key2": 42 6 | }; 7 | } else { 8 | return {}; 9 | } 10 | } 11 | e(); -------------------------------------------------------------------------------- /java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ValidationError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.sdk.workflow.def; 14 | 15 | public class ValidationError extends RuntimeException { 16 | 17 | public ValidationError(String message) { 18 | super(message); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /java-sdk/src/main/resources/test-server.properties: -------------------------------------------------------------------------------- 1 | conductor.db.type=memory 2 | conductor.indexing.enabled=false 3 | conductor.workflow-repair-service.enabled=false 4 | loadSample=true 5 | conductor.system-task-workers.enabled=false -------------------------------------------------------------------------------- /java-sdk/src/test/resources/script.js: -------------------------------------------------------------------------------- 1 | function e() { 2 | if ($.value > 1){ 3 | return { 4 | "key": "value", 5 | "key2": 42 6 | }; 7 | } else { 8 | return {}; 9 | } 10 | } 11 | e(); -------------------------------------------------------------------------------- /json-jq-task/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor authors 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | 14 | dependencies { 15 | implementation project(':conductor-common') 16 | implementation project(':conductor-core') 17 | compileOnly 'org.springframework.boot:spring-boot-starter' 18 | 19 | implementation "net.thisptr:jackson-jq:${revJq}" 20 | implementation "com.github.ben-manes.caffeine:caffeine" 21 | } 22 | -------------------------------------------------------------------------------- /kafka-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "conductor.event-queues.kafka.enabled", 5 | "type": "java.lang.Boolean", 6 | "description": "Enable the use of Kafka implementation to provide queues for consuming events.", 7 | "sourceType": "com.netflix.conductor.kafkaeq.config.KafkaEventQueueConfiguration" 8 | }, 9 | { 10 | "name": "conductor.default-event-queue.type", 11 | "type": "java.lang.String", 12 | "description": "The default event queue type to listen on for the WAIT task.", 13 | "sourceType": "com.netflix.conductor.kafkaeq.config.KafkaEventQueueConfiguration" 14 | } 15 | ], 16 | "hints": [ 17 | { 18 | "name": "conductor.default-event-queue.type", 19 | "values": [ 20 | { 21 | "value": "kafka", 22 | "description": "Use kafka as the event queue to listen on for the WAIT task." 23 | } 24 | ] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /kafka/src/test/resources/input.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/kafka/src/test/resources/input.json -------------------------------------------------------------------------------- /kafka/src/test/resources/simple_json_jq_transform_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_json_jq_transform_wf", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "jq", 7 | "taskReferenceName": "jq_1", 8 | "inputParameters": { 9 | "input": "${workflow.input}", 10 | "queryExpression": ".input as $_ | { out: ($_.in1.array + $_.in2.array) }" 11 | }, 12 | "type": "JSON_JQ_TRANSFORM", 13 | "decisionCases": {}, 14 | "defaultCase": [], 15 | "forkTasks": [], 16 | "startDelay": 0, 17 | "joinOn": [], 18 | "optional": false, 19 | "defaultExclusiveJoinTask": [], 20 | "asyncComplete": false, 21 | "loopOver": [] 22 | } 23 | ], 24 | "inputParameters": [], 25 | "outputParameters": {}, 26 | "schemaVersion": 2, 27 | "restartable": true, 28 | "workflowStatusListenerEnabled": false, 29 | "timeoutPolicy": "ALERT_ONLY", 30 | "timeoutSeconds": 0, 31 | "ownerEmail": "test@harness.com" 32 | } -------------------------------------------------------------------------------- /licenseheader.txt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright $YEAR Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ -------------------------------------------------------------------------------- /metrics/README.md: -------------------------------------------------------------------------------- 1 | # Metrics 2 | Conductor publishes detailed metrics for the server. 3 | For the list of metrics published by server, see: 4 | 5 | https://netflix.github.io/conductor/metrics/server/ 6 | 7 | Conductor supports plugging in metrics collectors, the following are currently supported by this module: 8 | 1. Datadog 9 | 2. Prometheus 10 | 3. Logging (dumps all the metrics to Slf4J logger) 11 | 12 | ## Published Artifacts 13 | 14 | Group: `com.netflix.conductor` 15 | 16 | | Published Artifact | Description | 17 | | ----------- | ----------- | 18 | | conductor-metrics | Metrics configuration | 19 | 20 | **Note**: If you are using `condutor-contribs` as a dependency, the metrics module is already included, you do not need to include it separately. 21 | 22 | #### Configuration 23 | * Logging Metrics 24 | 25 | `conductor.metrics-logger.enabled=true` 26 | * Prometheus 27 | 28 | `conductor.metrics-prometheus.enabled=true` 29 | * Datadog 30 | 31 | `conductor.metrics-datadog.enabled=true` -------------------------------------------------------------------------------- /mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.mysql.util; 14 | 15 | import java.sql.SQLException; 16 | 17 | /** 18 | * Functional interface for {@link Query} executions with no expected result. 19 | * 20 | * @author mustafa 21 | */ 22 | @FunctionalInterface 23 | public interface ExecuteFunction { 24 | 25 | void apply(Query query) throws SQLException; 26 | } 27 | -------------------------------------------------------------------------------- /mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/QueryFunction.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.mysql.util; 14 | 15 | import java.sql.SQLException; 16 | 17 | /** 18 | * Functional interface for {@link Query} executions that return results. 19 | * 20 | * @author mustafa 21 | */ 22 | @FunctionalInterface 23 | public interface QueryFunction { 24 | 25 | R apply(Query query) throws SQLException; 26 | } 27 | -------------------------------------------------------------------------------- /mysql-persistence/src/main/resources/db/migration/V2__queue_message_timestamps.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `queue_message` CHANGE `created_on` `created_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; 2 | ALTER TABLE `queue_message` CHANGE `deliver_on` `deliver_on` TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 3 | -------------------------------------------------------------------------------- /mysql-persistence/src/main/resources/db/migration/V3__queue_add_priority.sql: -------------------------------------------------------------------------------- 1 | SET @dbname = DATABASE(); 2 | SET @tablename = "queue_message"; 3 | SET @columnname = "priority"; 4 | SET @preparedStatement = (SELECT IF( 5 | ( 6 | SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 7 | WHERE 8 | (table_name = @tablename) 9 | AND (table_schema = @dbname) 10 | AND (column_name = @columnname) 11 | ) > 0, 12 | "SELECT 1", 13 | CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " TINYINT DEFAULT 0 AFTER `message_id`") 14 | )); 15 | PREPARE addColumnIfNotExist FROM @preparedStatement; 16 | EXECUTE addColumnIfNotExist; 17 | DEALLOCATE PREPARE addColumnIfNotExist; -------------------------------------------------------------------------------- /mysql-persistence/src/main/resources/db/migration/V4__1009_Fix_MySQLExecutionDAO_Index.sql: -------------------------------------------------------------------------------- 1 | # Drop the 'unique_event_execution' index if it exists 2 | SET @exist := (SELECT COUNT(INDEX_NAME) 3 | FROM information_schema.STATISTICS 4 | WHERE `TABLE_NAME` = 'event_execution' 5 | AND `INDEX_NAME` = 'unique_event_execution' 6 | AND TABLE_SCHEMA = database()); 7 | SET @sqlstmt := IF(@exist > 0, 'ALTER TABLE `event_execution` DROP INDEX `unique_event_execution`', 8 | 'SELECT ''INFO: Index already exists.'''); 9 | PREPARE stmt FROM @sqlstmt; 10 | EXECUTE stmt; 11 | 12 | # Create the 'unique_event_execution' index with execution_id column instead of 'message_id' so events can be executed multiple times. 13 | ALTER TABLE `event_execution` 14 | ADD CONSTRAINT `unique_event_execution` UNIQUE (event_handler_name, event_name, execution_id); 15 | -------------------------------------------------------------------------------- /mysql-persistence/src/main/resources/db/migration/V5__correlation_id_index.sql: -------------------------------------------------------------------------------- 1 | # Drop the 'workflow_corr_id_index' index if it exists 2 | SET @exist := (SELECT COUNT(INDEX_NAME) 3 | FROM information_schema.STATISTICS 4 | WHERE `TABLE_NAME` = 'workflow' 5 | AND `INDEX_NAME` = 'workflow_corr_id_index' 6 | AND TABLE_SCHEMA = database()); 7 | SET @sqlstmt := IF(@exist > 0, 'ALTER TABLE `workflow` DROP INDEX `workflow_corr_id_index`', 8 | 'SELECT ''INFO: Index already exists.'''); 9 | PREPARE stmt FROM @sqlstmt; 10 | EXECUTE stmt; 11 | 12 | # Create the 'workflow_corr_id_index' index with correlation_id column because correlation_id queries are slow in large databases. 13 | CREATE INDEX workflow_corr_id_index ON workflow (correlation_id); 14 | -------------------------------------------------------------------------------- /mysql-persistence/src/main/resources/db/migration/V6__new_qm_index_with_priority.sql: -------------------------------------------------------------------------------- 1 | # Drop the 'combo_queue_message' index if it exists 2 | SET @exist := (SELECT COUNT(INDEX_NAME) 3 | FROM information_schema.STATISTICS 4 | WHERE `TABLE_NAME` = 'queue_message' 5 | AND `INDEX_NAME` = 'combo_queue_message' 6 | AND TABLE_SCHEMA = database()); 7 | SET @sqlstmt := IF(@exist > 0, 'ALTER TABLE `queue_message` DROP INDEX `combo_queue_message`', 8 | 'SELECT ''INFO: Index already exists.'''); 9 | PREPARE stmt FROM @sqlstmt; 10 | EXECUTE stmt; 11 | 12 | # Re-create the 'combo_queue_message' index to add priority column because queries that order by priority are slow in large databases. 13 | CREATE INDEX combo_queue_message ON queue_message (queue_name,priority,popped,deliver_on,created_on); 14 | -------------------------------------------------------------------------------- /mysql-persistence/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | conductor.db.type=mysql 2 | spring.datasource.url=jdbc:tc:mysql:8.0.29:///conductor 3 | spring.datasource.username=root 4 | spring.datasource.password=root 5 | spring.datasource.hikari.maximum-pool-size=8 6 | spring.datasource.hikari.auto-commit=false 7 | -------------------------------------------------------------------------------- /nats-streaming/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-common') 3 | implementation project(':conductor-core') 4 | 5 | implementation "io.nats:java-nats-streaming:${revStan}" 6 | implementation "io.nats:jnats:${revNatsStreaming}" 7 | 8 | implementation "org.apache.commons:commons-lang3:" 9 | implementation "com.google.guava:guava:${revGuava}" 10 | implementation "io.reactivex:rxjava:${revRxJava}" 11 | 12 | compileOnly 'org.springframework.boot:spring-boot-starter' 13 | compileOnly 'org.springframework.boot:spring-boot-starter-web' 14 | } -------------------------------------------------------------------------------- /nats/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-common') 3 | implementation project(':conductor-core') 4 | 5 | implementation "io.nats:jnats:${revNats}" 6 | 7 | implementation "org.apache.commons:commons-lang3:" 8 | implementation "com.google.guava:guava:${revGuava}" 9 | implementation "io.reactivex:rxjava:${revRxJava}" 10 | 11 | compileOnly 'org.springframework.boot:spring-boot-starter' 12 | compileOnly 'org.springframework.boot:spring-boot-starter-web' 13 | } -------------------------------------------------------------------------------- /os-persistence/src/main/java/com/netflix/conductor/os/dao/query/parser/FilterProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.os.dao.query.parser; 14 | 15 | import org.opensearch.index.query.QueryBuilder; 16 | 17 | /** 18 | * @author Viren 19 | */ 20 | public interface FilterProvider { 21 | 22 | /** 23 | * @return FilterBuilder for elasticsearch 24 | */ 25 | public QueryBuilder getFilterBuilder(); 26 | } 27 | -------------------------------------------------------------------------------- /os-persistence/src/main/java/com/netflix/conductor/os/dao/query/parser/internal/FunctionThrowingException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.os.dao.query.parser.internal; 14 | 15 | /** 16 | * @author Viren 17 | */ 18 | @FunctionalInterface 19 | public interface FunctionThrowingException { 20 | 21 | void accept(T t) throws Exception; 22 | } 23 | -------------------------------------------------------------------------------- /os-persistence/src/main/resources/template_message.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": [ "*message*" ], 3 | "template": { 4 | "settings": { 5 | "refresh_interval": "1s" 6 | }, 7 | "mappings": { 8 | "properties": { 9 | "created": { 10 | "type": "long" 11 | }, 12 | "messageId": { 13 | "type": "keyword", 14 | "index": true 15 | }, 16 | "payload": { 17 | "type": "keyword", 18 | "index": true 19 | }, 20 | "queue": { 21 | "type": "keyword", 22 | "index": true 23 | } 24 | } 25 | }, 26 | "aliases": { } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /os-persistence/src/main/resources/template_task_log.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": [ "*task*log*" ], 3 | "template": { 4 | "settings": { 5 | "refresh_interval": "1s" 6 | }, 7 | "mappings": { 8 | "properties": { 9 | "createdTime": { 10 | "type": "long" 11 | }, 12 | "log": { 13 | "type": "keyword", 14 | "index": true 15 | }, 16 | "taskId": { 17 | "type": "keyword", 18 | "index": true 19 | } 20 | } 21 | }, 22 | "aliases": { } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /os-persistence/src/test/java/com/netflix/conductor/os/dao/query/parser/TestGroupedExpression.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.os.dao.query.parser; 14 | 15 | import org.junit.Test; 16 | 17 | /** 18 | * @author Viren 19 | */ 20 | public class TestGroupedExpression { 21 | 22 | @Test 23 | public void test() {} 24 | } 25 | -------------------------------------------------------------------------------- /os-persistence/src/test/resources/expected_template_task_log.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns" : [ "*conductor_task*log*" ], 3 | "template" : { 4 | "settings" : { 5 | "refresh_interval" : "1s" 6 | }, 7 | "mappings" : { 8 | "properties" : { 9 | "createdTime" : { 10 | "type" : "long" 11 | }, 12 | "log" : { 13 | "type" : "keyword", 14 | "index" : true 15 | }, 16 | "taskId" : { 17 | "type" : "keyword", 18 | "index" : true 19 | } 20 | } 21 | }, 22 | "aliases" : { } 23 | } 24 | } -------------------------------------------------------------------------------- /os-persistence/src/test/resources/task_summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "taskId": "9dea4567-0240-4eab-bde8-99f4535ea3fc", 3 | "taskDefName": "templated_task", 4 | "taskType": "templated_task", 5 | "workflowId": "WORKFLOW_INSTANCE_ID", 6 | "workflowType": "template_workflow", 7 | "correlationId": "testTaskDefTemplate", 8 | "scheduledTime": "2021-08-22T05:18:25.121Z", 9 | "startTime": "0", 10 | "endTime": "0", 11 | "updateTime": "2021-08-23T00:18:25.121Z", 12 | "status": "SCHEDULED", 13 | "workflowPriority": 1, 14 | "queueWaitTime": 0, 15 | "executionTime": 0, 16 | "input": "{http_request={method=GET, vipStack=test_stack, body={requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath, inputPaths=[file://path1, file://path2]}, uri=/get/something}}" 17 | } -------------------------------------------------------------------------------- /os-persistence/src/test/resources/workflow_summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "workflowType": "template_workflow", 3 | "version": 1, 4 | "workflowId": "WORKFLOW_INSTANCE_ID", 5 | "priority": 1, 6 | "correlationId": "testTaskDefTemplate", 7 | "startTime": 1534983505050, 8 | "updateTime": 1534983505131, 9 | "endTime": 0, 10 | "status": "RUNNING", 11 | "input": "{path1=file://path1, path2=file://path2, requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath}" 12 | } 13 | -------------------------------------------------------------------------------- /polyglot-clients/README.md: -------------------------------------------------------------------------------- 1 | # SDKs for other languages 2 | 3 | Language specific client SDKs are maintained at a dedicated [conductor-sdk](https://github.com/conductor-sdk) repository. 4 | 5 | 6 | Check the repository for the latest list, but there are SDK clients for: 7 | 8 | ## SDK List 9 | * [Clojure](https://github.com/conductor-sdk/conductor-clojure) 10 | * [C#](https://github.com/conductor-sdk/conductor-csharp) 11 | * [Go](https://github.com/conductor-sdk/conductor-go) 12 | * [Python](https://github.com/conductor-sdk/conductor-python) 13 | 14 | 15 | ### In progress (PRs encouraged!) 16 | * [JavaScript](https://github.com/conductor-sdk/conductor-javascript) -------------------------------------------------------------------------------- /postgres-external-storage/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-common') 3 | implementation project(':conductor-core') 4 | 5 | compileOnly 'org.springframework.boot:spring-boot-starter' 6 | compileOnly 'org.springframework.boot:spring-boot-starter-web' 7 | 8 | implementation "org.postgresql:postgresql:${revPostgres}" 9 | implementation 'org.springframework.boot:spring-boot-starter-jdbc' 10 | implementation "org.flywaydb:flyway-core:${revFlyway}" 11 | implementation "org.flywaydb:flyway-database-postgresql:${revFlyway}" 12 | 13 | implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:${revSpringDoc}" 14 | implementation "commons-codec:commons-codec:${revCodec}" 15 | 16 | testImplementation 'org.springframework.boot:spring-boot-starter-web' 17 | testImplementation "org.testcontainers:postgresql:${revTestContainer}" 18 | testImplementation project(':conductor-test-util').sourceSets.test.output 19 | 20 | } 21 | -------------------------------------------------------------------------------- /postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueryFunction.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.postgres.util; 14 | 15 | import java.sql.SQLException; 16 | 17 | /** 18 | * Functional interface for {@link Query} executions that return results. 19 | * 20 | * @author mustafa 21 | */ 22 | @FunctionalInterface 23 | public interface QueryFunction { 24 | 25 | R apply(Query query) throws SQLException; 26 | } 27 | -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V10__poll_data_check.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION poll_data_update_check () 2 | RETURNS TRIGGER 3 | AS $$ 4 | BEGIN 5 | IF(NEW.json_data::json ->> 'lastPollTime')::BIGINT < (OLD.json_data::json ->> 'lastPollTime')::BIGINT THEN 6 | RAISE EXCEPTION 'lastPollTime cannot be set to a lower value'; 7 | END IF; 8 | RETURN NEW; 9 | END; 10 | $$ 11 | LANGUAGE plpgsql; 12 | 13 | CREATE TRIGGER poll_data_update_check_trigger BEFORE UPDATE ON poll_data FOR EACH ROW EXECUTE FUNCTION poll_data_update_check (); -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V11__locking.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS locks ( 2 | lock_id VARCHAR PRIMARY KEY, 3 | lease_expiration TIMESTAMP WITH TIME ZONE NOT NULL 4 | ); 5 | -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V12__task_index_columns.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE task_index 2 | ALTER COLUMN task_type TYPE TEXT; 3 | 4 | ALTER TABLE task_index 5 | ALTER COLUMN task_def_name TYPE TEXT; 6 | -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V13.1__workflow_index_columns.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE workflow_index 2 | ADD COLUMN IF NOT EXISTS update_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT TIMESTAMP WITH TIME ZONE 'epoch'; 3 | 4 | -- SET DEFAULT AGAIN IN CASE COLUMN ALREADY EXISTED from deleted V13 migration 5 | ALTER TABLE workflow_index 6 | ALTER COLUMN update_time SET DEFAULT TIMESTAMP WITH TIME ZONE 'epoch'; 7 | -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V2__1009_Fix_PostgresExecutionDAO_Index.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS unique_event_execution; 2 | 3 | CREATE UNIQUE INDEX unique_event_execution ON event_execution (event_handler_name,event_name,execution_id); -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V3__correlation_id_index.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS workflow_corr_id_index; 2 | 3 | CREATE INDEX workflow_corr_id_index ON workflow (correlation_id); -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V4__new_qm_index_with_priority.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS combo_queue_message; 2 | 3 | CREATE INDEX combo_queue_message ON queue_message (queue_name,priority,popped,deliver_on,created_on); -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V5__new_queue_message_pk.sql: -------------------------------------------------------------------------------- 1 | -- no longer need separate index if pk is queue_name, message_id 2 | DROP INDEX IF EXISTS unique_queue_name_message_id; 3 | 4 | -- remove id primary key 5 | ALTER TABLE queue_message DROP CONSTRAINT IF EXISTS queue_message_pkey; 6 | 7 | -- remove id column 8 | ALTER TABLE queue_message DROP COLUMN IF EXISTS id; 9 | 10 | -- set primary key to queue_name, message_id 11 | ALTER TABLE queue_message ADD PRIMARY KEY (queue_name, message_id); 12 | -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres/V7__new_qm_index_desc_priority.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS combo_queue_message; 2 | 3 | CREATE INDEX combo_queue_message ON queue_message USING btree (queue_name , priority desc, popped, deliver_on, created_on) -------------------------------------------------------------------------------- /postgres-persistence/src/main/resources/db/migration_postgres_data/V13.2__workflow_index_backfill_update_time.sql: -------------------------------------------------------------------------------- 1 | -- Optional back-fill script to populate updateTime historically. 2 | UPDATE workflow_index 3 | SET update_time = to_timestamp(json_data->>'updateTime', 'YYYY-MM-DD"T"HH24:MI:SS.MS')::timestamp AT TIME ZONE '00:00' 4 | WHERE json_data->>'updateTime' IS NOT NULL; -------------------------------------------------------------------------------- /postgres-persistence/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | conductor.db.type=postgres 2 | 3 | spring.datasource.url=jdbc:tc:postgresql:11.15-alpine:///conductor 4 | spring.datasource.username=postgres 5 | spring.datasource.password=postgres 6 | spring.datasource.hikari.maximum-pool-size=8 7 | spring.datasource.hikari.auto-commit=false 8 | -------------------------------------------------------------------------------- /redis-concurrency-limit/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'groovy' 3 | } 4 | 5 | dependencies { 6 | compileOnly 'org.springframework.boot:spring-boot-starter' 7 | compileOnly 'org.springframework.data:spring-data-redis' 8 | 9 | implementation project(':conductor-common') 10 | implementation project(':conductor-core') 11 | implementation "redis.clients:jedis:3.6.0" // Jedis version "revJedis=3.3.0" does not play well with Spring Data Redis 12 | implementation "org.apache.commons:commons-lang3" 13 | 14 | testImplementation "org.apache.groovy:groovy-all:${revGroovy}" 15 | testImplementation "org.spockframework:spock-core:${revSpock}" 16 | testImplementation "org.spockframework:spock-spring:${revSpock}" 17 | testImplementation "org.testcontainers:spock:${revTestContainer}" 18 | testImplementation "org.testcontainers:testcontainers:${revTestContainer}" 19 | testImplementation "com.google.protobuf:protobuf-java:${revProtoBuf}" 20 | testImplementation 'org.springframework.data:spring-data-redis:2.7.16' 21 | } 22 | -------------------------------------------------------------------------------- /redis-lock/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(':conductor-core') 3 | compileOnly 'org.springframework.boot:spring-boot-starter' 4 | 5 | implementation "org.apache.commons:commons-lang3" 6 | implementation "org.redisson:redisson:${revRedisson}" 7 | implementation 'org.springframework.boot:spring-boot-starter-actuator' 8 | 9 | testImplementation "org.testcontainers:testcontainers:${revTestContainer}" 10 | } 11 | -------------------------------------------------------------------------------- /redis-lock/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "conductor.redis-lock.server-type", 5 | "defaultValue": "SINGLE" 6 | } 7 | ], 8 | "hints": [ 9 | { 10 | "name": "conductor.workflow-execution-lock.type", 11 | "values": [ 12 | { 13 | "value": "redis", 14 | "description": "Use the redis-lock implementation as the lock provider." 15 | } 16 | ] 17 | }, 18 | { 19 | "name": "conductor.redis-lock.server-type", 20 | "providers": [ 21 | { 22 | "name": "handle-as", 23 | "parameters": { 24 | "target": "java.lang.Enum" 25 | } 26 | } 27 | ] 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs 2 | mkdocs-material 3 | mkdocs-macros-plugin -------------------------------------------------------------------------------- /rest/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | 3 | implementation project(':conductor-common') 4 | implementation project(':conductor-core') 5 | 6 | implementation 'org.springframework.boot:spring-boot-starter-web' 7 | 8 | implementation "com.netflix.runtime:health-api:${revHealth}" 9 | 10 | implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:${revSpringDoc}" 11 | } 12 | -------------------------------------------------------------------------------- /rest/src/main/resources/kitchensink/sub_flow_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sub_flow_1", 3 | "description": "A Simple sub-workflow with 2 tasks", 4 | "version": 1, 5 | "tasks": [ 6 | { 7 | "name": "task_5", 8 | "taskReferenceName": "task_5", 9 | "inputParameters": {}, 10 | "type": "SIMPLE" 11 | }, 12 | { 13 | "name": "task_6", 14 | "taskReferenceName": "task_6", 15 | "type": "SIMPLE" 16 | } 17 | ], 18 | "outputParameters": {}, 19 | "schemaVersion": 2, 20 | "ownerEmail": "example@email.com" 21 | } -------------------------------------------------------------------------------- /rest/src/main/resources/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/rest/src/main/resources/static/favicon.ico -------------------------------------------------------------------------------- /rest/src/main/resources/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/rest/src/main/resources/static/logo.png -------------------------------------------------------------------------------- /server-lite/build_ui.sh: -------------------------------------------------------------------------------- 1 | cd ../ui 2 | pwd 3 | yarn install 4 | yarn build 5 | echo "Done building UI, copying the UI files to server" 6 | cd .. 7 | pwd 8 | rm -rf server-lite/src/main/resources/static 9 | mv ui/build/ server-lite/src/main/resources/static -------------------------------------------------------------------------------- /server-lite/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.driver-class-name=org.sqlite.JDBC 2 | spring.datasource.url=jdbc:sqlite:conductorosstest.db?busy_timeout=15000&journal_mode=WAL 3 | spring.datasource.username= 4 | spring.datasource.password= 5 | spring.datasource.hikari.maximum-pool-size=2 6 | conductor.db.type=sqlite 7 | conductor.queue.type=sqlite 8 | conductor.indexing.type=sqlite 9 | conductor.indexing.enabled=true 10 | conductor.elasticsearch.version=0 11 | management.datadog.metrics.export.enabled=false 12 | conductor.app.workflow.name-validation.enabled=false 13 | conductor.app.ownerEmailMandatory=false -------------------------------------------------------------------------------- /server/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | ______ ______ .__ __. _______ __ __ ______ .___________. ______ .______ 2 | / | / __ \ | \ | | | \ | | | | / || | / __ \ | _ \ 3 | | ,----'| | | | | \| | | .--. || | | | | ,----'`---| |----`| | | | | |_) | 4 | | | | | | | | . ` | | | | || | | | | | | | | | | | | / 5 | | `----.| `--' | | |\ | | '--' || `--' | | `----. | | | `--' | | |\ \----. 6 | \______| \______/ |__| \__| |_______/ \______/ \______| |__| \______/ | _| `._____| 7 | ${application.formatted-version} :::Spring Boot:::${spring-boot.formatted-version} 8 | -------------------------------------------------------------------------------- /sqlite-persistence/src/main/java/com/netflix/conductor/sqlite/util/QueryFunction.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Conductor Authors. 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | *

7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | *

9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | */ 13 | package com.netflix.conductor.sqlite.util; 14 | 15 | import java.sql.SQLException; 16 | 17 | /** 18 | * Functional interface for {@link Query} executions that return results. 19 | * 20 | * @author mustafa 21 | */ 22 | @FunctionalInterface 23 | public interface QueryFunction { 24 | 25 | R apply(Query query) throws SQLException; 26 | } 27 | -------------------------------------------------------------------------------- /sqlite-persistence/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.driver-class-name=org.sqlite.JDBC 2 | spring.datasource.url=jdbc:sqlite:conductorosstest.db 3 | spring.datasource.username= 4 | spring.datasource.password= 5 | # Hibernate SQLite Dialect 6 | spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect 7 | 8 | # db type 9 | conductor.db.type=sqlite -------------------------------------------------------------------------------- /task-status-listener/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'groovy' 3 | } 4 | dependencies { 5 | 6 | implementation project(':conductor-common') 7 | implementation project(':conductor-core') 8 | implementation project(':conductor-redis-persistence') 9 | implementation project(':conductor-annotations') 10 | 11 | implementation group: 'javax.inject', name: 'javax.inject', version: '1' 12 | implementation "org.apache.commons:commons-lang3:" 13 | implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.14' 14 | 15 | compileOnly 'org.springframework.boot:spring-boot-starter' 16 | compileOnly 'org.springframework.boot:spring-boot-starter-web' 17 | 18 | implementation "org.springframework.boot:spring-boot-starter-log4j2" 19 | testImplementation project(':conductor-test-util').sourceSets.test.output 20 | 21 | //In memory 22 | implementation "org.rarefiedredis.redis:redis-java:${revRarefiedRedis}" 23 | 24 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/concurrency_limited_task_workflow_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_concurrency_limits_workflow", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "test_task_with_concurrency_limit", 7 | "taskReferenceName": "test_task_with_concurrency_limit", 8 | "inputParameters": {}, 9 | "type": "SIMPLE", 10 | "decisionCases": {}, 11 | "defaultCase": [], 12 | "forkTasks": [], 13 | "startDelay": 0, 14 | "joinOn": [], 15 | "optional": false, 16 | "defaultExclusiveJoinTask": [], 17 | "asyncComplete": false, 18 | "loopOver": [] 19 | } 20 | ], 21 | "inputParameters": [], 22 | "outputParameters": {}, 23 | "schemaVersion": 2, 24 | "restartable": true, 25 | "workflowStatusListenerEnabled": false, 26 | "timeoutPolicy": "ALERT_ONLY", 27 | "timeoutSeconds": 0, 28 | "ownerEmail": "test@harness.com" 29 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/failure_workflow_for_terminate_task_workflow.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "failure_workflow", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "lambda", 7 | "taskReferenceName": "lambda0", 8 | "inputParameters": { 9 | "input": "${workflow.input}", 10 | "scriptExpression": "if ($.input.a==1){return {testvalue: true}} else{return {testvalue: false}}" 11 | }, 12 | "type": "LAMBDA", 13 | "decisionCases": {}, 14 | "defaultCase": [], 15 | "forkTasks": [], 16 | "startDelay": 0, 17 | "joinOn": [], 18 | "optional": false, 19 | "defaultExclusiveJoinTask": [], 20 | "asyncComplete": false, 21 | "loopOver": [] 22 | } 23 | ], 24 | "inputParameters": [], 25 | "outputParameters": {}, 26 | "schemaVersion": 2, 27 | "restartable": true, 28 | "workflowStatusListenerEnabled": false, 29 | "timeoutPolicy": "ALERT_ONLY", 30 | "timeoutSeconds": 0, 31 | "ownerEmail": "test@harness.com" 32 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/input.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conductor-oss/conductor/c81fefe292295738a5fa7de5269102fde45f80cb/test-harness/src/test/resources/input.json -------------------------------------------------------------------------------- /test-harness/src/test/resources/rate_limited_simple_task_workflow_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_rate_limit_simple_task_workflow", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "test_simple_task_with_rateLimits", 7 | "taskReferenceName": "test_simple_task_with_rateLimits", 8 | "inputParameters": {}, 9 | "type": "SIMPLE", 10 | "decisionCases": {}, 11 | "defaultCase": [], 12 | "forkTasks": [], 13 | "startDelay": 0, 14 | "joinOn": [], 15 | "optional": false, 16 | "defaultExclusiveJoinTask": [], 17 | "asyncComplete": false, 18 | "loopOver": [] 19 | } 20 | ], 21 | "inputParameters": [], 22 | "outputParameters": {}, 23 | "schemaVersion": 2, 24 | "restartable": true, 25 | "workflowStatusListenerEnabled": false, 26 | "timeoutPolicy": "ALERT_ONLY", 27 | "timeoutSeconds": 0, 28 | "ownerEmail": "test@harness.com" 29 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/rate_limited_system_task_workflow_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_rate_limit_system_task_workflow", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "test_task_with_rateLimits", 7 | "taskReferenceName": "test_task_with_rateLimits", 8 | "inputParameters": {}, 9 | "type": "USER_TASK", 10 | "decisionCases": {}, 11 | "defaultCase": [], 12 | "forkTasks": [], 13 | "startDelay": 0, 14 | "joinOn": [], 15 | "optional": false, 16 | "defaultExclusiveJoinTask": [], 17 | "asyncComplete": false, 18 | "loopOver": [] 19 | } 20 | ], 21 | "inputParameters": [], 22 | "outputParameters": {}, 23 | "schemaVersion": 2, 24 | "restartable": true, 25 | "workflowStatusListenerEnabled": false, 26 | "timeoutPolicy": "ALERT_ONLY", 27 | "timeoutSeconds": 0, 28 | "ownerEmail": "test@harness.com" 29 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/simple_json_jq_transform_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_json_jq_transform_wf", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "jq", 7 | "taskReferenceName": "jq_1", 8 | "inputParameters": { 9 | "input": "${workflow.input}", 10 | "queryExpression": ".input as $_ | { out: ($_.in1.array + $_.in2.array) }" 11 | }, 12 | "type": "JSON_JQ_TRANSFORM", 13 | "decisionCases": {}, 14 | "defaultCase": [], 15 | "forkTasks": [], 16 | "startDelay": 0, 17 | "joinOn": [], 18 | "optional": false, 19 | "defaultExclusiveJoinTask": [], 20 | "asyncComplete": false, 21 | "loopOver": [] 22 | } 23 | ], 24 | "inputParameters": [], 25 | "outputParameters": {}, 26 | "schemaVersion": 2, 27 | "restartable": true, 28 | "workflowStatusListenerEnabled": false, 29 | "timeoutPolicy": "ALERT_ONLY", 30 | "timeoutSeconds": 0, 31 | "ownerEmail": "test@harness.com" 32 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/simple_lambda_workflow_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_lambda_wf", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "lambda", 7 | "taskReferenceName": "lambda0", 8 | "inputParameters": { 9 | "input": "${workflow.input}", 10 | "scriptExpression": "if ($.input.a==1){return {testvalue: true}} else{return {testvalue: false} }" 11 | }, 12 | "type": "LAMBDA", 13 | "decisionCases": {}, 14 | "defaultCase": [], 15 | "forkTasks": [], 16 | "startDelay": 0, 17 | "joinOn": [], 18 | "optional": false, 19 | "defaultExclusiveJoinTask": [], 20 | "asyncComplete": false, 21 | "loopOver": [] 22 | } 23 | ], 24 | "inputParameters": [], 25 | "outputParameters": {}, 26 | "schemaVersion": 2, 27 | "restartable": true, 28 | "workflowStatusListenerEnabled": false, 29 | "timeoutPolicy": "ALERT_ONLY", 30 | "timeoutSeconds": 0, 31 | "ownerEmail": "test@harness.com" 32 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/simple_one_task_sub_workflow_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sub_workflow", 3 | "description": "sub_workflow", 4 | "version": 1, 5 | "tasks": [ 6 | { 7 | "name": "simple_task_in_sub_wf", 8 | "taskReferenceName": "t1", 9 | "inputParameters": {}, 10 | "type": "SIMPLE", 11 | "decisionCases": {}, 12 | "defaultCase": [], 13 | "forkTasks": [], 14 | "startDelay": 0, 15 | "joinOn": [], 16 | "optional": false, 17 | "defaultExclusiveJoinTask": [], 18 | "asyncComplete": false, 19 | "loopOver": [] 20 | } 21 | ], 22 | "inputParameters": [], 23 | "outputParameters": {}, 24 | "schemaVersion": 2, 25 | "restartable": true, 26 | "workflowStatusListenerEnabled": false, 27 | "timeoutPolicy": "ALERT_ONLY", 28 | "timeoutSeconds": 0, 29 | "ownerEmail": "test@harness.com" 30 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/simple_set_variable_workflow_integration_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_set_variable_wf", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "set_variable", 7 | "taskReferenceName": "set_variable_1", 8 | "inputParameters": { 9 | "var": "${workflow.input.var}" 10 | }, 11 | "type": "SET_VARIABLE", 12 | "decisionCases": {}, 13 | "defaultCase": [], 14 | "forkTasks": [], 15 | "startDelay": 0, 16 | "joinOn": [], 17 | "optional": false, 18 | "defaultExclusiveJoinTask": [], 19 | "asyncComplete": false, 20 | "loopOver": [] 21 | } 22 | ], 23 | "inputParameters": [], 24 | "outputParameters": { 25 | "variables": "${workflow.variables}" 26 | }, 27 | "schemaVersion": 2, 28 | "restartable": true, 29 | "workflowStatusListenerEnabled": false, 30 | "timeoutPolicy": "ALERT_ONLY", 31 | "timeoutSeconds": 0, 32 | "ownerEmail": "test@harness.com" 33 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/terminate_task_sub_workflow.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test_terminate_task_sub_wf", 3 | "version": 1, 4 | "tasks": [ 5 | { 6 | "name": "integration_task_3", 7 | "taskReferenceName": "t3", 8 | "type": "SIMPLE" 9 | } 10 | ], 11 | "schemaVersion": 2, 12 | "ownerEmail": "test@harness.com" 13 | } -------------------------------------------------------------------------------- /test-harness/src/test/resources/workflow_that_starts_another_workflow.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "workflow_that_starts_another_workflow", 3 | "description": "A workflow that uses START_WORKFLOW task to start another workflow", 4 | "version": 1, 5 | "tasks": [ 6 | { 7 | "name": "start_workflow", 8 | "taskReferenceName": "st", 9 | "inputParameters": { 10 | "startWorkflow": "${workflow.input.startWorkflow}" 11 | }, 12 | "type": "START_WORKFLOW" 13 | } 14 | ], 15 | "inputParameters": ["start_workflow"], 16 | "outputParameters": {}, 17 | "schemaVersion": 2, 18 | "restartable": true, 19 | "workflowStatusListenerEnabled": false, 20 | "timeoutPolicy": "ALERT_ONLY", 21 | "timeoutSeconds": 0, 22 | "ownerEmail": "test@harness.com" 23 | } 24 | -------------------------------------------------------------------------------- /test-harness/src/test/resources/workflow_with_synchronous_system_task.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "workflow_with_synchronous_system_task", 3 | "description": "A workflow with a simple task followed a synchronous task", 4 | "version": 1, 5 | "tasks": [ 6 | { 7 | "name": "integration_task_1", 8 | "taskReferenceName": "t1", 9 | "type": "SIMPLE" 10 | }, 11 | { 12 | "name": "jsonjq", 13 | "taskReferenceName": "jsonjq", 14 | "inputParameters": { 15 | "queryExpression": ".tp2.TEST_SAMPLE | length", 16 | "tp1": "${workflow.input.param1}", 17 | "tp2": "${t1.output.op}" 18 | }, 19 | "type": "JSON_JQ_TRANSFORM" 20 | } 21 | ], 22 | "inputParameters": [], 23 | "outputParameters": { 24 | "data": "${jsonjq.output.resources}" 25 | }, 26 | "schemaVersion": 2, 27 | "restartable": true, 28 | "workflowStatusListenerEnabled": false, 29 | "ownerEmail": "example@email.com", 30 | "timeoutPolicy": "ALERT_ONLY", 31 | "timeoutSeconds": 0, 32 | "variables": {}, 33 | "inputTemplate": {} 34 | } 35 | -------------------------------------------------------------------------------- /ui/.env: -------------------------------------------------------------------------------- 1 | PORT=5000 -------------------------------------------------------------------------------- /ui/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["react-app", "plugin:cypress/recommended"], 3 | "rules": { 4 | "import/no-anonymous-default-export": 0 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | /cypress/screenshots 11 | /cypress/videos 12 | 13 | # production 14 | /build 15 | 16 | # misc 17 | .DS_Store 18 | .env.local 19 | .env.development.local 20 | .env.test.local 21 | .env.production.local 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | -------------------------------------------------------------------------------- /ui/.prettierignore: -------------------------------------------------------------------------------- 1 | build -------------------------------------------------------------------------------- /ui/.prettierrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /ui/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "cypress"; 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | baseUrl: "http://localhost:5000", 6 | }, 7 | 8 | component: { 9 | devServer: { 10 | framework: "create-react-app", 11 | bundler: "webpack", 12 | }, 13 | }, 14 | }); 15 | -------------------------------------------------------------------------------- /ui/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |

11 | 12 | 13 | -------------------------------------------------------------------------------- /ui/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import "./commands"; 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Conductor UI 8 | 9 | 10 | 11 |
12 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /ui/src/components/Banner.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Paper } from "@material-ui/core"; 3 | import { makeStyles } from "@material-ui/styles"; 4 | 5 | const useStyles = makeStyles({ 6 | root: { 7 | padding: 15, 8 | backgroundColor: "rgba(73, 105, 228, 0.1)", 9 | color: "rgba(0, 0, 0, 0.9)", 10 | borderLeft: "solid rgba(73, 105, 228, 0.1) 4px", 11 | }, 12 | }); 13 | 14 | export default function Banner({ children, ...rest }) { 15 | const classes = useStyles(); 16 | 17 | return ( 18 | 25 | {children} 26 | 27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /ui/src/components/Button.jsx: -------------------------------------------------------------------------------- 1 | import { Button as MuiButton } from "@material-ui/core"; 2 | 3 | export default function Button({ variant = "primary", ...props }) { 4 | if (variant === "secondary") { 5 | return ; 6 | } else { 7 | // primary or invalid 8 | return ; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ui/src/components/ButtonGroup.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | FormControl, 4 | InputLabel, 5 | ButtonGroup, 6 | Button, 7 | } from "@material-ui/core"; 8 | 9 | export default function ({ options, label, style, classes, ...props }) { 10 | return ( 11 | 12 | {label && {label}} 13 | 14 | {options.map((option, idx) => ( 15 | 18 | ))} 19 | 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /ui/src/components/ConfirmChoiceDialog.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | Dialog, 4 | DialogActions, 5 | DialogContent, 6 | DialogTitle, 7 | } from "@material-ui/core"; 8 | import Text from "./Text"; 9 | import Button from "./Button"; 10 | 11 | export default function ({ 12 | header = "Confirmation", 13 | message = "Please confirm", 14 | handleConfirmationValue, 15 | open, 16 | }) { 17 | return ( 18 | handleConfirmationValue(false)} 23 | > 24 | {header} 25 | 26 | {message} 27 | 28 | 29 | 30 | 36 | 37 | 38 | ); 39 | } 40 | -------------------------------------------------------------------------------- /ui/src/components/Heading.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Typography from "@material-ui/core/Typography"; 3 | 4 | const levelMap = ["h6", "h5", "h4", "h3", "h2", "h1"]; 5 | 6 | export default function ({ level = 3, ...props }) { 7 | return ; 8 | } 9 | -------------------------------------------------------------------------------- /ui/src/components/LinearProgress.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { makeStyles } from "@material-ui/styles"; 3 | import clsx from "clsx"; 4 | import LinearProgress from "@material-ui/core/LinearProgress"; 5 | 6 | const useStyles = makeStyles({ 7 | progress: { 8 | marginBottom: -4, 9 | zIndex: 999, 10 | }, 11 | }); 12 | 13 | export default function ({ className, ...props }) { 14 | const classes = useStyles(); 15 | 16 | return ( 17 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /ui/src/components/Paper.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { makeStyles } from "@material-ui/styles"; 3 | import clsx from "clsx"; 4 | import Paper from "@material-ui/core/Paper"; 5 | 6 | const useStyles = makeStyles({ 7 | padded: { 8 | padding: 15, 9 | }, 10 | }); 11 | 12 | export default React.forwardRef(function ( 13 | { elevation, className, padded, ...props }, 14 | ref 15 | ) { 16 | const classes = useStyles(); 17 | const internalClassName = []; 18 | if (padded) internalClassName.push(classes.padded); 19 | return ( 20 | 26 | ); 27 | }); 28 | -------------------------------------------------------------------------------- /ui/src/components/Pill.jsx: -------------------------------------------------------------------------------- 1 | import { makeStyles } from "@material-ui/styles"; 2 | import Chip from "@material-ui/core/Chip"; 3 | 4 | const COLORS = { 5 | red: "rgb(229, 9, 20)", 6 | yellow: "rgb(251, 164, 4)", 7 | green: "rgb(65, 185, 87)", 8 | }; 9 | 10 | const useStyles = makeStyles({ 11 | pill: { 12 | borderColor: (props) => COLORS[props.color], 13 | color: (props) => COLORS[props.color], 14 | }, 15 | }); 16 | 17 | export default function Pill({ color, ...props }) { 18 | const classes = useStyles({ color }); 19 | 20 | return ( 21 | 27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /ui/src/components/PrimaryButton.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Button from "@material-ui/core/Button"; 3 | 4 | export default function (props) { 5 | return